| 
 
| 赞 | 61 |  
| VIP | 321 |  
| 好人卡 | 140 |  
| 积分 | 64 |  
| 经验 | 179075 |  
| 最后登录 | 2025-2-24 |  
| 在线时间 | 1275 小时 |  
 Lv4.逐梦者 (版主) 百合控 
	梦石0 星屑6448 在线时间1275 小时注册时间2013-8-21帖子3657 
 | 
| 
本帖最后由 余烬之中 于 2013-8-31 08:56 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 想了想还是加上这样一句:
 以下很多废话,各位看官大可直接看向用特大号字体标示的正文部分!伸手党退散,这里没有你们想要的,只有问题和问题。
 最近,想在游戏中模拟时间的流逝,比如当前是1234年5月6日7:08,经过一段时间后会增长,伴随昼夜和季节,
 但是在论坛中搜索不到满足要求的,大多数只有昼夜,可能是我的搜索方式有问题,但是这些已经无关紧要了,因为我决定自己动手,丰衣足食
 我知道可以用事件做,但是太麻烦,于是选择脚本{:2_270:}(我没想到这个更麻烦!{:2_286:})
 废话不多说,一边用其他的脚本参考,一边翻阅系统中原有的脚本,
 不得不说,6R的VA版本汉化十分不错,注释都很详细,连F1手册都小部分汉化了!
 虽然接触RM没多少天,第一个游戏都没有完成,但这并不代表我很残,我只是很珍惜处女作,不能随随便便就没了{:2_262:}
 开始写脚本,虽然说从没接触过,但是怎么说我将来也会是要攻读计算机的高材生{:2_275:},基本的编程基础还是有点了解的
 跑题了……
  
 设计思路是通过游戏时长来控制变化,我找了一会,找到了这个:
 
 然后为了熟悉一般的命令,写了一个在菜单中显示游戏时长的脚本(这个就没什么发的必要了{:2_276:})
 然后一下午,开始写时间流逝的脚本
 中间有很多波折,比如我不知道$game_system.playtime_s返回的是字符串,后来知道了也不知道怎么处理(很幸运误打误撞找到了split)
 比如弹十次框就有九次是类型不匹配string can't be coerced into Fixnum偏偏我还不知道怎么处理,ruby不支持VB中的CInt函数(废话)也不像C中的(int)(废话)用了format但是我好像看不到成效
 比如不知道ruby语言的数据类型优先级结果算出来总是带小数点
 比如不知道取余怎么办 我只知道MOD是取余\是取余 想了半天用%试了一下 也不知道是不是
 突然想到 为什么不支持立即窗口?必须要进入游戏才能调试?ORZ(如果有人能告诉我游戏外调试的方法自然更好,需要安装Ruby编译器就算了)
 正文
 以下是我目前已完成的代码,仅仅在菜单中显示当前的游戏内时间,经过努力已经不会弹框了,但是……
 
 #==============================================================================# ■ 模拟真实时间流逝 - By 影 2013.8#                  V 1.0# 在设定区进行设定便可以操作这个脚本的功能。# 本脚本通过游戏时长来进行模拟。#==============================================================================module MoVTime  #============================================================================  # ■ 设定区A - 基础设定  #============================================================================  MoVTimeOn = true  #MoVTimeOn - 开关  VTIcon = 234  #VTIcon - 时间前的图标 设为0则不显示  Chro = "公元"  Sta_Year = 2013  Sta_Month = 8  Sta_Day = 30  Sta_Hour = 10  Sta_Min = 0  #以上设置游戏起始日期时间  Sta_WDay = 6  #Sta_WDay - 游戏起始星期几 0代表星期日  #============================================================================  # ■ 设定区A结束  #============================================================================end module MoChro  #============================================================================  # ■ 设定区B - 高级设定  #============================================================================    #AdvMode = false    #高级模式关闭,如果开启则可以进行闰年、大小月的设定    #【但是】我还没有完成这部分……所以暂时不可用    VTSpe = 60    #VTSpe - 现实中一秒对应游戏多少分钟    VTYearM = 12    #VTYearM - 游戏中一年多少月    VTMonthD = 30    #VTMonth - 游戏中一月多少天    VTDayH = 24    #VTDayH - 游戏中一天几小时    VTHourM = 60    #VTHourM - 游戏中一小时几分钟    VTWeeks = ["周日","周一","周二","周三","周四","周五","周六"]    #VTWeeks - 设定各星期的称谓,有意向的话也可以把所谓“星期”改为其他的周期    #比如八天为一个周期  #============================================================================  # ■ 设定区B结束  #============================================================================end#==============================================================================# ■ Window_MoVTime#------------------------------------------------------------------------------#  菜单画面中,显示当前游戏内部虚拟时间的窗口#============================================================================== class Window_MoVTime < Window_Base  #--------------------------------------------------------------------------  # ● 初始化对象  #--------------------------------------------------------------------------  def initialize    super(0,0,160,80)    temp = datetime.split("@")    date = temp[0]    time = temp[1]    if MoVTime::VTIcon != 0      draw_icon(MoVTime::VTIcon,0,0,enabled = true)    end    if MoVTime::Chro != ""      draw_text(0,0,130,25,MoVTime::Chro + " " + date,2)    else      draw_text(0,0,130,25,date,2)    end    draw_text(0,30,130,25,time,2)  end  #--------------------------------------------------------------------------  # ● 更新画面  #--------------------------------------------------------------------------  def update    contents.clear    temp = datetime.split("@")    date = temp[0]    time = temp[1]    if MoVTime::VTIcon != 0      draw_icon(MoVTime::VTIcon,0,0,enabled = true)    end    if MoVTime::Chro != ""      draw_text(0,0,130,25,MoVTime::Chro + " " + date,2)    else      draw_text(0,0,130,25,date,2)    end    draw_text(0,30,130,25,time,2)  end  #--------------------------------------------------------------------------  # ● 处理时间  #--------------------------------------------------------------------------  def datetime    st = $game_system.playtime_s    st2 = 0    tempM = 0    temp3 = 0    temp22 = 0    temp21 = 0    temp20 = 0    dt = ""    temp1 = st.split(":")    temp20 = temp1[0].to_i    temp21 = temp1[1].to_i    temp22 = temp1[2].to_i    temp20 = temp20 * (60^2)    temp21 = temp21 * 60    temp22 = temp22    st2 = st2 + temp20 + temp21 + temp22    tempM = MoChro::VTYearM * MoChro::VTMonthD    tempM = tempM * MoChro::VTDayH * MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = temp3.to_s + "年"    tempM = MoChro::VTMonthD * MoChro::VTDayH * MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = dt + temp3.to_s + "月"    tempM = MoChro::VTDayH * MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = dt + temp3.to_s + "日" + "@"    #这个@很重要    tempM = MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = dt + temp3.to_s + ":"    temp3 = st2 * MoChro::VTSpe    dt = dt + temp3.to_s    return dt  endend #==============================================================================# ■ Scene_Menu#------------------------------------------------------------------------------#  菜单画面#============================================================================== class Scene_Menu < Scene_MenuBase  alias mostart start  def start    mostart    if MoVTime::MoVTimeOn == true      creat_movtime_window    end  end  def creat_movtime_window    @movtime = Window_MoVTime.new    @movtime.x = 0    @movtime.y = @gold_window.y - 80    @movtime.width = @gold_window.width    @movtime.height = 80  endend
