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

Project1

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

大航海时代昼夜系统 v0.4

 关闭 [复制链接]

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

跳转到指定楼层
1
发表于 2008-7-2 06:00:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
[应求发布]

应对昨天新手区的一个问题

看了下目前站上的日夜系统、时间系统,基本都是设定压缩时间,多少秒代替1小时这样的做法。但是感觉这样有时候时间太长,有时候时间又不够。
觉得大航海2当中的时间系统设定的不错,即在本地图上行走不计算时间,进出场面(如进出酒店、银行)则计算流逝若干时间,从20分钟-40分钟不等。如果什么事也不想做,则直接可以在客店选择休息到第二天早晨。
想了想,这些功能可能用脚本能实现,但是对脚本是小白,站上也没有类似的系统,用纯事件能做到吗?


  大航海时代昼夜系统 v0.4
  
  作者:秀秀
  


  功能:1.地图显示时间
        2.随时间变化 产生昼夜交替(包括黄昏) 房间内不会产生变化
        3.自定义进入某地图会消耗时间
        
  用法:设置模块常量 HOUSE 为房间属性(不会产生色相变化)
  
        设置模块常量 HOUSE_TIME 为消耗时间
        比如 1=>20 代表进入ID为1的地图 消耗时间20分钟
        
        其他设置见脚本开始的其他模块常量
        基本已经注释的非常清楚了

        Time_System.set_time 可以直接获取时间(单位:分钟)
        可用于事件判断
   更新:v0.2
        增加了事件中判断时间         
        可用于某房间(商店)在某时间段才开放
        用法:在事件中插入条件分歧 (下面有截图)
        在第四页脚本中输入:Time_System.kind_of_time(kind) == true
        kind 是时间段种类 比如kind设置为4 就判断是否为酒吧
        具体看脚本开头的kind_of_time(kind)方法 可以自行添加修改

   更新:v0.3
        更新了通过事件脚本功能 Time_System.time = x 来更改时间
        x 为时间 此功能可以实现大航海时代睡觉选择起床时间
        用法见范例或者截图

   更新:v0.4
        新增了一些插件(非大航海用)(菜刀灯笼王的提议)
        1. 时光倒流
        2. 疯狂时钟功能,自定义时间流速。
        3.时间闸门功能,时间流速为之前的几分之一。
        4.时间银行功能,可以把时间存起来,需要的时候提取出来
          这个时候时间停止
        5.双重时间系统(精灵使者的提议)
        
        使用方法
        1.时光倒流
          HOUSE_TIME里面  时间改为负数就可以了 比如 1=> -20
        2.疯狂时钟和时间闸门
          Time_System.time_speed=(x) x就是倍数 默认为1
        3.时间银行  
          Time_System.stop_time    设置为时间停止
          Time_System.start_time   设置为时间恢复运行
        4.双重时间系统
          模块常量 HOUSE_TIME2 设置世界2的 世界消耗   
          Time_System.change_time_world1  还原世界世界
          Time_System.change_time_world2  改变时间世界







---------范例下载-------------------------------------------------------
http://rpg.blue/upload_program/f ... ��v0.4_95597861.rar
------------------------------------------------------------------------
























[脚本部分]


=begin

  大航海时代昼夜系统 v0.4
  
  作者:秀秀
  
  功能:1.地图显示时间
        2.随时间变化 产生昼夜交替 房间内不会产生变化
        3.自定义进入某地图会消耗时间
        
  用法:设置模块常量 HOUSE 为房间属性(不会产生色相变化)
  
        设置模块常量 HOUSE_TIME 为消耗时间
        比如 1=>20 代表进入ID为1的地图 消耗时间20分钟
        
        其他设置见脚本开始的其他模块常量
        基本已经注释的非常清楚了
  
   更新:v0.2
        增加了事件中判断时间         
        可用于某房间(商店)在某时间段才开放
        用法:在事件中插入条件分歧
        在第四页脚本中输入:Time_System.kind_of_time(kind) == true
        kind 是时间段种类 比如kind设置为4 就判断是否为酒吧
        具体看脚本开头的kind_of_time(kind)方法 可以自行添加修改
        
   更新:v0.3
        更新了通过事件脚本功能 Time_System.time = x
        更改时间 x 为时间
        此功能可以实现大航海时代睡觉选择 起床时间
        用法见范例或者截图
        
   更新:v0.4
        新增了一些插件(非大航海用)(菜刀灯笼王的提议)
        1. 时光倒流
        2. 疯狂时钟功能,自定义时间流速。
        3.时间闸门功能,时间流速为之前的几分之一。
        4.时间银行功能,可以把时间存起来,需要的时候提取出来,这个时候时间停止
        5.双重时间系统(精灵使者的提议)
        
        使用方法
        1.时光倒流
          HOUSE_TIME里面  时间改为负数就可以了 比如 1=> -20
        2.疯狂时钟和时间闸门
          Time_System.time_speed=(x) x就是倍数 默认为1
        3.时间银行  
          Time_System.stop_time    设置为时间停止
          Time_System.start_time   设置为时间恢复运行
        4.双重时间系统
          模块常量 HOUSE_TIME2 设置世界2的 世界消耗
          Time_System.change_time_world1  还原世界世界
          Time_System.change_time_world2  改变时间世界
