设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 14818|回复: 44
打印 上一主题 下一主题

[RMVX发布] 新手教程——计算累计时间Window_(2)

  [复制链接]

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5454
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
跳转到指定楼层
1
发表于 2010-12-6 21:53:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 一箭烂YiJL 于 2011-1-3 17:21 编辑

课序号:2
作者:一箭烂YiJL
出版社:VX教程出版社
售价:完全免费
VX教程出版社的其它教程

上一课:
新手教程——基础


注意:这时教程!请不要讨论它的用途方面,讨论技术即可,
这教程的方法不能非常精确的计算秒数!
(记住!这时只是教程,不是实用脚本!!!)

终于有人能看完和参透整个教程的流程.....


序:
曾经有人提问过怎么计算累计游戏时间,一般那些人都只知道计算总秒数。
虽然这股小小的风波已经解决,但还是教一教吧!
高手请指点,新手可以学习。


我们这次的目标是学习:
1.super让父窗口接收方法。
2.%的符号用法
3.sprintf(格式化字符串)
4.self.contents.draw_text用法(文字显示法)


这个是效果:


先建立一个类(class),在建立两个函数。(建立的类的父窗口是Window_Base)
类的名字定为Window_PlayTime吧!(这个可以自定),
建立两个分别叫做initialize(初始化),update。然后就成为:

  1. class WindowPlayTime < Window_Base
  2.   def initialize
  3.   end
  4.   def update
  5.   end
  6. end
复制代码
不懂这部看上一课。


然后将initializen那函数变成:

  1. #这里经67提点后改正了是w和h
  2. def initialize(x, y, w = 160, h = 90)
  3.   super(x, y, w, h)
  4. end
复制代码
def initialize(x, y, w = 160, h = 90) 这表示了:
建立x、y、w、h四个变数(这种变数只限用于当前的函数),并且w默认是160,h默认是50.
(关于默认参数,之后有机会再说吧~,想知道什么是默认参数看32楼)
而super(x, y, w, h)就是把刚才定义的x, y, w, h返回父窗口Window_Base的initialize。
你会看到Window_Base有:def initialize(x, y, width, height)
这四个变数会根据位置代入父窗口的(x, y, width, height)这四个变数
这是一个简单的表示:
super(x, y, w, h)  =>  initialize(x, y, width, height)
x, y, 160, 90  =>  x, y, width, height
如果不明白的话请看下图:

若还是不懂就一句话,(这里的)super是控制窗口的xy坐标还有高宽。
还是不动就帮不到你了。(懂就最好)


很多人都知道总秒数的计法是:Graphics.frame_count / Graphics.frame_rate # 总帧数/设定的帧频率
@total_sec = Graphics.frame_count / Graphics.frame_rate
因为@total_sec是要不断更新,所以必须放进update这函数里。


现在说的就是一种人们不懂计算时分秒的地方,请在update函数里加建:
  1. sec = @total_sec % 60 #计秒
  2. min = @total_sec / 60 % 60   #计分
  3. hrs = @total_sec / 60 / 60      #计时
复制代码
这种方法不会影响@total_sec的增加,但又不是用秒进分,分进时。
咦?%是什么?有看过流星前辈Scene教程第一弹的人会知道哪儿曾出现过%=
只是有关系的。比如:"@abc %= 4"的意思是把@abc除以四得出来的余数代回@abc,
也可说为当@abc到达4的时候,便归零。
说"sec = @total_sec % 60"就是将@total_sec除以60,把余数代入sec。
举例:sec = 172 % 60
           sec = 52 # 到这不明白吗?min就不说了
hrs是这里的最大单位,所以不用%,让它自动增加。


说到这步,看过流星前辈的window教学的人都知道应该怎吧这几个数字显示出来,不过也说说吧。
  1. playtime = sprintf("%02d:%02d:%02d", hrs, min, sec) # 建立在update函数里
复制代码
sprintf(格式化字符串),后边的hour, min, sec就以顺序的方法,
以每一个%02d来表示于" "之内。一可以这样说吧:
playtime = hrs + ":" + min + ":" + sec # 这只是一个说法,是不能使用的