#============================================================================== 
# ■ 模拟真实时间流逝 - By 影 2013.8 
#                  V 1.0 
# 在设定区进行设定便可以操作这个脚本的功能。 
# 本脚本通过游戏时长来进行模拟。 
#============================================================================== 
module MoVTime 
  #============================================================================ 
  # ■ 设定区A - 基础设定 
  #============================================================================ 
  MoVTimeOn = true 
  #MoVTimeOn - 开关 
  VTIcon = 234 
  #VTIcon - 时间前的图标 设为0则不显示 
  Chro = "公元" 
  Sta_Year = 2013 
  Sta_Month = 8 
  Sta_Day = 30 
  Sta_Hour = 10 
  Sta_Min = 0 
  #以上设置游戏起始日期时间 
  Sta_WDay = 6 
  #Sta_WDay - 游戏起始星期几 0代表星期日 
  #============================================================================ 
  # ■ 设定区A结束 
  #============================================================================ 
end 
  
module MoChro 
  #============================================================================ 
  # ■ 设定区B - 高级设定 
  #============================================================================ 
    #AdvMode = false 
    #高级模式关闭,如果开启则可以进行闰年、大小月的设定 
    #【但是】我还没有完成这部分……所以暂时不可用 
    VTSpe = 60 
    #VTSpe - 现实中一秒对应游戏多少分钟 
    VTYearM = 12 
    #VTYearM - 游戏中一年多少月 
    VTMonthD = 30 
    #VTMonth - 游戏中一月多少天 
    VTDayH = 24 
    #VTDayH - 游戏中一天几小时 
    VTHourM = 60 
    #VTHourM - 游戏中一小时几分钟 
    VTWeeks = ["周日","周一","周二","周三","周四","周五","周六"] 
    #VTWeeks - 设定各星期的称谓,有意向的话也可以把所谓“星期”改为其他的周期 
    #比如八天为一个周期 
  #============================================================================ 
  # ■ 设定区B结束 
  #============================================================================ 
