Project1

标题: 【VX】怎么在NPC头上加1个计时器 [打印本页]

作者: 936586666    时间: 2011-12-16 17:47
标题: 【VX】怎么在NPC头上加1个计时器
本帖最后由 月夜神音 于 2011-12-16 18:34 编辑

我想做一个农场型的游戏我想在菜头上加个计时器,计时器的时间到0后可以显示“可摘取”的字样!
作者: iisnow    时间: 2011-12-17 12:40
本帖最后由 iisnow 于 2011-12-17 13:41 编辑

嗯!这是一个好想法,农场游戏~
然后就写了一个脚本,基本可以实现你要的功能,不过要配合事件实现,于是就发个范例给你吧……
不多说了,效果:

脚本:

  1. $time = {}
  2. code_time = Thread.new{
  3. loop do
  4.   $time.each do |k,v|
  5.     $time[k] = [v - 1,0].max
  6.   end
  7.   sleep 1
  8. end
  9. }


  10. class Game_Event
  11.   attr_accessor :event
  12. end
  13. class Game_Map
  14.   attr_accessor :map_id
  15. end

  16. class Sprite_time < Sprite_Base
  17.   
  18.   def initialize(view_port,ch)
  19.     super(view_port)
  20.     @ch = ch
  21.     @time = $time[[$game_map.map_id,@ch.event.id]]
  22.     @new = true
  23.     self.bitmap = Bitmap.new(64,20)
  24.   end
  25.   
  26.   def clear_self
  27.     if $time[[$game_map.map_id,@ch.event.id]] == 0
  28.       $time.delete([$game_map.map_id,@ch.event.id])
  29.       self.dispose
  30.       return true
  31.     else
  32.       return false
  33.     end
  34.   end
  35.   
  36.   def update
  37.     if @time == nil  
  38.       if @ch.event.name =~ /%(\d{0,2}[,,])?(\d+[,,])(\d+)/
  39.         hou = $1 ? $1.to_i : 0
  40.         min = $2.to_i
  41.         sec = $3.to_i
  42.       end
  43.       $time[[$game_map.map_id,@ch.event.id]] = hou * 3600 + min * 60 + sec
  44.     end
  45.     if @time != $time[[$game_map.map_id,@ch.event.id]] || @new
  46.       @time = $time[[$game_map.map_id,@ch.event.id]]
  47.       @new = false
  48.       if @time != 0
  49.         ho = @time / 3600
  50.         mi = @time / 60 - ho * 60
  51.         se = @time % 60
  52.         string = sprintf("%02d:%02d:%02d", ho,mi,se) if ho >0
  53.         string = sprintf("%02d:%02d", mi,se) if ho == 0
  54.       else
  55.         string = "收获啦~"
  56.       end
  57.       self.bitmap.clear
  58.       self.bitmap.font.size = 14
  59.       self.bitmap.draw_text(0,0,64,20,string,1)
  60.     end
  61.     self.x = @ch.screen_x - 32
  62.     self.y = @ch.screen_y - 50
  63.   end
  64.   
  65. end

  66. class Game_Interpreter
  67.   
  68.   def add_self
  69.     if $time[[$game_map.map_id,@event_id]] == nil
  70.       view_port = Viewport.new(0, 0, 544, 416)
  71.       sprite = Sprite_time.new(view_port,$game_map.events[@event_id])
  72.       $scene.spriteset.character_sprites.push(sprite)
  73.       $scene.spriteset.update
  74.     end
  75.   end
  76.   
  77.   def get_result
  78.     if $time[[$game_map.map_id,@event_id]] > 0
  79.       return false
  80.     elsif $time[[$game_map.map_id,@event_id]] == 0
  81.       $scene.spriteset.clear_time
  82.       return true
  83.     end
  84.   end
  85.   
  86.   alias :iisnow_command_201 :command_201
  87.   def command_201
  88.     $flag = @params[0] == 0 ? @params[1] : $game_variables[@params[1]]
  89.     iisnow_command_201
  90.   end
  91. end

  92.    
  93. class Scene_Map < Scene_Base
  94.   attr_accessor :spriteset
  95.   
  96.   alias :iisnow_start :start
  97.   def start
  98.     $flag = $game_map.map_id
  99.     iisnow_start
  100.   end

  101. end
  102. class Spriteset_Map
  103.   attr_accessor :character_sprites
  104.   
  105.   alias :iisnow_update :update
  106.   def update
  107.     if $flag
  108.     $time.each do |k,v|
  109.       if k[0] == $flag && $flag == $game_map.map_id
  110.         view_port = Viewport.new(0, 0, 544, 416)
  111.         sprite = Sprite_time.new(view_port,$game_map.events[k[1]])
  112.         @character_sprites.push(sprite)
  113.       end
  114.     end
  115.     $flag = nil if $flag == $game_map.map_id
  116.     end
  117.     iisnow_update
  118.   end
  119.   
  120.   def clear_time
  121.     @character_sprites.each do |s|
  122.       c = s.clear_self if s.is_a?(Sprite_time)
  123.       @character_sprites[@character_sprites.index(s)] = nil if c
  124.     end
  125.     @character_sprites.compact!
  126.   end

  127. end
