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

Project1

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

[已经解决] 模拟真实的时间流逝脚本

[复制链接]

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6543
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

跳转到指定楼层
1
发表于 2013-8-30 18:58:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 余烬之中 于 2013-8-31 08:56 编辑

想了想还是加上这样一句:
以下很多废话,各位看官大可直接看向用特大号字体标示的正文部分!伸手党退散,这里没有你们想要的,只有问题和问题。
最近,想在游戏中模拟时间的流逝,比如当前是1234年5月6日7:08,经过一段时间后会增长,伴随昼夜和季节
但是在论坛中搜索不到满足要求的,大多数只有昼夜,可能是我的搜索方式有问题,但是这些已经无关紧要了,因为我决定自己动手,丰衣足食
我知道可以用事件做,但是太麻烦,于是选择脚本{:2_270:}(我没想到这个麻烦!{:2_286:})
废话不多说,一边用其他的脚本参考,一边翻阅系统中原有的脚本,
不得不说,6R的VA版本汉化十分不错,注释都很详细,连F1手册都小部分汉化了!
虽然接触RM没多少天,第一个游戏都有完成,但这并不代表我很残,我只是很珍惜处女作,不能随随便便就没了{:2_262:}
开始写脚本,虽然说从没接触过,但是怎么说我将来攻读计算机的高材生{:2_275:},基本的编程基础还是有点了解
跑题了……

设计思路是通过游戏时长来控制变化,我找了一会,找到了这个:
RUBY 代码复制
  1. $game_system.playtime_s