建立了PlayTime这个变数后,就要显示了,这样(在update里):

  1. self.contents.font.color = normal_color
  2. self.contents.draw_text(x, 30, 126, WLH, playtime, 2)
复制代码
第一句是表示定义绘画文字时候用正常颜色(白色)
第二句就是格式是self.contents.draw_text(x坐标, y坐标, 宽, 高, 显示的变数, 靠左或居中或靠右)
# 0:靠左    1:居中   2:靠右
width和height都没有定,所以所以用预设的。


你还要建立"游戏时间"这个东西,在建立完playtime
  1. time_text = "游戏时间:"
  2. self.contents.draw_text(x, -30, 160, 90, time_text,0)
复制代码
未免留底的问题,要在update的第一行插入:
  1. self.contents.clear # 清除
复制代码
意思就是先清除了,然后建立过,免得留痕。


这时候测试,你发现它会在不够一秒之后才能显示数字(测试方法:用场景,记得要用update)
一开始看到是没有字的,过很短很短的时间就会显示出来了。
这是因为update会在初始化(initialize)之后才运行,所以就会有此情况,
在initialize函数里super的下一行加入:
  1. update
复制代码
就这update?没错,就是在初始化的时候立即进行update函数的动作。


在测试,就没问题了,若有问题对照一下完成的作品:
  1. class WindowPlayTime < Window_Base
  2.   
  3.   def initialize(x, y, w = 160, h = 90)
  4.     super(x, y, w, h)
  5.     update
  6.   end

  7.   def update
  8.     self.contents.clear
  9.     @total_sec = Graphics.frame_count / Graphics.frame_rate
  10.     hrs = @total_sec / 60 / 60
  11.     min = @total_sec / 60 % 60
  12.     sec = @total_sec % 60
  13.     playtime = sprintf("%02d:%02d:%02d", hrs, min, sec)
  14.     self.contents.font.color = normal_color
  15.     self.contents.draw_text(x, 30, 126, WLH, playtime, 2)
  16.     time_text = "游戏时间:"
  17.     self.contents.draw_text(x, -30, 160, 90, time_text,0)
  18.   end
  19. end
复制代码
总结(我们学到了):
1.super让父窗口接收方法。
2.%的符号用法
3.sprintf(格式化字符串)
4.self.contents.draw_text用法(文字显示法)
(若上面的东西一个也不懂就白费了这个教程了!)


好了这节课就到这里!完毕!
看贴请回帖作为教程支持,
我们需要的是教学支持!!


下一课:
新手教程——函数外的变量



补充站(给明白刚才关于super那幅图的同学看的):
其实上面的方法并不是很好的,会比较耗费资源,
所以我们需要在update做一些动作,才执行这么大的动作,总之就是这样,
这样会有程序点儿和节省资源:
  1. class WindowPlayTime < Window_Base
  2.   
  3.   def initialize(x, y, w = 160, h = 90)
  4.     super(x, y, w, h)
  5.     refresh
  6.   end

  7.   def update
  8.     super
  9.     sec = (Graphics.frame_count / Graphics.frame_rate) % 60
  10.     if sec > @total_sec % 60 or sec == 0
  11.       refresh
  12.     end
  13.   end

  14.   def refresh
  15.     self.contents.clear
  16.     @total_sec = Graphics.frame_count / Graphics.frame_rate
  17.     draw_playtime(0, 0, width - 32)
  18.   end

  19.   def draw_playtime(x, y, width)
  20.     hrs = @total_sec / 60 / 60
  21.     min = @total_sec / 60 % 60
  22.     sec = @total_sec % 60
  23.     time_text = "游戏时间:"
  24.     playtime = sprintf("%02d:%02d:%02d", hrs, min, sec)
  25.     self.contents.font.color = normal_color
  26.     self.contents.draw_text(x, -30, width, height, time_text,0)
  27.     self.contents.font.color = normal_color
  28.     self.contents.draw_text(x, 30, width - 2, WLH, playtime, 2)
  29.   end
  30. end
复制代码
这里看不明白就算。

点评