复制代码
然后说说缺点吧:
1.时间的不精确性,就是指精确度为1s小于1s的时间被忽视
2.存档的问题:即存档打开后会有错误,现在我在想办法修改,后面将会改正,就是增加一个文件记录
3.存档期间,游戏的时间会停止运转,即开始游戏蔬菜才会倒计时(估计改正存档以后这个问题可以解决),但是游戏中无论怎么暂停,蔬菜都不会停止生长
附件在下方,注意每个事件的设置方式,以及一定要将事件的优先级调整为“与普通角色相同”
另外时间的名称标识着蔬菜的种植时间格式为:“%x,y,z”
(x指小时,y指分钟,z指秒,其中x和它后面的,可以省略表示时间小于1个小时,x,y,z的值不限大小,但是毕竟希望你设置的合乎情理一点,比如y和z尽量小于60等等……)
iisnow_.rar (240.77 KB, 下载次数: 141)


下面是存档改正:

脚本:

  1. $last = false
  2. $time = {}
  3. code_time = Thread.new{
  4. loop do
  5.   $time.each do |k,v|
  6.     $time[k] = [v - 1,0].max
  7.   end
  8.   sleep 1
  9. end
  10. }


  11. class Game_Event
  12.   attr_accessor :event
  13. end
  14. class Game_Map
  15.   attr_accessor :map_id
  16. end

  17. class Sprite_time < Sprite_Base
  18.   
  19.   def initialize(view_port,ch)
  20.     super(view_port)
  21.     @ch = ch
  22.     @time = $time[[$game_map.map_id,@ch.event.id]]
  23.     @new = true
  24.     self.bitmap = Bitmap.new(64,20)
  25.   end
  26.   
  27.   def clear_self
  28.     if $time[[$game_map.map_id,@ch.event.id]] == 0
  29.       $time.delete([$game_map.map_id,@ch.event.id])
  30.       self.dispose
  31.       return true
  32.     else
  33.       return false
  34.     end
  35.   end
  36.   
  37.   def update
  38.     if @time == nil  
  39.       if @ch.event.name =~ /%(\d{0,2}[,,])?(\d+[,,])(\d+)/
  40.         hou = $1 ? $1.to_i : 0
  41.         min = $2.to_i
  42.         sec = $3.to_i
  43.       end
  44.       $time[[$game_map.map_id,@ch.event.id]] = hou * 3600 + min * 60 + sec
  45.     end
  46.     if @time != $time[[$game_map.map_id,@ch.event.id]] || @new
  47.       @time = $time[[$game_map.map_id,@ch.event.id]]
  48.       @new = false
  49.       if @time != 0
  50.         ho = @time / 3600
  51.         mi = @time / 60 - ho * 60
  52.         se = @time % 60
  53.         string = sprintf("%02d:%02d:%02d", ho,mi,se) if ho >0
  54.         string = sprintf("%02d:%02d", mi,se) if ho == 0
  55.       else
  56.         string = "收获啦~"
  57.       end
  58.       self.bitmap.clear
  59.       self.bitmap.font.size = 14
  60.       self.bitmap.draw_text(0,0,64,20,string,1)
  61.     end
  62.     self.x = @ch.screen_x - 32
  63.     self.y = @ch.screen_y - 50
  64.   end
  65.   
  66. end

  67. class Game_Interpreter
  68.   
  69.   def add_self
  70.     if $time[[$game_map.map_id,@event_id]] == nil
  71.       view_port = Viewport.new(0, 0, 544, 416)
  72.       sprite = Sprite_time.new(view_port,$game_map.events[@event_id])
  73.       $scene.spriteset.character_sprites.push(sprite)
  74.       $scene.spriteset.update
  75.     end
  76.   end
  77.   
  78.   def get_result
  79.     if $time[[$game_map.map_id,@event_id]] > 0
  80.       return false
  81.     elsif $time[[$game_map.map_id,@event_id]] == 0
  82.       $scene.spriteset.clear_time
  83.       return true
  84.     end
  85.   end
  86.   
  87.   alias :iisnow_command_201 :command_201
  88.   def command_201
  89.     $flag = @params[0] == 0 ? @params[1] : $game_variables[@params[1]]
  90.     iisnow_command_201
  91.   end
  92. end

  93.    
  94. class Scene_Map < Scene_Base
  95.   attr_accessor :spriteset
  96.   
  97.   alias :iisnow_start :start
  98.   def start
  99.     $flag = $game_map.map_id
  100.     iisnow_start
  101.   end

  102. end
  103. class Spriteset_Map
  104.   attr_accessor :character_sprites
  105.   
  106.   alias :iisnow_update :update
  107.   def update
  108.     if $flag
  109.     $time.each do |k,v|
  110.       if k[0] == $flag && $flag == $game_map.map_id
  111.         view_port = Viewport.new(0, 0, 544, 416)
  112.         sprite = Sprite_time.new(view_port,$game_map.events[k[1]])
  113.         @character_sprites.push(sprite)
  114.       end
  115.     end
  116.     $flag = nil if $flag == $game_map.map_id
  117.     end
  118.     iisnow_update
  119.   end
  120.   
  121.   def clear_time
  122.     @character_sprites.each do |s|
  123.       c = s.clear_self if s.is_a?(Sprite_time)
  124.       @character_sprites[@character_sprites.index(s)] = nil if c
  125.     end
  126.     @character_sprites.compact!
  127.   end
  128.   
  129. end

  130. class Scene_File
  131.   
  132.   alias :iisnow_write_save_data :write_save_data
  133.   def write_save_data(file)
  134.     iisnow_write_save_data(file)
  135.     Marshal.dump($time,file)
  136.   end
  137.   
  138.   alias :iisnow_read_save_data :read_save_data
  139.   def read_save_data(file)
  140.     iisnow_read_save_data(file)
  141.     $time = Marshal.load(file)
  142.     if $last
  143.       time_last = (Time.now - file.mtime).to_i
  144.       $time.each do |k,v|
  145.         $time[k] = [v - time_last,0].max
  146.       end
  147.     end
  148.   end
  149.   
  150. end

  151.   
  152.   
  153.   
复制代码
改变内容:
使得存档变的可行,并加入了$last变量用于管理持续的时间消耗:
$last = true表示存档以后,显示时间的消耗会反应在游戏中,即存档1个小时后打开,你会发现游戏也过了1个小时;
$last = false表示不进行上述操作,也就是,存档时有x分钟成熟,读档就还有x分钟;
那种你喜欢就手动修改吧
脚本修改后,事件的用法不变
增加115分流:http://115.com/file/clj1zpal
改正后附件: ii_snow_2.rar (240.83 KB, 下载次数: 147)
(这个附件中的脚本,我改了一行Main,就是kill那个进程用的,改不改应该无所谓吧)
作者: 936586666    时间: 2011-12-18 12:21
谢谢了





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1