Project1

标题: 还是脚本的问题(已经解决,谢谢6、11、16楼了) [打印本页]

作者: wwwcctvty    时间: 2013-5-5 21:00
标题: 还是脚本的问题(已经解决,谢谢6、11、16楼了)
本帖最后由 wwwcctvty 于 2013-5-10 22:13 编辑

RUBY 代码复制
  1. def update
  2.     if (Time.now).sec % 20 == 0
  3.       恢复
  4.      end
  5.   end
  6.   def 恢复
  7.     for i in 0...$game_party.bsize
  8.       actor = $game_party.actors[i]
  9.       if actor.hp < actor.maxhp
  10.         actor.hp += 1
  11.       end
  12.     end
  13.   end

请教下大大们。这样写错了没有?怎么现在20秒恢复的hp不是一点,有时是十几点,有时二十几点…………
{:2_263:}
目的:希望在地图上能够每几分钟回复1点HP
作者: q86332682    时间: 2013-5-5 22:23
在哪里调用的,还有你那个$game_party.bsize写错了,应该是$game_party.size吧。
作者: wwwcctvty    时间: 2013-5-5 22:40
q86332682 发表于 2013-5-5 22:23 在哪里调用的,还有你那个$game_party.bsize写错了,应该是$game_party.size吧。

bsize是我定义的方法.在地图刷新中调用这里.已经能够调用了.只是回复的hp不是加1.而是加了十几二十.
作者: q86332682    时间: 2013-5-5 23:32
wwwcctvty 发表于 2013-5-5 22:40
bsize是我定义的方法.在地图刷新中调用这里.已经能够调用了.只是回复的hp不是加1.而是加了十几二十. ...

