赞 | 0 |
VIP | 8 |
好人卡 | 27 |
积分 | 55 |
经验 | 41413 |
最后登录 | 2012-10-21 |
在线时间 | 833 小时 |
Lv4.逐梦者 弓箭手?剑兰
- 梦石
- 0
- 星屑
- 5529
- 在线时间
- 833 小时
- 注册时间
- 2010-11-17
- 帖子
- 1140
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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。然后就成为:
- class WindowPlayTime < Window_Base
- def initialize
- end
- def update
- end
- end
复制代码 不懂这部看上一课。
然后将initializen那函数变成:
- #这里经67提点后改正了是w和h
- def initialize(x, y, w = 160, h = 90)
- super(x, y, w, h)
- 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函数里加建:- sec = @total_sec % 60 #计秒
- min = @total_sec / 60 % 60 #计分
- 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教学的人都知道应该怎吧这几个数字显示出来,不过也说说吧。- playtime = sprintf("%02d:%02d:%02d", hrs, min, sec) # 建立在update函数里
复制代码 sprintf(格式化字符串),后边的hour, min, sec就以顺序的方法,
以每一个%02d来表示于" "之内。一可以这样说吧:
playtime = hrs + ":" + min + ":" + sec # 这只是一个说法,是不能使用的
建立了PlayTime这个变数后,就要显示了,这样(在update里):
- self.contents.font.color = normal_color
- self.contents.draw_text(x, 30, 126, WLH, playtime, 2)
复制代码 第一句是表示定义绘画文字时候用正常颜色(白色)
第二句就是格式是self.contents.draw_text(x坐标, y坐标, 宽, 高, 显示的变数, 靠左或居中或靠右)
# 0:靠左 1:居中 2:靠右
width和height都没有定,所以所以用预设的。
你还要建立"游戏时间"这个东西,在建立完playtime- time_text = "游戏时间:"
- self.contents.draw_text(x, -30, 160, 90, time_text,0)
复制代码 未免留底的问题,要在update的第一行插入:意思就是先清除了,然后建立过,免得留痕。
这时候测试,你发现它会在不够一秒之后才能显示数字(测试方法:用场景,记得要用update)
一开始看到是没有字的,过很短很短的时间就会显示出来了。
这是因为update会在初始化(initialize)之后才运行,所以就会有此情况,
在initialize函数里super的下一行加入:就这update?没错,就是在初始化的时候立即进行update函数的动作。
在测试,就没问题了,若有问题对照一下完成的作品:- class WindowPlayTime < Window_Base
-
- def initialize(x, y, w = 160, h = 90)
- super(x, y, w, h)
- update
- end
- def update
- self.contents.clear
- @total_sec = Graphics.frame_count / Graphics.frame_rate
- hrs = @total_sec / 60 / 60
- min = @total_sec / 60 % 60
- sec = @total_sec % 60
- playtime = sprintf("%02d:%02d:%02d", hrs, min, sec)
- self.contents.font.color = normal_color
- self.contents.draw_text(x, 30, 126, WLH, playtime, 2)
- time_text = "游戏时间:"
- self.contents.draw_text(x, -30, 160, 90, time_text,0)
- end
- end
复制代码 总结(我们学到了):
1.super让父窗口接收方法。
2.%的符号用法
3.sprintf(格式化字符串)
4.self.contents.draw_text用法(文字显示法)
(若上面的东西一个也不懂就白费了这个教程了!)
好了这节课就到这里!完毕!
看贴请回帖作为教程支持,
我们需要的是教学支持!!
下一课:
新手教程——函数外的变量
补充站(给明白刚才关于super那幅图的同学看的):
其实上面的方法并不是很好的,会比较耗费资源,
所以我们需要在update做一些动作,才执行这么大的动作,总之就是这样,
这样会有程序点儿和节省资源:- class WindowPlayTime < Window_Base
-
- def initialize(x, y, w = 160, h = 90)
- super(x, y, w, h)
- refresh
- end
- def update
- super
- sec = (Graphics.frame_count / Graphics.frame_rate) % 60
- if sec > @total_sec % 60 or sec == 0
- refresh
- end
- end
- def refresh
- self.contents.clear
- @total_sec = Graphics.frame_count / Graphics.frame_rate
- draw_playtime(0, 0, width - 32)
- end
- def draw_playtime(x, y, width)
- hrs = @total_sec / 60 / 60
- min = @total_sec / 60 % 60
- sec = @total_sec % 60
- time_text = "游戏时间:"
- playtime = sprintf("%02d:%02d:%02d", hrs, min, sec)
- self.contents.font.color = normal_color
- self.contents.draw_text(x, -30, width, height, time_text,0)
- self.contents.font.color = normal_color
- self.contents.draw_text(x, 30, width - 2, WLH, playtime, 2)
- end
- end
复制代码 这里看不明白就算。 |
评分
-
查看全部评分
|