end 
#============================================================================== 
# ■ Window_MoVTime 
#------------------------------------------------------------------------------ 
#  菜单画面中,显示当前游戏内部虚拟时间的窗口 
#============================================================================== 
  
class Window_MoVTime < Window_Base 
  #-------------------------------------------------------------------------- 
  # ● 初始化对象 
  #-------------------------------------------------------------------------- 
  def initialize 
    super(0,0,160,80) 
    temp = datetime.split("@") 
    date = temp[0] 
    time = temp[1] 
    if MoVTime::VTIcon != 0 
      draw_icon(MoVTime::VTIcon,0,0,enabled = true) 
    end 
    if MoVTime::Chro != "" 
      draw_text(0,0,130,25,MoVTime::Chro + " " + date,2) 
    else 
      draw_text(0,0,130,25,date,2) 
    end 
    draw_text(0,30,130,25,time,2) 
  end 
  #-------------------------------------------------------------------------- 
  # ● 更新画面 
  #-------------------------------------------------------------------------- 
  def update 
    contents.clear 
    temp = datetime.split("@") 
    date = temp[0] 
    time = temp[1] 
    if MoVTime::VTIcon != 0 
      draw_icon(MoVTime::VTIcon,0,0,enabled = true) 
    end 
    if MoVTime::Chro != "" 
      draw_text(0,0,130,25,MoVTime::Chro + " " + date,2) 
    else 
      draw_text(0,0,130,25,date,2) 
    end 
    draw_text(0,30,130,25,time,2) 
  end 
  #-------------------------------------------------------------------------- 
  # ● 处理时间 
  #-------------------------------------------------------------------------- 
  def datetime 
    st = $game_system.playtime_s 
    st2 = 0 
    tempM = 0 
    temp3 = 0 
    temp22 = 0 
    temp21 = 0 
    temp20 = 0 
    dt = "" 
    temp1 = st.split(":") 
    temp20 = temp1[0].to_i 
    temp21 = temp1[1].to_i 
    temp22 = temp1[2].to_i 
    temp20 = temp20 * (60^2) 
    temp21 = temp21 * 60 
    temp22 = temp22 
    st2 = st2 + temp20 + temp21 + temp22 
    tempM = MoChro::VTYearM * MoChro::VTMonthD 
    tempM = tempM * MoChro::VTDayH * MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = temp3.to_s + "年" 
    tempM = MoChro::VTMonthD * MoChro::VTDayH * MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = dt + temp3.to_s + "月" 
    tempM = MoChro::VTDayH * MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = dt + temp3.to_s + "日" + "@" 
    #这个@很重要 
    tempM = MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = dt + temp3.to_s + ":" 
    temp3 = st2 * MoChro::VTSpe 
    dt = dt + temp3.to_s 
    return dt 
  end 
end 
  