把你写的方法以及调用的地方全部发出来。
作者: wwwcctvty    时间: 2013-5-6 12:00
q86332682 发表于 2013-5-5 23:32
把你写的方法以及调用的地方全部发出来。

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_PlayTime
  3. #------------------------------------------------------------------------------
  4. #  菜单画面显示游戏时间的窗口。
  5. #==============================================================================
  6.  
  7. class Window_PlayTime < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super(0, 0, 210, 120)
  13.     self.contents = Bitmap.new(width - 32, height - 32)
  14.     self.contents.font.size = 17
  15.     self.contents.font.color = Color.new(0,0,0,255)
  16.     self.z = 300
  17.     self.opacity = 0
  18.     refresh
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 刷新
  22.   #--------------------------------------------------------------------------
  23.   def refresh
  24.     self.contents.clear
  25.     time = Time.now
  26.     text = time.strftime("%x   %X")
  27.     self.contents.draw_text(0,18,130,32,text,1)
  28.     @total_sec = Graphics.frame_count / Graphics.frame_rate
  29.     hour = @total_sec / 60 / 60
  30.     min = @total_sec / 60 % 60
  31.     sec = @total_sec % 60
  32.     text = sprintf("%02d:%02d:%02d", hour, min, sec)
  33.     self.contents.draw_text(4, 0, 160, 32, "日期与游戏时间")
  34.     self.contents.draw_text(0, 36, 130, 32, text, 1)
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 刷新画面
  38.   #--------------------------------------------------------------------------
  39.   def update
  40.     super
  41.     if Graphics.frame_count / Graphics.frame_rate != @total_sec
  42.       refresh
  43.     end
  44.     if @total_sec % 300 == 0
  45.       恢复
  46.     end
  47.   end
  48.   def 恢复
  49.     for i in 0...$game_party.size
  50.       actor = $game_party.actors[i]
  51.       if actor.hp <= actor.maxhp
  52.         actor.hp += 1
  53.       end
  54.     end
  55.   end
  56. end
  57. #==============================================================================
  58. # ■ Scene_Map
  59. #------------------------------------------------------------------------------
  60. #  处理地图画面的类。
  61. #==============================================================================
  62.  
  63. class Scene_Map
  64.   #--------------------------------------------------------------------------
  65.   # ● 主处理
  66.   #--------------------------------------------------------------------------
  67.   def main
  68.     # 生成活动块
  69.     @spriteset = Spriteset_Map.new
  70.     # 生成信息窗口
  71.     @message_window = Window_Message.new
  72.     #######################################
  73.     @tiem = Window_PlayTime.new
  74.     #######################################
  75.     # 执行过渡
  76.     Graphics.transition
  77.     # 主循环
  78.     loop do
  79.       # 刷新游戏画面
  80.       Graphics.update
  81.       # 刷新输入信息
  82.       Input.update
  83.       # 刷新画面
  84.       update
  85.       # 如果画面切换的话就中断循环
  86.       if $scene != self
  87.         break
  88.       end
  89.     end
  90.     # 准备过渡
  91.     Graphics.freeze
  92.     # 释放活动块
  93.     @spriteset.dispose
  94.     ############################
  95.     @tiem.dispose
  96.     #################################
  97.     # 释放信息窗口
  98.     @message_window.dispose
  99.     # 标题画面切换中的情况下
  100.     if $scene.is_a?(Scene_Title)
  101.       # 淡入淡出画面
  102.       Graphics.transition
  103.       Graphics.freeze
  104.     end
  105.   end
  106.   #--------------------------------------------------------------------------
  107.   # ● 刷新画面
  108.   #--------------------------------------------------------------------------
  109.   def update
  110.     ##################################
  111.     @tiem.update
  112.     ######################################
  113.     # 循环
  114.     loop do
  115.       # 按照地图、实例、主角的顺序刷新
  116.       # (本更新顺序不会在满足事件的执行条件下成为给予角色瞬间移动
  117.       #  的机会的重要因素)
  118.       $game_map.update
  119.       $game_system.map_interpreter.update
  120.       $game_player.update
  121.       # 系统 (计时器)、画面刷新
  122.       $game_system.update
  123.       $game_screen.update
  124.       # 如果主角在场所移动中就中断循环
  125.       unless $game_temp.player_transferring
  126.         break
  127.       end
  128.       # 执行场所移动
  129.       transfer_player
  130.       # 处理过渡中的情况下、中断循环
  131.       if $game_temp.transition_processing
  132.         break
  133.       end
  134.     end
  135.     # 刷新活动块
  136.     @spriteset.update
  137.     # 刷新信息窗口
  138.     @message_window.update
  139.     # 游戏结束的情况下
  140.     if $game_temp.gameover
  141.       # 切换的游戏结束画面
  142.       $scene = Scene_Gameover.new
  143.       return
  144.     end
  145.     # 返回标题画面的情况下
  146.     if $game_temp.to_title
  147.       # 切换到标题画面
  148.       $scene = Scene_Title.new
  149.       return
  150.     end
  151.     # 处理过渡中的情况下
  152.     if $game_temp.transition_processing
  153.       # 清除过渡处理中标志
  154.       $game_temp.transition_processing = false
  155.       # 执行过渡
  156.       if $game_temp.transition_name == ""
  157.         Graphics.transition(20)
  158.       else
  159.         Graphics.transition(40, "Graphics/Transitions/" +
  160.           $game_temp.transition_name)
  161.       end
  162.     end
  163.     # 显示信息窗口中的情况下
  164.     if $game_temp.message_window_showing
  165.       return
  166.     end
  167.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
  168.     if $game_player.encounter_count == 0 and $game_map.encounter_list != []
  169.       # 不是在事件执行中或者禁止遇敌中
  170.       unless $game_system.map_interpreter.running? or
  171.              $game_system.encounter_disabled
  172.         # 确定队伍
  173.         n = rand($game_map.encounter_list.size)
  174.         troop_id = $game_map.encounter_list[n]
  175.         # 队伍有效的话
  176.         if $data_troops[troop_id] != nil
  177.           # 设置调用战斗标志
  178.           $game_temp.battle_calling = true
  179.           $game_temp.battle_troop_id = troop_id
  180.           $game_temp.battle_can_escape = true
  181.           $game_temp.battle_can_lose = false
  182.           $game_temp.battle_proc = nil
  183.         end
  184.       end
  185.     end
  186.     # 按下 B 键的情况下
  187.     if Input.trigger?(Input::B)
  188.       # 不是在事件执行中或菜单禁止中
  189.       unless $game_system.map_interpreter.running? or
  190.              $game_system.menu_disabled
  191.         # 设置菜单调用标志以及 SE 演奏
  192.         $game_temp.menu_calling = true
  193.         $game_temp.menu_beep = true
  194.       end
  195.     end
  196.     # 调试模式为 ON 并且按下 F9 键的情况下
  197.     if $DEBUG and Input.press?(Input::F9)
  198.       # 设置调用调试标志
  199.       $game_temp.debug_calling = true
  200.     end
  201.     # 不在主角移动中的情况下
  202.     unless $game_player.moving?
  203.       # 执行各种画面的调用
  204.       if $game_temp.battle_calling
  205.         call_battle
  206.       elsif $game_temp.shop_calling
  207.         call_shop
  208.       elsif $game_temp.name_calling
  209.         call_name
  210.       elsif $game_temp.menu_calling
  211.         call_menu
  212.       elsif $game_temp.save_calling
  213.         call_save
  214.       elsif $game_temp.debug_calling
  215.         call_debug
  216.       end
  217.     end
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 调用战斗
  221.   #--------------------------------------------------------------------------
  222.   def call_battle
  223.     # 清除战斗调用标志
  224.     $game_temp.battle_calling = false
  225.     # 清除菜单调用标志
  226.     $game_temp.menu_calling = false
  227.     $game_temp.menu_beep = false
  228.     # 生成遇敌计数
  229.     $game_player.make_encounter_count
  230.     # 记忆地图 BGM 、停止 BGM
  231.     $game_temp.map_bgm = $game_system.playing_bgm
  232.     $game_system.bgm_stop
  233.     # 演奏战斗开始 SE
  234.     $game_system.se_play($data_system.battle_start_se)
  235.     # 演奏战斗 BGM
  236.     $game_system.bgm_play($game_system.battle_bgm)
  237.     # 矫正主角姿势
  238.     $game_player.straighten
  239.     # 切换到战斗画面
  240.     $scene = Scene_Battle.new
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 调用商店
  244.   #--------------------------------------------------------------------------
  245.   def call_shop
  246.     # 清除商店调用标志
  247.     $game_temp.shop_calling = false
  248.     # 矫正主角姿势
  249.     $game_player.straighten
  250.     # 切换到商店画面
  251.     $scene = Scene_Shop.new
  252.   end
  253.   #--------------------------------------------------------------------------
  254.   # ● 调用名称输入
  255.   #--------------------------------------------------------------------------
  256.   def call_name
  257.     # 清除调用名称输入标志
  258.     $game_temp.name_calling = false
  259.     # 矫正主角姿势
  260.     $game_player.straighten
  261.     # 切换到名称输入画面
  262.     $scene = Scene_Name.new
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # ● 调用菜单
  266.   #--------------------------------------------------------------------------
  267.   def call_menu
  268.     # 清除菜单调用标志
  269.     $game_temp.menu_calling = false
  270.     # 已经设置了菜单 SE 演奏标志的情况下
  271.     if $game_temp.menu_beep
  272.       # 演奏确定 SE
  273.       $game_system.se_play($data_system.decision_se)
  274.       # 清除菜单演奏 SE 标志
  275.       $game_temp.menu_beep = false
  276.     end
  277.     # 矫正主角姿势
  278.     $game_player.straighten
  279.     # 切换到菜单画面
  280.     $scene = Scene_Menu.new
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● 调用存档
  284.   #--------------------------------------------------------------------------
  285.   def call_save
  286.     # 矫正主角姿势
  287.     $game_player.straighten
  288.     # 切换到存档画面
  289.     $scene = Scene_Save.new
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # ● 调用调试
  293.   #--------------------------------------------------------------------------
  294.   def call_debug
  295.     # 清除调用调试标志
  296.     $game_temp.debug_calling = false
  297.     # 演奏确定 SE
  298.     $game_system.se_play($data_system.decision_se)
  299.     # 矫正主角姿势
  300.     $game_player.straighten
  301.     # 切换到调试画面
  302.     $scene = Scene_Debug.new
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ● 主角的场所移动
  306.   #--------------------------------------------------------------------------
  307.   def transfer_player
  308.     # 清除主角场所移动调试标志
  309.     $game_temp.player_transferring = false
  310.     # 移动目标与现在的地图有差异的情况下
  311.     if $game_map.map_id != $game_temp.player_new_map_id
  312.       # 设置新地图
  313.       $game_map.setup($game_temp.player_new_map_id)
  314.     end
  315.     # 设置主角位置
  316.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  317.     # 设置主角朝向
  318.     case $game_temp.player_new_direction
  319.     when 2  # 下
  320.       $game_player.turn_down
  321.     when 4  # 左
  322.       $game_player.turn_left
  323.     when 6  # 右
  324.       $game_player.turn_right
  325.     when 8  # 上
  326.       $game_player.turn_up
  327.     end
  328.     # 矫正主角姿势
  329.     $game_player.straighten
  330.     # 刷新地图 (执行并行事件)
  331.     $game_map.update
  332.     # 在生成活动块
  333.     @spriteset.dispose
  334.     @spriteset = Spriteset_Map.new
  335.     # 处理过渡中的情况下
  336.     if $game_temp.transition_processing
  337.       # 清除过渡处理中标志
  338.       $game_temp.transition_processing = false
  339.       # 执行过渡
  340.       Graphics.transition(20)
  341.     end
  342.     # 执行地图设置的 BGM、BGS 的自动切换
  343.     $game_map.autoplay
  344.     # 设置画面
  345.     Graphics.frame_reset
  346.     # 刷新输入信息
  347.     Input.update
  348.   end
  349. end