=end     

module Time_System
  
  # 最大时间(分钟)
  MAX = 24 * 60
  
  # 初始时间
  INIT_TIME = 8 * 60
   
  # 窗口信息 x坐标 y坐标 是否在地图上显示
  X = 0
  Y = 0
  VISIBLE = true
  
  # 对应白天 黄昏 夜晚 的色调 自己设置
  DAY = Tone.new(0,0,0,0)
  EVE = Tone.new(-255,-85,68,0)
  DUSK = Tone.new(34,-17,-17,0)
  
  # 天气类型
  @@kind = -1
  
  # 真实时间
  @@time = 0
  
  # 文本
  @@text = ""
  
  # 时间流速(默认1倍速)
  @@time_speed = 1
  
  # 时间停止
  @@stop = false
  
  #保存双重时间(默认初始时间)
  @@time1 = 8 * 60
  @@time2 = 8 * 60
  @@time_world = 1
  
  #时间世界(用于双重时间系统)
  @@time_world = 1
  
  @@proc = Proc.new{ self.start }
  
  # 房间ID的数组(地图) 对应地图ID 不会改变天气色相
  HOUSE = [2,3,4,5,6]
  
  # 各个地图ID消耗时间表
  # 世界1
  HOUSE_TIME = { 1=>20,
                 2=>80,
                 3=>60,
                 4=>80,
                 5=>100,
                 6=>120,
                 }
  # 世界2
  HOUSE_TIME2 = { 1=>10,
                 2=>20,
                 3=>30,
                 4=>40,
                 5=>50,
                 6=>60,
                 }
                 
  # 这里设置几种时间段 用于某房间或者商店何时可以进入  
  def self.kind_of_time(kind)
    case kind
    when 1 #时间段1 上午8点到晚上8点
      if @@time >= 8*60 and @@time < 20*60
        return true
      end  
    when 2 #时间段2 中午12点到晚上6点
      if @@time >= 12*60 and @@time < 18*60
        return true
      end  
    when 3 #时间段3 晚上六点到晚上12点
      if @@time >= 18*60 and @@time < 24*60
        return true
      end  
    when 4#时间段4 (酒吧分2个间段 0:00-6.00 , 20:00-24:00)
      if @@time >= 0*60 and @@time < 6*60
        return true
      end  
      if @@time >= 20*60 and @@time < 24*60
        return true
      end  
    end
  end         
                 
  def self.start
    $game_system.time_window_need_refresh = true
    self.time
    self.change
  end  
                 
  def self.load
    @@time = $game_system.change_time
    @@time_speed = $game_system.time_speed
    @@stop = $game_system.stop
    @@time1 = $game_system.time1
    @@time2 = $game_system.time2
    @@time_world = $game_system.time_world
    self.init_set_text
    self.change
    $game_system.time_window_need_refresh = true
  end
  
  def self.save_time
    $game_system.change_time = @@time
    $game_system.time_speed = @@time_speed
    $game_system.stop = @@stop
    $game_system.time1 = @@time1
    $game_system.time2 = @@time2
    $game_system.time_world = @@time_world
  end
  
  def self.start_time
    @@stop = false
    return
  end
  
  def self.stop_time
    @@stop = true
    return
  end  
  
  def self.stop!
    return @@stop
  end  
   
  def self.time_speed=(speed)
    return (@@time_speed = speed)
  end
   
  def self.change_time_world1
    @@time2 = @@time #保存世界2
    @@time = @@time1
    @@time_world = 1
    return
  end  
  
  def self.change_time_world2
    @@time1 = @@time #保存世界1
    @@time = @@time2
    @@time_world = 2
    return
  end
  
  def self.init_set_text
    @@time = (@@time - MAX) if @@time >= MAX
    hour = @@time / 60
    min = @@time % 60
    @@text = sprintf("%02d:%02d", hour, min)
  end  
  
  def self.time=(time)
    @@time = time * 60
    hour = @@time / 60
    min = @@time % 60
    @@text = sprintf("%02d:%02d", hour, min)
    $game_system.time_window_need_refresh = true
  end  
   
  def self.time
    case @@time_world
     when 1
       time = HOUSE_TIME[$game_map.map_id]
     when 2
       time = HOUSE_TIME2[$game_map.map_id]
    end   
     @@time += (time.to_i * @@time_speed) unless self.stop!
     @@time = (@@time - MAX) if @@time >= MAX
     hour = @@time / 60
     min = @@time % 60
     text = sprintf("%02d:%02d", hour, min)
     case hour
       when 6..15   # 白天
         @@kind = 0
       when 16..20  # 黄昏
         @@kind = 1
       when 21..23  #夜晚
         @@kind = 2
       when 0..5    #夜晚
         @@kind = 3
     end
     @@text = text
     $game_system.time_window_need_refresh = true
  end  
   
  def self.set_text
    return @@text
  end  
   
  def self.set_time
    return @@time
  end
   
  def self.change #改变天气(色相)  
      case @@kind
        when 0
          $game_screen.start_tone_change(DAY,0)
        when 1
          $game_screen.start_tone_change(DUSK,0)
        when 2
          $game_screen.start_tone_change(EVE,0)
        when 3  
          $game_screen.start_tone_change(EVE,0)
      end
      if HOUSE.include?($game_map.map_id)
        $game_screen.start_tone_change(DAY,0)
      end  
  end
   
  def self.start_trace
    Kernel.trace_var :$game_temp.player_transferring,@@proc
  end  
  
  def self.stop_trace
    Kernel.trace_var(:$game_temp.player_transferring,nil)
  end  