#============================================================================== 
# ■ Scene_Menu 
#------------------------------------------------------------------------------ 
#  菜单画面 
#============================================================================== 
  
class Scene_Menu < Scene_MenuBase 
  alias mostart start 
  def start 
    mostart 
    if MoVTime::MoVTimeOn == true 
      creat_movtime_window 
    end 
  end 
  def creat_movtime_window 
    @movtime = Window_MoVTime.new 
    @movtime.x = 0 
    @movtime.y = @gold_window.y - 80 
    @movtime.width = @gold_window.width 
    @movtime.height = 80 
  end 
end 
我相信其他的地方一定没有问题,问题一定在这一段:
 
 def datetime    st = $game_system.playtime_s    st2 = 0    tempM = 0    temp3 = 0    temp22 = 0    temp21 = 0    temp20 = 0    dt = ""    temp1 = st.split(":")    temp20 = temp1[0].to_i    temp21 = temp1[1].to_i    temp22 = temp1[2].to_i    temp20 = temp20 * (60^2)    temp21 = temp21 * 60    temp22 = temp22    st2 = st2 + temp20 + temp21 + temp22    tempM = MoChro::VTYearM * MoChro::VTMonthD    tempM = tempM * MoChro::VTDayH * MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = temp3.to_s + "年"    tempM = MoChro::VTMonthD * MoChro::VTDayH * MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = dt + temp3.to_s + "月"    tempM = MoChro::VTDayH * MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = dt + temp3.to_s + "日" + "@"    #这个@很重要    tempM = MoChro::VTHourM    temp3 = (st2 * MoChro::VTSpe) % tempM    st2 = st2 - temp3 * tempM    dt = dt + temp3.to_s + ":"    temp3 = st2 * MoChro::VTSpe    dt = dt + temp3.to_s    return dt  end
def datetime 
    st = $game_system.playtime_s 
    st2 = 0 
    tempM = 0 
    temp3 = 0 
    temp22 = 0 
    temp21 = 0 
    temp20 = 0 
    dt = "" 
    temp1 = st.split(":") 
    temp20 = temp1[0].to_i 
    temp21 = temp1[1].to_i 
    temp22 = temp1[2].to_i 
    temp20 = temp20 * (60^2) 
    temp21 = temp21 * 60 
    temp22 = temp22 
    st2 = st2 + temp20 + temp21 + temp22 
    tempM = MoChro::VTYearM * MoChro::VTMonthD 
    tempM = tempM * MoChro::VTDayH * MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = temp3.to_s + "年" 
    tempM = MoChro::VTMonthD * MoChro::VTDayH * MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = dt + temp3.to_s + "月" 
    tempM = MoChro::VTDayH * MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = dt + temp3.to_s + "日" + "@" 
    #这个@很重要 
    tempM = MoChro::VTHourM 
    temp3 = (st2 * MoChro::VTSpe) % tempM 
    st2 = st2 - temp3 * tempM 
    dt = dt + temp3.to_s + ":" 
    temp3 = st2 * MoChro::VTSpe 
    dt = dt + temp3.to_s 
    return dt 
  end 
这个算法有问题,我相信它一定有问题
 那个temp20 21 22什么的本来准备用数组,但是我不知道ruby怎么预定义数组,总是报错
 每次的TempM存储被除数(废话) 把游戏时长换算成秒存储在st2中,然后st2乘以(现实中)一秒所代表的(游戏内)分钟数,再取它除以TempM的余数 就是对应的数字
 第一次TempM代表(游戏内) 一年的分钟数 第二次代表(游戏内) 一月 第三次(游戏内)一天 第四次(游戏内)一小时
 每次除过之后将已经换算过的从st2中减去
 用dt记录年月日@时分,然后再以@为界分割,以便写成两行
 结果……………………
 
       图标的覆盖等有时间再改,我现在只想知道
 怎么会这样???
 另外
 如何才能显示定义一个变量为整数型,
 我不要带小数点的分钟!!!
    
 
 
 
 
 
 
 
 
 
 
 
 
 
 最后……
 我相信,一定会有好心人来帮我的!
 
 | 
 评分
查看全部评分
 |