作者: 亿万星辰    时间: 2013-5-6 13:53
  1. for i in 0...$game_party.size
复制代码

作者: q86332682    时间: 2013-5-6 15:11
好吧,我想到问题所在了,一秒种可以刷新很多次了
作者: q86332682    时间: 2013-5-6 15:25
你可以加一个变量来记录刷新次数,判定刷新次数来刷新,你这个每次满足条件的情况,只刷新一次,那么变量值为1的时候刷新,没有满足刷新条件的情况,则清除变量的值。
作者: wwwcctvty    时间: 2013-5-6 16:25
亿万星辰 发表于 2013-5-6 13:53

{:2_43:} 改成size。效果也是一次回复10-30点HP
作者: wwwcctvty    时间: 2013-5-6 16:26
q86332682 发表于 2013-5-6 15:25
你可以加一个变量来记录刷新次数,判定刷新次数来刷新,你这个每次满足条件的情况,只刷新一次,那么变量值 ...

{:2_263:} 应该怎样写呀?请教教我
作者: q86332682    时间: 2013-5-6 17:28
  def update
    total_sec = Graphics.frame_count / Graphics.frame_rate
    if total_sec != 0 and total_sec % 20 == 0
      @count += 1
      if $game_party.actors[0].hp < $game_party.actors[0].maxhp and @count == 1
        $game_party.actors[0].hp += 1
      end
      refresh
      return
    end
    @count = 0
  end