所以也就是说,直接super取代super(x,y,w,h)不好么?  发表于 2012-3-13 16:02
好吧,经过Google以后我知道了……super会调用父类的相同方法。如果不带任何参数(也没有括号), 是自动调用父类中的当前方法, 并且把当前参数传过去…  发表于 2012-3-13 16:00
@obj = Window_PlayTime.new(1,2) 1、2是new(initialize)方法的参数  发表于 2010-12-7 22:05
不在scene里调用吗?  发表于 2010-12-7 10:33

评分

参与人数 5星屑 +314 收起 理由
小鱼子 + 40 加油,继续努力
px.凤翔九天 + 6 鼓励教程,真的学到了
苏小脉 + 6 用心了
DeathKing + 222 继续努力。
冰舞蝶恋 + 40 好好加油~某梦很看好你哟

查看全部评分

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
24 小时
注册时间
2010-12-4
帖子
24
2
发表于 2010-12-6 22:12:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
64 小时
注册时间
2008-10-23
帖子
92
3
发表于 2010-12-6 22:17:20 | 只看该作者
超有爱,但是看不懂:L
用心走过每一天每一分每一秒
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
239
在线时间
2399 小时
注册时间
2008-4-11
帖子
12326

贵宾第6届短篇游戏比赛季军

4
发表于 2010-12-6 22:17:34 | 只看该作者
这脚本比较适合放在什么游戏里面应用呢?
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5454
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
5
 楼主| 发表于 2010-12-6 22:19:53 | 只看该作者
比较建议放在菜单,或者是地图
(放在地图必须调整一下高度和宽度)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
64 小时
注册时间
2008-10-23
帖子
92
6
发表于 2010-12-6 22:20:24 | 只看该作者
回复 逍游 的帖子

不是你失策,我是脚本盲,一点基础也没有,看不懂正常的
用心走过每一天每一分每一秒
回复 支持 反对

使用道具 举报

Lv2.观梦者

花开堪折直须折

梦石
0
星屑
676
在线时间
943 小时
注册时间
2010-7-17
帖子
4963

贵宾

7
发表于 2010-12-6 22:21:22 | 只看该作者
好有爱。大人您的水平早已远远超过某梦了= =
表示目前为止所发的任何脚本都是在原基础上做修改的说
到现在都不知道如何新建一个类。。。。。。。。。。啊啊啊啊
我得去苦读教程了的说。
大家好,我叫节操,有一天,我被吃了。
http://forever-dream.5d6d.com
永恒の梦制作组论坛

129993099
永恒の梦制作组QQ群
回复 支持 反对

使用道具 举报

Lv2.观梦者

铃铃塔的守护者

梦石
0
星屑
626
在线时间
961 小时
注册时间
2010-10-24
帖子
2768

贵宾

8
发表于 2010-12-6 22:34:25 | 只看该作者
不错的教程啊...(虽然有一些不懂(目前已经细读过f1,正买书苦学中...))但是倒是会用了。决定去掉原来的步数窗口塞上这个...
话说流行雪前辈的教程在哪里?给个连接呗。目前正好想学写window—base的子类写法呢。谢了。

魔法麻将独立游戏制作中,欢迎热情的测试员与UI设计师合作开发~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5454
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
9
 楼主| 发表于 2010-12-6 22:46:59 | 只看该作者
本帖最后由 一箭烂YiJL 于 2010-12-16 18:49 编辑

Window_Base的雪流星前辈就没有说(说起来很烦)
http://rpg.blue/forum.php?mod=redirect&goto=findpost&ptid=127177&pid=1449497&fromuid=85435
这是流星前辈的教学

评分

参与人数 1星屑 +6 收起 理由
px.凤翔九天 + 6 感谢

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1175
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

10
发表于 2010-12-6 23:31:12 | 只看该作者
对!说得很详细,解释清楚了super关键字的工作机理。

super是调用父类的同名方法的关键字,并且super能够传递参数。我们在Window_Base中定义好了initialize方法,并且让其他衍生的窗体(诸如WindowPlayTime)继承Window_Base类,这样,当子类的initialize方法执行时,也会执行父类定义的initialize方法。可以理解为“保持行动的统一性(确保创建出来的窗体是风格一致的。)”

另外一个小瑕疵(或许是),是图片的最上部分,@1 = Window_PlayTime(1,2)应该还有一个new方法。

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 12:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表