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

Project1

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

[已经过期] 蕾米莉亚 修改过的 简易时间脚本 的睡眠问题和窗口问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
211 小时
注册时间
2010-12-30
帖子
85
跳转到指定楼层
1
发表于 2011-12-2 08:47:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最下面是   蕾米莉亚  修改过的   简易时间脚本

改变的是: 把时间变为 古代时间, 原始版本时间都只能是近现代的
可以和   地图坐标及地图名显示 兼容



问题:
现在突然想 用那个 睡眠的 功能,发现使用$game_system.sleep_time 后 出现 第201行发生了NoMethodError
undefined method +' for nil : NilClass

睡眠功能不能用了。如果修改呢??


还有两个疑问:1. 这个脚本是否有让时间快速流失的功能, 比如我现在需要从 200年1月1日变成200年 1月5日,
如果 通过脚本指令变化呢??

2.  可否 隐藏时间 窗口??或者通过一个 开关 实现隐藏 ,开启的效果。因为有时候 需要暂时让 时间窗口消失一下
  1. #===============================================================================
  2. # ■ 简易时间系统
  3. #-------------------------------------------------------------------------------
  4. #    脚本说明及使用方法
  5. #   
  6. #-------------------------------------------------------------------------------
  7. #    更新作者: 蕾米莉亚•斯卡雷特
  8. #    许可协议: NCP NAM STS
  9. #    项目版本: 1.0.20110309
  10. #    引用网址:
  11. #-------------------------------------------------------------------------------
  12. #    - 3.0.20110316  By 蕾米莉亚•斯卡雷特
  13. #      * 重写核心.
  14. #      * 改写 alias 定义, 提高兼容性.
  15. #    - 3.1.20110316  By 蕾米莉亚•斯卡雷特
  16. #      * 优化 Remilia_Time 类计算方式.
  17. #    - 3.2.20110317  By 蕾米莉亚•斯卡雷特
  18. #      * 优化 Remilia_Time 类部分方法.
  19. #      * 添加 Remilia_Time 类部分方法以兼容 Time 类
  20. #      * 修改原脚本遗留下来的部分问题.
  21. #
  22. #===============================================================================
  23. $fscript = {} if $fscript == nil
  24. $fscript["Remilia Time"] = "3.2.20110317"

  25. #-------------------------------------------------------------------------------
  26. # ▼ 通用配置模块
  27. #-------------------------------------------------------------------------------
  28. module FSL
  29.   module Time_byz
  30.   #--------------初始化定义---------------
  31.   #  起始时间 [秒,分,时,日,月,  年, 星期]
  32.   INIT_TIME = [00,00,00,02,02,590]
  33.   #--------------时间格式定义-------------
  34.   # 时间流失方式
  35.   # true.. 按帧数的倍数流失;false.. 按现实时间流失
  36.   TIME_MODULE = true
  37.   #---------------速度定义----------------
  38.   # 流失速度(越大速度越慢)
  39.   TIME_SPEED = 60
  40.   # 流失速度单位
  41.   # 1..时;2..分;3..秒;4..日
  42.   TIME_UNIT = 3
  43.   
  44.   #---------------事件定义----------------
  45.   TIME_EVENT = {
  46.     # 事件的起始条件就是时间,但是时间的格式要与起始时间的相同。
  47.     # 事件使用的是 公共事件,为了避免使用太多的公共事件,所以增加变量操作,
  48.     # 以便于在相同的公共事件里可以使用条件分歧。
  49.     # [秒,分,时,日,月,  年] => [变量ID,变量改变后的值,公共事件ID],
  50.       [10,00,00,02,02,212] => [4, 1, 100],
  51.   }  # 这个不要去掉
  52.   
  53.   #---------------窗口定义----------------
  54.   WINDOW_X = 0
  55.   WINDOW_Y = 0
  56.   
  57.   #-------------睡眠时间定义----------------
  58.   # 小时
  59.   SLEEP_TIME_HOUR = 8
  60.   # 分
  61.   SLEEP_TIME_MIN = 0
  62.   # 秒
  63.   SLEEP_TIME_SEC = 0
  64. =begin

  65.   ---------------------------------------
  66.              时间间隔的判断
  67.   ---------------------------------------
  68.   1. 首先需要先定义一个计时器
  69.     $game_system.set_byz_timer(id)
  70.     其中的 id 可以是任何数字,字符串。
  71.   2. 然后在需要计算时间间隔的地方使用 条件分歧 里的脚本, 里面可以写上
  72.     $game_system.after_time(id) > 5
  73.     这里的 id 要和定义的时候一致。 这个的意思是 时间经过 5秒后.....
  74.    
  75. =end
  76. end
  77. end

  78. class Remilia_Time
  79.   #--------------------------------------------------------------------------
  80.   # ● 常量定义
  81.   #--------------------------------------------------------------------------  
  82.   BIG_MON = [1, 3, 5, 7, 8, 10, 12]
  83.   SMALL_MON = [4, 6, 9, 11]
  84.   WDAY_VOCAB = [nil, "一", "二", "三", "四", "五", "六", "日"]
  85.   WDAY = 6
  86.   SEC = 5
  87.   MIN = 4
  88.   HOUR = 3
  89.   DAY = 2
  90.   MON = 1
  91.   YEAR = 0
  92.   #--------------------------------------------------------------------------
  93.   # ● 初始化
  94.   #--------------------------------------------------------------------------  
  95.   def initialize(year, mon, day, hour, min, sec, wday)
  96.     set_time(year, mon, day, hour, min, sec, wday)
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 接口
  100.   #--------------------------------------------------------------------------  
  101.   def sec;  @time[SEC];   end
  102.   def min;  @time[MIN];   end
  103.   def hour; @time[HOUR];  end
  104.   def mday; @time[DAY];   end
  105.   def mon;  @time[MON];   end
  106.   def wday; @time[WDAY];  end
  107.   def year; @time[YEAR];  end
  108.   #--------------------------------------------------------------------------
  109.   # ● 调整
  110.   #--------------------------------------------------------------------------
  111.   def to_a
  112.     [@time[SEC], @time[MIN], @time[HOUR], @time[DAY], @time[MON], @time[YEAR]]
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 设定时间
  116.   #--------------------------------------------------------------------------  
  117.   def set_time(year, mon, day, hour, min, sec, wday)
  118.     @time = [year, mon, day, hour, min, sec, wday]
  119.     improve
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● 重定义 +
  123.   #--------------------------------------------------------------------------  
  124.   def +(number)
  125.     add_time(number, SEC)
  126.     return self
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 类型转换
  130.   #--------------------------------------------------------------------------  
  131.   def to_time
  132.     return Time.local(@time[YEAR], @time[MON], @time[DAY], @time[HOUR], @time[MIN], @time[SEC])
  133.   end
  134.   #--------------------------------------------------------------------------
  135.   # ● 复制
  136.   #--------------------------------------------------------------------------  
  137.   def clone
  138.     return Remilia_Time.new(@time[YEAR], @time[MON], @time[DAY], @time[HOUR], @time[MIN], @time[SEC], @time[WDAY])
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● 重定义 -
  142.   #--------------------------------------------------------------------------  
  143.   def -(time)
  144.     min_year = self.year >= time.year ? time.year : self.year
  145.     gap = min_year < 1980 ? (1980 - min_year) : 0
  146.     save_time1 = self.clone
  147.     save_time1.add_time(gap, YEAR)
  148.     save_time = time.clone
  149.     save_time.add_time(gap, YEAR)
  150.     return save_time1.to_time - save_time.to_time
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ● 增加时间
  154.   #--------------------------------------------------------------------------  
  155.   def add_time(number, type)
  156.     @time[type] += number
  157.     improve
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ● 判断闰年
  161.   #--------------------------------------------------------------------------
  162.   def leap_year?
  163.     year = @time[YEAR]
  164.     return (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0))
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● 计算该月的总天数
  168.   #--------------------------------------------------------------------------
  169.   def total_day
  170.     day = 0
  171.     if SMALL_MON.include?(@time[MON])
  172.       day = 30
  173.     elsif BIG_MON.include?(@time[MON])
  174.       day = 31
  175.     elsif @time[MON] == 2 and leap_year?
  176.       day = 29
  177.     else
  178.       day = 28
  179.     end
  180.     return day
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 调整时间
  184.   #--------------------------------------------------------------------------
  185.   def improve
  186.     if @time[SEC] >= 60
  187.       @time[MIN] += @time[SEC] / 60
  188.       @time[SEC] %= 60
  189.     end
  190.     if @time[MIN] >= 60
  191.       @time[HOUR] += @time[MIN] / 60
  192.       @time[MIN] %= 60
  193.     end
  194.     if @time[HOUR] >= 24
  195.       n = @time[HOUR] / 24
  196.       @time[HOUR] %= 24
  197.       @time[DAY] += n
  198.       @time[WDAY] = (@time[WDAY] + n) % 7
  199.     end
  200.     while @time[DAY] > 28
  201.       day = total_day
  202.       if @time[DAY] > day
  203.         @time[DAY] -= day
  204.         @time[MON] += 1
  205.       end
  206.     end
  207.     if @time[MON] > 12
  208.       @time[MON] -= 12
  209.       @time[YEAR] += 1
  210.     end
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   # ● 格式化时间
  214.   #--------------------------------------------------------------------------
  215.   def strftime(format)
  216.     format_time = format.clone
  217.     format_time.gsub!(/%Y/i) do |s|
  218.       s = @time[YEAR].to_s
  219.     end
  220.     format_time.gsub!(/%(|\d\d)M/i) do |s|
  221.       s = $1 ? sprintf("%#{$1}d", @time[MON]) : @time[MON].to_s
  222.     end
  223.     format_time.gsub!(/%(|\d\d)D/i) do |s|
  224.       s = $1 ? sprintf("%#{$1}d", @time[DAY]) : @time[DAY].to_s
  225.     end
  226.     format_time.gsub!(/%(|\d\d)H/i) do |s|
  227.       s = $1 ? sprintf("%#{$1}d", @time[HOUR]) : @time[HOUR].to_s
  228.     end
  229.     format_time.gsub!(/%(|\d\d)MI/i) do |s|
  230.       s = $1 ? sprintf("%#{$1}d", @time[MIN]) : @time[MIN].to_s
  231.     end
  232.     format_time.gsub!(/%(|\d\d)S/i) do |s|
  233.       s = $1 ? sprintf("%#{$1}d", @time[SEC]) : @time[SEC].to_s
  234.     end
  235.     format_time.gsub!(/%X/i) do |s|
  236.       s = sprintf("%02d:%02d:%02d", @time[HOUR], @time[MIN], @time[SEC])
  237.     end
  238.     format_time.gsub!(/%W/i) do |s|
  239.       s = "星期#{WDAY_VOCAB[@time[WDAY] + 1]}"
  240.     end
  241.     return format_time
  242.   end
  243. end

  244.    

  245. #==============================================================================
  246. # ■ Game_System
  247. #------------------------------------------------------------------------------
  248. #  处理系统附属数据的类。也可执行诸如交通工具、 BGM 等管理之类的功能。
  249. # 本类的实例请参考$game_system 。
  250. #==============================================================================

  251. class Game_System
  252.   include FSL
  253.   #--------------------------------------------------------------------------
  254.   # ● 定义实例变量
  255.   #--------------------------------------------------------------------------  
  256.   attr_accessor :time_now
  257.   attr_accessor :byz_timer
  258.   attr_accessor :run_time
  259.   #--------------------------------------------------------------------------
  260.   # ● 初始化对像
  261.   #--------------------------------------------------------------------------  
  262.   alias old_initialize initialize
  263.   def initialize
  264.     if Time_byz::TIME_MODULE
  265.       wday = Time_byz::INIT_TIME[6];
  266.       year = Time_byz::INIT_TIME[5];
  267.       mon  = Time_byz::INIT_TIME[4];
  268.       day  = Time_byz::INIT_TIME[3];
  269.       hour = Time_byz::INIT_TIME[2];
  270.       min  = Time_byz::INIT_TIME[1];
  271.       sec  = Time_byz::INIT_TIME[0];
  272.       @time_now = Remilia_Time.new(year, mon, day, hour, min, sec, wday);
  273.     else
  274.       @time_now = Time.new;
  275.     end
  276.     @byz_timer = {};
  277.     @run_time = true;
  278.     old_initialize
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ● 增加时间
  282.   #--------------------------------------------------------------------------  
  283.   def add_time(unit)
  284.     case unit
  285.     when 4
  286.       @time_now += 3600 * 24;
  287.     when 3
  288.       @time_now += 1;
  289.     when 2
  290.       @time_now += 60;
  291.     when 1
  292.       @time_now += 3600;
  293.     end
  294.   end
  295.   #--------------------------------------------------------------------------
  296.   # ● 设定时间计时器
  297.   #--------------------------------------------------------------------------  
  298.   def set_byz_timer(id)
  299.     @byz_timer[id] = @time_now.clone;
  300.   end
  301.   #--------------------------------------------------------------------------
  302.   # ● 计算时间 (秒数)
  303.   #--------------------------------------------------------------------------
  304.   def after_time(id)
  305.     return 0 if @byz_timer[id] == nil;
  306.     return @time_now - @byz_timer[id];
  307.   end
  308.   #--------------------------------------------------------------------------
  309.   # ● 返回时间[秒,分,时,日,月, 年, 星期]
  310.   #--------------------------------------------------------------------------  
  311.   def return_time(type, array_time)
  312.     logo = 6;
  313.     now_time = [];
  314.     loop do
  315.       counts_the_power = type /(10 ** logo);
  316.       type %= 10 ** logo;
  317.       if counts_the_power == 1;
  318.         case logo
  319.         when 6
  320.           times = @time_now.sec;
  321.         when 5
  322.           times = @time_now.min;
  323.         when 4
  324.           times = @time_now.hour;
  325.         when 3
  326.           times = @time_now.mday;
  327.         when 2
  328.           times = @time_now.mon;
  329.         when 1
  330.           times = @time_now.year;
  331.         when 0
  332.           times = @time_now.wday;
  333.         end
  334.         now_time.push(times);
  335.       end
  336.       logo -= 1;
  337.       break if logo < 0;
  338.     end
  339.     return now_time == array_time;
  340.   end
  341.   #--------------------------------------------------------------------------
  342.   # ● 时间跳跃 1..时;2..分;3..秒
  343.   #--------------------------------------------------------------------------
  344.   def bound_times(type, number)
  345.     case type
  346.     when 3
  347.       @time_now += number;
  348.     when 2
  349.       @time_now += 60 * number;
  350.     when 1
  351.       @time_now += 3600 * number;
  352.     end
  353.   end
  354.   #--------------------------------------------------------------------------
  355.   # ● 睡眠
  356.   #--------------------------------------------------------------------------  
  357.   def sleep_time
  358.     hour = Time_byz::SLEEP_TIME_HOUR % 24;
  359.     min = Time_byz::SLEEP_TIME_MIN % 60;
  360.     sec = Time_byz::SLEEP_TIME_SEC % 60;
  361.     @time_now += 3600 * 24;
  362.     year = @time_now.year
  363.     mon  = @time_now.mon
  364.     day  = @time_now.mday
  365.     wday = @time_now.wday
  366.     if Time_byz::TIME_MODULE
  367.       @time_now = Remilia_Time.new(year, mon, day, hour, min, sec, wday)
  368.     else
  369.       @time_now = Time.local(year, mon, day, hour, min, sec)
  370.     end
  371.   end
  372.   
  373. end
  374. #==============================================================================
  375. # ■ Window_Byz_Time
  376. #------------------------------------------------------------------------------
  377. #  调试画面、个别显示开关及变量的窗口。
  378. #==============================================================================

  379. class Window_Byz_Time < Window_Base
  380.   include FSL
  381.   #--------------------------------------------------------------------------
  382.   # ● 初始化对像
  383.   #     x      : 窗口 X 座标
  384.   #     y      : 窗口 Y 座标
  385.   #--------------------------------------------------------------------------
  386.   def initialize(x, y)
  387.     super(x, y, 170, 87);
  388.     if Time_byz::TIME_MODULE
  389.       @time_speed = Time_byz::TIME_SPEED;
  390.     else
  391.       @time_speed = 60;
  392.     end
  393.     @time = @time_speed - 1;
  394.     refresh;
  395.   end
  396.   #--------------------------------------------------------------------------
  397.   # ● 刷新
  398.   #--------------------------------------------------------------------------
  399.   def refresh
  400.     return unless $game_system.run_time;
  401.     @time += 1;
  402.     if @time_speed == @time;
  403.       $game_system.add_time(Time_byz::TIME_UNIT);
  404.       draw_time($game_system.time_now);
  405.       event_run;
  406.       @time = 0;
  407.     end
  408.   end
  409.   #--------------------------------------------------------------------------
  410.   # ● 描绘
  411.   #--------------------------------------------------------------------------
  412.   def draw_time(time)
  413.     self.contents.clear;
  414.     text = $game_system.time_now.strftime("%X")
  415.     self.contents.draw_text(0, 0, 105, WLH, text, 2);
  416.     text = $game_system.time_now.strftime("%Y年%m月%d日");
  417.     self.contents.draw_text(0, 32, 170, WLH, text);
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # ● 启动事件
  421.   #--------------------------------------------------------------------------
  422.   def event_run
  423.     array = ($game_system.time_now.to_a)[0,6];
  424.     if Time_byz::TIME_EVENT[array] != nil
  425.       unless !$scene.is_a?(Scene_Map) or $game_message.visible or $game_temp.in_battle
  426.         variables_id     = Time_byz::TIME_EVENT[array][0];
  427.         variables_number = Time_byz::TIME_EVENT[array][1];
  428.         commonevent_id   = Time_byz::TIME_EVENT[array][2];
  429.         $game_variables[variables_id] = variables_number;
  430.         $game_temp.common_event_id = commonevent_id;
  431.       end
  432.     end
  433.   end
  434. end
  435. #==============================================================================
  436. # ■ Scene_Map
  437. #------------------------------------------------------------------------------
  438. #  处理地图画面的类。
  439. #==============================================================================

  440. class Scene_Map < Scene_Base
  441.   include FSL
  442.   alias :remilia_time_start :start
  443.   #--------------------------------------------------------------------------
  444.   # ● 开始处理
  445.   #--------------------------------------------------------------------------
  446.   def start
  447.     remilia_time_start;
  448.     @time_window = Window_Byz_Time.new(Time_byz::WINDOW_X, Time_byz::WINDOW_Y);
  449.   end
  450.   alias remilia_time_terminate terminate
  451.   #--------------------------------------------------------------------------
  452.   # ● 结束处理
  453.   #--------------------------------------------------------------------------
  454.   def terminate
  455.     remilia_time_terminate;
  456.     @time_window.dispose;
  457.   end
  458.   alias remilia_time_update update
  459.   #--------------------------------------------------------------------------
  460.   # ● 更新画面
  461.   #--------------------------------------------------------------------------
  462.   def update
  463.     remilia_time_update;
  464.     @time_window.refresh;
  465.   end
  466. end

  467.    
复制代码
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-28 22:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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