作者: wwwcctvty    时间: 2013-5-6 20:43
q86332682 发表于 2013-5-6 17:28
def update
    total_sec = Graphics.frame_count / Graphics.frame_rate
    if total_sec != 0 and to ...

{:2_275:} 先谢谢了,我去试试
作者: 亿万星辰    时间: 2013-5-6 21:02
你没发现应该是
$game_party.actors.size
么?
作者: wwwcctvty    时间: 2013-5-6 21:47
亿万星辰 发表于 2013-5-6 21:02
你没发现应该是
$game_party.actors.size
么?

{:2_281:} 谢谢星辰大大了,“bsize”是我定义的统计队伍人数的新方法(因为 宠物设置不能自动加血)
作者: 亿万星辰    时间: 2013-5-6 21:56
wwwcctvty 发表于 2013-5-6 21:47
谢谢星辰大大了,“bsize”是我定义的统计队伍人数的新方法(因为 宠物设置不能自动加血) ...

那你能把这个bsize方法写出来么?我觉得不是很靠谱啊。。。除非你的宠物都在队伍的末尾才可行。。。
作者: 芯☆淡茹水    时间: 2013-5-7 01:26
本帖最后由 芯☆淡茹水 于 2013-5-7 01:43 编辑

{:2_282:}  我知道什么原因了