然后为了熟悉一般的命令,写了一个在菜单中显示游戏时长的脚本(这个就没什么发的必要了{:2_276:})
然后一下午,开始写时间流逝的脚本
中间有很多波折,比如我不知道$game_system.playtime_s返回的是字符串,后来知道了也不知道怎么处理(很幸运误打误撞找到了split)
比如弹次框就有次是类型不匹配string can't be coerced into Fixnum偏偏我还不知道怎么处理,ruby不支持VB中的CInt函数(废话)也不像C中的(int)(废话)用了format但是我好像看不到成效
比如不知道ruby语言的数据类型优先级结果算出来总是带小数点
比如不知道取余怎么办 我只知道MOD是取余\是取余 想了半天用%试了一下 也不知道是不是
突然想到 为什么支持立即窗口?必须要进入游戏才能调试?ORZ(如果有人能告诉我游戏外调试的方法自然更好,需要安装Ruby编译器就算了)
正文
以下是我目前已完成的代码,仅仅在菜单中显示当前的游戏内时间,经过努力已经不会弹框了,但是……
RUBY 代码复制
  1. #==============================================================================
  2. # ■ 模拟真实时间流逝 - By 影 2013.8
  3. #                  V 1.0
  4. # 在设定区进行设定便可以操作这个脚本的功能。
  5. # 本脚本通过游戏时长来进行模拟。
  6. #==============================================================================
  7. module MoVTime
  8.   #============================================================================
  9.   # ■ 设定区A - 基础设定
  10.   #============================================================================
  11.   MoVTimeOn = true
  12.   #MoVTimeOn - 开关
  13.   VTIcon = 234
  14.   #VTIcon - 时间前的图标 设为0则不显示
  15.   Chro = "公元"
  16.   Sta_Year = 2013
  17.   Sta_Month = 8
  18.   Sta_Day = 30
  19.   Sta_Hour = 10
  20.   Sta_Min = 0
  21.   #以上设置游戏起始日期时间
  22.   Sta_WDay = 6
  23.   #Sta_WDay - 游戏起始星期几 0代表星期日
  24.   #============================================================================
  25.   # ■ 设定区A结束
  26.   #============================================================================
  27. end
  28.  
  29. module MoChro
  30.   #============================================================================
  31.   # ■ 设定区B - 高级设定
  32.   #============================================================================
  33.     #AdvMode = false
  34.     #高级模式关闭,如果开启则可以进行闰年、大小月的设定
  35.     #【但是】我还没有完成这部分……所以暂时不可用
  36.     VTSpe = 60
  37.     #VTSpe - 现实中一秒对应游戏多少分钟
  38.     VTYearM = 12
  39.     #VTYearM - 游戏中一年多少月
  40.     VTMonthD = 30
  41.     #VTMonth - 游戏中一月多少天
  42.     VTDayH = 24
  43.     #VTDayH - 游戏中一天几小时
  44.     VTHourM = 60
  45.     #VTHourM - 游戏中一小时几分钟
  46.     VTWeeks = ["周日","周一","周二","周三","周四","周五","周六"]
  47.     #VTWeeks - 设定各星期的称谓,有意向的话也可以把所谓“星期”改为其他的周期
  48.     #比如八天为一个周期
  49.   #============================================================================
  50.   # ■ 设定区B结束
  51.   #============================================================================
  52. end
  53. #==============================================================================
  54. # ■ Window_MoVTime
  55. #------------------------------------------------------------------------------
  56. #  菜单画面中,显示当前游戏内部虚拟时间的窗口
  57. #==============================================================================
  58.  
  59. class Window_MoVTime < Window_Base
  60.   #--------------------------------------------------------------------------
  61.   # ● 初始化对象
  62.   #--------------------------------------------------------------------------
  63.   def initialize
  64.     super(0,0,160,80)
  65.     temp = datetime.split("@")
  66.     date = temp[0]
  67.     time = temp[1]
  68.     if MoVTime::VTIcon != 0
  69.       draw_icon(MoVTime::VTIcon,0,0,enabled = true)
  70.     end
  71.     if MoVTime::Chro != ""
  72.       draw_text(0,0,130,25,MoVTime::Chro + " " + date,2)
  73.     else
  74.       draw_text(0,0,130,25,date,2)
  75.     end
  76.     draw_text(0,30,130,25,time,2)
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 更新画面
  80.   #--------------------------------------------------------------------------
  81.   def update
  82.     contents.clear
  83.     temp = datetime.split("@")
  84.     date = temp[0]
  85.     time = temp[1]
  86.     if MoVTime::VTIcon != 0
  87.       draw_icon(MoVTime::VTIcon,0,0,enabled = true)
  88.     end
  89.     if MoVTime::Chro != ""
  90.       draw_text(0,0,130,25,MoVTime::Chro + " " + date,2)
  91.     else
  92.       draw_text(0,0,130,25,date,2)
  93.     end
  94.     draw_text(0,30,130,25,time,2)
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ● 处理时间
  98.   #--------------------------------------------------------------------------
  99.   def datetime
  100.     st = $game_system.playtime_s
  101.     st2 = 0
  102.     tempM = 0
  103.     temp3 = 0
  104.     temp22 = 0
  105.     temp21 = 0
  106.     temp20 = 0
  107.     dt = ""
  108.     temp1 = st.split(":")
  109.     temp20 = temp1[0].to_i
  110.     temp21 = temp1[1].to_i
  111.     temp22 = temp1[2].to_i
  112.     temp20 = temp20 * (60^2)
  113.     temp21 = temp21 * 60
  114.     temp22 = temp22
  115.     st2 = st2 + temp20 + temp21 + temp22
  116.     tempM = MoChro::VTYearM * MoChro::VTMonthD
  117.     tempM = tempM * MoChro::VTDayH * MoChro::VTHourM
  118.     temp3 = (st2 * MoChro::VTSpe) % tempM
  119.     st2 = st2 - temp3 * tempM
  120.     dt = temp3.to_s + "年"
  121.     tempM = MoChro::VTMonthD * MoChro::VTDayH * MoChro::VTHourM
  122.     temp3 = (st2 * MoChro::VTSpe) % tempM
  123.     st2 = st2 - temp3 * tempM
  124.     dt = dt + temp3.to_s + "月"
  125.     tempM = MoChro::VTDayH * MoChro::VTHourM
  126.     temp3 = (st2 * MoChro::VTSpe) % tempM
  127.     st2 = st2 - temp3 * tempM
  128.     dt = dt + temp3.to_s + "日" + "@"
  129.     #这个@很重要
  130.     tempM = MoChro::VTHourM
  131.     temp3 = (st2 * MoChro::VTSpe) % tempM
  132.     st2 = st2 - temp3 * tempM
  133.     dt = dt + temp3.to_s + ":"
  134.     temp3 = st2 * MoChro::VTSpe
  135.     dt = dt + temp3.to_s
  136.     return dt
  137.   end
  138. end
  139.  
  140. #==============================================================================
  141. # ■ Scene_Menu
  142. #------------------------------------------------------------------------------
  143. #  菜单画面
  144. #==============================================================================
  145.  
  146. class Scene_Menu < Scene_MenuBase
  147.   alias mostart start
  148.   def start
  149.     mostart
  150.     if MoVTime::MoVTimeOn == true
  151.       creat_movtime_window
  152.     end
  153.   end
  154.   def creat_movtime_window
  155.     @movtime = Window_MoVTime.new
  156.     @movtime.x = 0
  157.     @movtime.y = @gold_window.y - 80
  158.     @movtime.width = @gold_window.width
  159.     @movtime.height = 80
  160.   end
  161. end

