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

Project1

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

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

  [复制链接]

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
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
在线时间
5 小时
注册时间
2013-5-15
帖子
5
44
发表于 2013-5-15 21:59:33 | 只看该作者
怎么在地图显示游戏时间
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
354
在线时间
1036 小时
注册时间
2011-5-19
帖子
2098
43
发表于 2011-6-12 14:44:19 | 只看该作者
那个。。。。。。
刚才卡了,还以为没发,一不小心发了两次,请楼主果断把我最后两个帖子删了。
最后表示:真对不起。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
354
在线时间
1036 小时
注册时间
2011-5-19
帖子
2098
42
发表于 2011-6-12 14:40:09 | 只看该作者
看了1,2的来支持下,本人也是脚本盲,现在已经有点头晕了,但还是努力去看下一课。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
354
在线时间
1036 小时
注册时间
2011-5-19
帖子
2098
41
发表于 2011-6-12 14:34:12 | 只看该作者
本帖最后由 MSQ 于 2011-6-12 14:47 编辑

    看了1,2的来支持下,本人也是脚本盲,现在已经有点头晕了,但还是努力去看下一课。
    话说第三课在哪?
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
40
 楼主| 发表于 2011-5-12 20:51:51 | 只看该作者
回复 selintt 的帖子

B键是Esc, X。
L键是Q。
R键是W。
可在游戏窗按F1(如不行就按Ctrl+F1)
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
33 小时
注册时间
2011-4-28
帖子
20
39
发表于 2011-5-11 19:39:06 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
176 小时
注册时间
2011-4-20
帖子
156
38
发表于 2011-5-11 19:08:25 | 只看该作者
好吧。。。。。本来想学的,但是看带各种符号。。。各种复杂、的东西。。。。。果断放弃拉,不解释!~~~~~~哎!
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
37
 楼主| 发表于 2011-5-11 17:21:01 | 只看该作者
回复 selintt 的帖子

1.通常写在场景的initialize中。但是也可以写在事件脚本中,
不过是一次而已,然后就必须弄个并行处理的事件来@1.update。(刷新窗口的意思)

2.建立了 @1 实例后就可以用@1.update,dispose(释放)同理,
释放时将实例消灭的通用实例方法。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-24 00:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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