LZ设置的每20秒恢复一滴血。当到20秒时,脚本自动处理恢复血,处理完后,还没到第21秒,然后又继续处理,,,,,一直处理到21秒后停止处理
So,,,,,


先在地图场景,生成完窗口后定义:@wait_count = 0

然后在  刷新 --  循环下插入


RUBY 代码复制
  1. if @wait_count > 0
  2.         @wait_count -= 1
  3.       end
  4.       time = Graphics.frame_count / Graphics.frame_rate
  5.       if time % 20 == 0 and @wait_count == 0
  6.         for i in 0...$game_party.actors.size
  7.           actor = $game_party.actors[i]
  8.           if actor.hp < actor.maxhp
  9.             actor.hp += 1
  10.           end
  11.         end
  12.         @wait_count = 40
  13.       end

作者: 亿万星辰    时间: 2013-5-7 06:47
本帖最后由 亿万星辰 于 2013-5-7 07:01 编辑

怎么回答的越来越偏了……

从原理上说吧,楼主要求的是每间隔几秒执行一次“恢复”方法,之前的错误在于,让“恢复”方法单独的依靠时间变量@total_sec的取余运算来判定,这个持续的过程显然就需要一秒钟,因为@total_sec的变化是一秒一变,所以才会出现恢复的不是期望的1滴血而是好多。
要解决这个问题很简单,只要让“恢复”这个方法跟在refresh方法后面就可以了,
  1.   #--------------------------------------------------------------------------
  2.   # ● 刷新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     super
  6.     if Graphics.frame_count / Graphics.frame_rate != @total_sec
  7.       refresh
  8.       恢复 if @total_sec % 300 == 0
  9.     end
  10.   end
复制代码
这样就实现了在窗口正常update的情况下,每间隔300秒的时候执行一次“恢复”方法,当然这还仅限于窗口正常update的情况下,如果没有update,这个方法自然也就不会执行了,比如打开菜单后没有了这个时间窗口,那么恢复也就停止了,但是时间可是还在走哦!楼主可以自己考虑一下如何克服这个问题。

另外我吐槽几个地方,
1、
  1. if actor.hp <= actor.maxhp
复制代码
这个没必要去执行这个判断,Game_Battler的hp=(hp)方法已经替你做好了,倒是你可以考虑一下死了的角色是否还需要继续恢复。。。
2、楼主你的变量名真的有点不讲究了……
  1. @tiem = Window_PlayTime.new
复制代码
@tiem是个什么情况啊……一般不是叫@time的么……TAT
作者: zxcgood2009    时间: 2013-5-7 14:58
我想把时间换成变量试试,

作者: wwwcctvty    时间: 2013-5-7 16:59
亿万星辰 发表于 2013-5-7 06:47
怎么回答的越来越偏了……

从原理上说吧,楼主要求的是每间隔几秒执行一次“恢复”方法,之前的错误在于, ...

{:2_260:} 谢谢星辰大大的指点,表示一点不懂字母{:2_263:}
  刷新问题已经克服
   我现在一般都用中文用做变量名了(实在是看不懂鸟语{:2_258:} )。不知道有没有问题,不过已经写了几十个中文名,貌似还没出现问题、、、、、
    谢谢大家的指点{:2_284:}


作者: wwwcctvty    时间: 2013-5-7 19:25
wwwcctvty 发表于 2013-5-7 16:59
谢谢星辰大大的指点,表示一点不懂字母
  刷新问题已经克服
   我现在一般都用中文 ...