end  

class Game_System
  attr_accessor :change_time
  attr_accessor :time_window_need_refresh
  attr_accessor :time_speed
  attr_accessor :stop
  attr_accessor :time1
  attr_accessor :time2
  attr_accessor :time_world
  alias ori_initialize initialize
  def initialize
    ori_initialize
    @change_time = Time_System::INIT_TIME
    @time_window_need_refresh = false
    @time_speed = 1
    @stop = false
    @time1 = 8 * 60
    @time2 = 8 * 60
    @time_world = 1
  end
end  

class Scene_Map
  #--------------------------------------------------------------------------
  # ● 主角的场所移动
  #--------------------------------------------------------------------------
  def transfer_player
    # 清除主角场所移动调试标志
    $game_temp.player_transferring = false
    # 移动目标与现在的地图有差异的情况下
    if $game_map.map_id != $game_temp.player_new_map_id
      # 设置新地图
      $game_map.setup($game_temp.player_new_map_id)
    end
   
    Time_System.start
   
    # 设置主角位置
    $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
    # 设置主角朝向
    case $game_temp.player_new_direction
    when 2  # 下
      $game_player.turn_down
    when 4  # 左
      $game_player.turn_left
    when 6  # 右
      $game_player.turn_right
    when 8  # 上
      $game_player.turn_up
    end
    # 矫正主角姿势
    $game_player.straighten
    # 刷新地图 (执行并行事件)
    $game_map.update
    # 在生成活动块
    @spriteset.dispose
    @spriteset = Spriteset_Map.new
    # 处理过渡中的情况下
    if $game_temp.transition_processing
      # 清除过渡处理中标志
      $game_temp.transition_processing = false
      # 执行过渡
      Graphics.transition(20)
    end
    # 执行地图设置的 BGM、BGS 的自动切换
    $game_map.autoplay
    # 设置画面
    Graphics.frame_reset
    # 刷新输入信息
    Input.update
  end
end

class Game_Map
  attr_reader  :map_id
end  
  
class Scene_Title
  alias ori_command_new_game command_new_game
  def command_new_game
    ori_command_new_game
    Time_System.load
   
  end
end

class Scene_Save < Scene_File
  def on_decision(filename)
    # 演奏存档 SE
    $game_system.se_play($data_system.save_se)
    Time_System.save_time
    # 写入存档数据
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
    # 如果被事件调用
    if $game_temp.save_calling
      # 清除存档调用标志
      $game_temp.save_calling = false
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end
    # 切换到菜单画面
    $scene = Scene_Menu.new(4)
  end
end

class Scene_Load < Scene_File
  def on_decision(filename)
    unless FileTest.exist?(filename)
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    $game_system.se_play($data_system.load_se)
    file = File.open(filename, "rb")
    read_save_data(file)
    file.close
    $game_system.bgm_play($game_system.playing_bgm)
    $game_system.bgs_play($game_system.playing_bgs)
    $game_map.update
    Time_System.load
    $scene = Scene_Map.new
  end