我相信其他的地方一定没有问题,问题一定在这一段:
RUBY 代码复制
  1. def datetime
  2.     st = $game_system.playtime_s
  3.     st2 = 0
  4.     tempM = 0
  5.     temp3 = 0
  6.     temp22 = 0
  7.     temp21 = 0
  8.     temp20 = 0
  9.     dt = ""
  10.     temp1 = st.split(":")
  11.     temp20 = temp1[0].to_i
  12.     temp21 = temp1[1].to_i
  13.     temp22 = temp1[2].to_i
  14.     temp20 = temp20 * (60^2)
  15.     temp21 = temp21 * 60
  16.     temp22 = temp22
  17.     st2 = st2 + temp20 + temp21 + temp22
  18.     tempM = MoChro::VTYearM * MoChro::VTMonthD
  19.     tempM = tempM * MoChro::VTDayH * MoChro::VTHourM
  20.     temp3 = (st2 * MoChro::VTSpe) % tempM
  21.     st2 = st2 - temp3 * tempM
  22.     dt = temp3.to_s + "年"
  23.     tempM = MoChro::VTMonthD * MoChro::VTDayH * MoChro::VTHourM
  24.     temp3 = (st2 * MoChro::VTSpe) % tempM
  25.     st2 = st2 - temp3 * tempM
  26.     dt = dt + temp3.to_s + "月"
  27.     tempM = MoChro::VTDayH * MoChro::VTHourM
  28.     temp3 = (st2 * MoChro::VTSpe) % tempM
  29.     st2 = st2 - temp3 * tempM
  30.     dt = dt + temp3.to_s + "日" + "@"
  31.     #这个@很重要
  32.     tempM = MoChro::VTHourM
  33.     temp3 = (st2 * MoChro::VTSpe) % tempM
  34.     st2 = st2 - temp3 * tempM
  35.     dt = dt + temp3.to_s + ":"
  36.     temp3 = st2 * MoChro::VTSpe
  37.     dt = dt + temp3.to_s
  38.     return dt
  39.   end

这个算法有问题,我相信它一定有问题
那个temp20 21 22什么的本来准备用数组,但是我不知道ruby怎么预定义数组,总是报错
每次的TempM存储被除数(废话) 把游戏时长换算成秒存储在st2中,然后st2乘以(现实中)一秒所代表的(游戏内)分钟数,再取它除以TempM的余数 就是对应的数字
第一次TempM代表(游戏内) 一年的分钟数 第二次代表(游戏内) 一月 第三次(游戏内)一天 第四次(游戏内)一小时
每次除过之后将已经换算过的从st2中减去
用dt记录年月日@时分,然后再以@为界分割,以便写成两行
结果……………………

图标的覆盖等有时间再改,我现在只想知道
怎么会这样???
另外
如何才能显示定义一个变量为整数型,
我不要带小数点的分钟!!!














最后……
相信,一定会有好心人来帮我的!

评分

参与人数 1星屑 +10 收起 理由
sszny + 10 精品文章