{:2_263:} 中文执行会慢些吗???????请求指点
作者: wwwcctvty    时间: 2013-5-8 12:34
亿万星辰 发表于 2013-5-6 21:56
那你能把这个bsize方法写出来么?我觉得不是很靠谱啊。。。除非你的宠物都在队伍的末尾才可行。。。 ...

RUBY 代码复制
  1. def bsize
  2.     if @actors.size == 0
  3.       return 0
  4.     end
  5.     size = 0
  6.     for actor in @actors
  7.       if actor.id < 50
  8.         size += 1
  9.       end
  10.     end
  11.     return size
  12.   end

角色50号以后是宠物了
作者: wwwcctvty    时间: 2013-5-8 12:37
芯☆淡茹水 发表于 2013-5-7 01:26
我知道什么原因了

LZ设置的每20秒恢复一滴血。当到20秒时,脚本自动处理恢复血,处理完后,还 ...

{:2_275:} 谢谢了
作者: 亿万星辰    时间: 2013-5-8 16:54
本帖最后由 亿万星辰 于 2013-5-11 10:17 编辑
wwwcctvty 发表于 2013-5-8 12:34
def bsize
    if @actors.size == 0
      return 0


那你这个方法……
比如,角色1,宠物1,角色2,角色3
你的这个bsize方法返回的值是3对吧,再看你前面的恢复方法中的调用
  1.     for i in 0...$game_party.bsize
  2.       actor = $game_party.actors[i]
  3.       if actor.hp < actor.maxhp
  4.         actor.hp += 1
  5.       end
  6.     end
复制代码
这个i的取值是0,1,2,那么$game_party.actors[1]是宠物1,这个就不对了。。。
你应该这么写
  1.   def 恢复
  2.     for actor in $game_party.actors
  3.       next if actor.id >= 50
  4.       if actor.hp < actor.maxhp
  5.         actor.hp += 1
  6.       end
  7.     end
  8.   end
复制代码

作者: wwwcctvty    时间: 2013-5-8 20:58
亿万星辰 发表于 2013-5-8 16:54
那你这个方法……
比如,角色1,宠物1,角色2,角色3
你的这个bsize方法返回的值是3对吧,再看你前面的恢 ...

{:2_275:} 谢谢星辰大大了,又学一招了
作者: wwwcctvty    时间: 2013-5-10 18:31
芯☆淡茹水 发表于 2013-5-7 01:26
我知道什么原因了

LZ设置的每20秒恢复一滴血。当到20秒时,脚本自动处理恢复血,处理完后,还 ...

{:2_275:} 给力、、、、好用。谢谢了
作者: chd114    时间: 2013-5-10 21:08
你直接在公共事件里面加一个

条件分歧:角色HP<最大HP
     HP+1
     等待20帧
除此以外的场合
分歧结束

弄成并行处理不就好了
作者: wwwcctvty    时间: 2013-5-10 21:15
chd114 发表于 2013-5-10 21:08
你直接在公共事件里面加一个

条件分歧:角色HP<最大HP

{:2_262:} 我是脚本党、、、、、、事件盲、、、、、
作者: wwwcctvty    时间: 2013-5-11 12:47
wwwcctvty 发表于 2013-5-8 20:58
谢谢星辰大大了,又学一招了

@亿万星辰   你那段脚本还是会回血很多的、、、、、、、、16楼方法通过测试了
作者: wwwcctvty    时间: 2013-5-11 20:35
本帖最后由 wwwcctvty 于 2013-5-11 20:42 编辑
wwwcctvty 发表于 2013-5-11 12:47
@亿万星辰   你那段脚本还是会回血很多的、、、、、、、、16楼方法通过测试了  ...


我再看下、、、、

发现我这样写的:
     
       if @total_sec % 300 == 0
        refresh
       恢复
   end
作者: 亿万星辰    时间: 2013-5-11 21:31
wwwcctvty 发表于 2013-5-11 20:35
我再看下、、、、

发现我这样写的:

每经过300秒刷新一次,然后恢复1点HP……




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