end

class Scene_Map
  alias ori_main main
  def main
    @time_window = Window_Base.new(0,0,100,64)
    @time_window.x = Time_System::X
    @time_window.y = Time_System::Y
    @time_window.opacity = 128
    @time_window.visible = Time_System::VISIBLE
    @time_window.contents = Bitmap.new(64,32)
    $game_system.time_window_need_refresh = true
    ori_main
    @time_window.dispose
  end

  alias ori_update update
  def update
    if $game_system.time_window_need_refresh
      time_window_refresh
    end
    ori_update
  end  
  
  def time_window_refresh
    @time_window.contents.clear
    @time_window.contents.draw_text(0,0,100,32,Time_System.set_text)
    $game_system.time_window_need_refresh = false
  end
end
http://rpg.blue/upload_program/files/hide_xiu_96911465.png

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3304
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

2
发表于 2008-7-2 06:01:20 | 只看该作者
其实除了时间的显示,
的确是用纯事件可以做的……
[LINE]1,#dddddd[/LINE]
话说脚本比较实用,
不过最好提供一种不用WINDONS素材,而是用图片框,这样一来华丽点……{/hx}
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-3-29
帖子
826
3
发表于 2008-7-2 06:22:46 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3304
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

4
发表于 2008-7-2 06:25:14 | 只看该作者
感觉色调有点过了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

5
 楼主| 发表于 2008-7-2 06:25:58 | 只看该作者
Kernel.trace_var

好像不用Kernel. 吧?-


恩 不用的 直接 trace_var 就好了

被你看出来了 呵呵 暂时没用这个方法~ 其实可以用这个的

追踪全局变量嘛~{/hx}

全局变量被改变 执行块~

ruby语法的精妙之处
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-3-29
帖子
826
6
发表于 2008-7-2 06:34:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

7
 楼主| 发表于 2008-7-2 06:39:32 | 只看该作者

感觉色调有点过了……


开头的地方可以自定义{/cy}

# 对应白天 黄昏 夜晚 的色调 自己设置
DAY = Tone.new(0,0,0,0) #白天
EVE = Tone.new(-255,-85,68,0) #夜晚
DUSK = Tone.new(34,-17,-17,0) #黄昏

其实也可以自己多添加几种 如 清晨 正午 深夜。。。。
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

8
 楼主| 发表于 2008-7-2 06:43:59 | 只看该作者
顶层有很多好东西的………例如instance_variable_set、get……

~~~~~~~
返回初始化变量数组~{/qiang}

ruby真的非常好 哪里想要哪些东西,总能找到一条好的语句传递~
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
6 小时
注册时间
2008-6-15
帖子
112
9
发表于 2008-7-2 07:19:27 | 只看该作者
嘿嘿,谢谢谢谢{/se}
---------------------------
测试了一下,发现了些问题:
白天、黄昏和夜晚的色调变化只在主角起始位置的那张地图上有效。
我的地图是这样的:
1号图:海滨街道
2号图:小镇
3号图:酒馆
4号图:协会
游戏一开始是从海滨街道开始的,穿越各个地图之间时间流逝完全按脚本的设定流逝了,问题是除了一开始的海滨街道那张地图会按时间显示昼夜色调变化之外,到了小镇上就没有效果了,3、4号本身是室内图所以无变化,但是小镇这个室外场景一样也没有了变化。

还有想请教个问题:
如何在设置事件的时候判断目前的游戏时间?


回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

10
 楼主| 发表于 2008-7-2 20:54:52 | 只看该作者


测试了一下,发现了些问题:
白天、黄昏和夜晚的色调变化只在主角起始位置的那张地图上有效。
我的地图是这样的:
1号图:海滨街道
2号图:小镇
3号图:酒馆
4号图:协会
游戏一开始是从海滨街道开始的,穿越各个地图之间时间流逝完全按脚本的设定流逝了,问题是除了一开始的海滨街道那张地图会按时间显示昼夜色调变化之外,到了小镇上就没有效果了,3、4号本身是室内图所以无变化,但是小镇这个室外场景一样也没有了变化。


# 房间ID的数组(地图) 对应地图ID 不会改变天气色相
HOUSE = [2,3,4,5,6]
这里设置的是 房间属性 就是不会发生变化的

你的2号地图是小镇 在房间属性内 当然不会发生变化了

ID不在里面的 就会发生变化 比如地图 1
地图7,8,9 等 应该都会变化的





http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-28 15:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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