查看全部评分

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
2
发表于 2013-8-30 19:19:36 | 只看该作者
吓尿了=-=
将对象转为整数型是to_i方法 例如: a = "100" ; p a.to_i #=> 100
定义数组实际上方便简单 a=[] 这样a就成了一个不限制成员个数的数组 当然也可以直接定义值 如a=[1,"2",0.3,"啦啦啦",[]......],而且数组不限制类型
然后在下依然看不懂不是自己写的东西orz……
建议阁下翻一翻f1以及http://www.kuqin.com/rubycndocument/man/index.html
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6543
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

3
 楼主| 发表于 2013-8-30 19:24:27 | 只看该作者
无脑之人 发表于 2013-8-30 19:19
吓尿了=-=
将对象转为整数型是to_i方法 例如: a = "100" ; p a.to_i #=> 100
定义数组实际上方便简单 a=[ ...

ruby的数组不限制类型吗(感觉像默认为变体),我一直是VB的思路,先定义后使用……ruby找不到显示定义 反而呵呵了
不过 to_i 方法还是看不懂@.@那个p是什么意思……本人完全吃VB和C的老底,第一反应是指针……

点评

@无脑之人 这样啊...也就是说p不是必要的吧……谢谢(90°鞠躬)!  发表于 2013-8-30 19:34
Ruby不需要定义,直接使用即可  发表于 2013-8-30 19:29
p……在RM里面是弹窗,意思就是说那个表达式的返回值是100,也就是说字符串加一个.to_i就变成了对应整数,浮点数加上.to_i 就变成了整数【舍掉小数  发表于 2013-8-30 19:28
回复 支持 反对

使用道具 举报

Lv1.梦旅人

矿工

梦石
0
星屑
134
在线时间
898 小时
注册时间
2012-10-5
帖子
1535
4
发表于 2013-8-30 19:41:04 | 只看该作者
本帖最后由 876加几 于 2013-8-30 19:48 编辑

Bug:360月?360日?这是不可能的事情。
改一下Max就解决了360月/日的问题。
抱歉,我看不到小数点,请圈出来。
试试分别用一个变量来(例如30为年、31为月、32为日、33为小时、34为分钟)($game_variables[30]、$game_variables[31]、$game_variables[32]、$game_variables[33]、$game_variables[34])来调用,变量不会出现小数点的。
呃,发糖贴好冷清呀!
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6543
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

5
 楼主| 发表于 2013-8-30 19:44:14 | 只看该作者
876加几 发表于 2013-8-30 19:41
Bug:360月?360日?这是不可能的事情。
改一下Max就解决了360月/日的问题。

问题不是这么点……你没发现吗,年月日一直同步……一直同步啊亲!60.60.60 120.120.120 180.180.180 我找不到原因啊{:2_270:}{:2_277:}{:2_279:}{:2_254:}{:2_263:}

点评

分开拿变量,原因是它们各拿一个值来写了。  发表于 2013-8-30 19:47
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6543
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

6
 楼主| 发表于 2013-8-30 20:08:28 | 只看该作者
876加几 发表于 2013-8-30 19:41
Bug:360月?360日?这是不可能的事情。
改一下Max就解决了360月/日的问题。
抱歉,我看不到小数点,请圈出 ...

我用数组把它们分开了 像这样 但是……
  1.   def datetime
  2.     st = $game_system.playtime_s
  3.     tempM = [0,0,0,0]
  4.     temp3 = [0,0,0,0,0]
  5.     temp2 = [0,0,0]
  6.     dt = ""
  7.     st2 = 0
  8.     temp1 = st.split(":")
  9.     for i in 0..2
  10.       temp2[i] = (temp1[i].to_i) * (60 ^ (2-i))
  11.     end
  12.     st2 = temp2[0] + temp2[1] + temp2[2]
  13.     tempM[0] = MoChro::VTYearM * MoChro::VTMonthD
  14.     tempM[0] = tempM[0] * MoChro::VTDayH * MoChro::VTHourM
  15.     temp3[0] = (st2 * MoChro::VTSpe) % tempM[0]
  16.     st2 = st2 - temp3[0] * tempM[0]
  17.     dt = temp3[0].to_s + "年"
  18.     tempM[1] = MoChro::VTMonthD * MoChro::VTDayH * MoChro::VTHourM
  19.     temp3[1] = (st2 * MoChro::VTSpe) % tempM[1]
  20.     st2 = st2 - temp3[1] * tempM[1]
  21.     dt = dt + temp3[1].to_s + "月"
  22.     tempM[2] = MoChro::VTDayH * MoChro::VTHourM
  23.     temp3[2] = (st2 * MoChro::VTSpe) % tempM[2]
  24.     st2 = st2 - temp3[2] * tempM[2]
  25.     dt = dt + temp3[2].to_s + "日" + "@"
  26.     #这个@很重要
  27.     tempM[3] = MoChro::VTHourM
  28.     temp3[3] = (st2 * MoChro::VTSpe) % tempM[3]
  29.     st2 = st2 - temp3[3] * tempM[3]
  30.     dt = dt + temp3[3].to_s + ":"
  31.     temp3[4] = (st2 * MoChro::VTSpe).to_i
  32.     dt = dt + temp3[4].to_s
  33.     return dt
  34.   end
复制代码
一开始还是一样的……到了一定程度以后就不一样了……
但是……从头到尾增量很大,几千年的加……
很遗憾不过……没图……

点评

@876加几 我去用变量吧(我根本不知道怎么用变量啊……)  发表于 2013-8-30 20:22
@876加几 不明白@.@  发表于 2013-8-30 20:20
别忘了搭上一座桥!  发表于 2013-8-30 20:12
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
7
发表于 2013-8-30 20:26:29 | 只看该作者
建议阁下看一下刚才给的参考手册-内部类-Time部分,它是基本自动化的

点评

@.@看晕了怎么办 现在只知道可以尝试利用Time.to_a 或Time.tv_sec?我想我还是先想办法用变量吧  发表于 2013-8-30 20:51
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
22738
在线时间
8625 小时
注册时间
2011-12-31
帖子
3367
8
发表于 2013-8-30 22:33:59 | 只看该作者
本帖最后由 tseyik 于 2013-8-30 22:37 编辑

暦システム
http://blueredzone.com/script/vxace/vxace_koyomisystem.html

点评

十分感谢 拿去参考参考(日文盲表示划词翻译真是个好东西)  发表于 2013-8-31 08:17
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6543
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

9
 楼主| 发表于 2013-8-31 08:55:53 | 只看该作者
好吧,目前的问题已经解决了,一个是在楼上的各位大大的帮助下完成的,另一个果然是我的算法问题
睡了一觉一下子顿悟了
更正后的:
  1.   def datetime
  2.     spt = $game_system.playtime
  3.     svtm = spt * MoChro::VTSpe
  4.     $game_variables[MoVTime::VTYV] = svtm / (MoChro::VTHourM * MoChro::VTDayH * MoChro::VTMonthD * MoChro::VTYearM)
  5.     $game_variables[MoVTime::VTMV] = (svtm / (MoChro::VTHourM * MoChro::VTDayH * MoChro::VTMonthD)) % MoChro::VTYearM
  6.     $game_variables[MoVTime::VTDV] = (svtm / (MoChro::VTHourM * MoChro::VTDayH)) % MoChro::VTMonthD
  7.     $game_variables[MoVTime::VTHV] = (svtm / MoChro::VTHourM) % MoChro::VTDayH
  8.     $game_variables[MoVTime::VTIV] = svtm % MoChro::VTHourM
  9.     dt1 = $game_variables[MoVTime::VTYV].to_s + "年" + $game_variables[MoVTime::VTMV].to_s + "月" + $game_variables[MoVTime::VTDV].to_s + "日"
  10.     dt2 = $game_variables[MoVTime::VTHV].to_s + ":" + $game_variables[MoVTime::VTIV].to_s
  11.     dt = dt1 + "@" + dt2
  12.     return dt
  13.   end
复制代码
虽然这时候我发现有点不符合我的设计初衷……但是细节已经无关紧要了,感谢楼上的各位!(那啥,我就不@了)
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
250 小时
注册时间
2011-8-16
帖子
178
10
发表于 2013-8-31 10:01:18 | 只看该作者
好棒的系统 、支持
——————
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-10-1 21:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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