Project1

标题: 请问如何附加状态就执行公共事件 [打印本页]

作者: zjc543463949    时间: 2018-2-21 01:17
标题: 请问如何附加状态就执行公共事件
比如队友附加某个状态就执行一个公共事件,状态解除就不执行
作者: 芯☆淡茹水    时间: 2018-2-21 01:17
本帖最后由 芯☆淡茹水 于 2018-2-26 19:01 编辑
  1. #==============================================================================
  2. class Game_Actor < Game_Battler
  3.   BGM_DATA = {5=>"BGM1",6=>"BGM2",7=>"BGM3",8=>"BGM4"}  #状态ID => BGM名
  4.   #--------------------------------------------------------------------------
  5.   def add_new_state(state_id)
  6.     super
  7.     BGM_DATA[state_id] && Audio.bgm_play("Audio/BGM/" + BGM_DATA[state_id], 100, 100)
  8.   end
  9.   #--------------------------------------------------------------------------
  10.   def remove_state(state_id)
  11.     state?(state_id) && BGM_DATA[state_id] && BattleManager.play_battle_bgm
  12.     super
  13.   end
  14. end
  15. #==============================================================================
复制代码

作者: 刹那铃音    时间: 2018-2-21 01:53
笨方法:
游戏开始开一个开关,然后公共事件里一个事件通过此开关触发,并行处理。
1.此事件内用条件分歧判断每一个角色的每种状态,如果是则xxx。
2.想要只执行一次,就是在分歧下打开另外一个开关,在此分歧前再次分歧,如果已打开触发开关则不进行分歧(避免无限判断),触发则每一个开关控制着每一个角色的每一个状态所触发的公共事件,公共事件内进行xxx然后关掉这个触发开关,并打开总控制事件里的已触发开关,每回合开始时关闭所有已触发开关。
建议你用第二种,不知道什么指令能禁得起你不停并行处理。
当然,如果有触子给你脚本那是最好的,就可以不用这种既麻烦又不一定成功的手动事件判断了。
作者: 300英雄    时间: 2018-2-21 15:24
Game_Battler里面有个类叫做add_state(state_id)
然后你在@result.added_states.push(state_id).uniq!这一行上面输入$game_temp.reserve_common_event(X) 执行第X号公共事件
然后这个类就变成了下面
  def add_state(state_id)
    if state_addable?(state_id)
      add_new_state(state_id) unless state?(state_id)
      reset_state_counts(state_id)

$game_temp.reserve_common_event(1) #执行一号公共事件
      @result.added_states.push(state_id).uniq!
    end
  end

作者: 芯☆淡茹水    时间: 2018-2-21 15:46
本帖最后由 芯☆淡茹水 于 2018-2-21 15:58 编辑

楼上的角色和敌人都会起效果,如果只有角色有效的话,可以这样:

  1. #==============================================================================
  2. class Game_Actor < Game_Battler
  3.   STATE_ID = 5   #状态ID
  4.   CE_ID = 1      #公共事件ID
  5.   #--------------------------------------------------------------------------
  6.   def add_new_state(state_id)
  7.     super
  8.     state_id == STATE_ID && $game_temp.reserve_common_event(CE_ID)
  9.   end
  10. end
  11. #==============================================================================
复制代码


第一次附加状态有效;如果有该状态再附加的话,就无效。

话说,你把公共事件放在附加这个状态的技能里,效果不是差不多么?!
作者: zjc543463949    时间: 2018-2-23 23:09
刹那铃音 发表于 2018-2-21 01:53
笨方法:
游戏开始开一个开关,然后公共事件里一个事件通过此开关触发,并行处理。
1.此事件内用条件分歧判 ...

谢谢,这方法我试过,但是战斗中好像判断不了
作者: zjc543463949    时间: 2018-2-23 23:11
300英雄 发表于 2018-2-21 15:24
Game_Battler里面有个类叫做add_state(state_id)
然后你在@result.added_states.push(state_id).uniq!这一 ...

谢谢,我没有表达清楚,像战斗中附加这状态就换BGM,状态解除就换回原来的,做得到这样吗
作者: zjc543463949    时间: 2018-2-23 23:13
芯☆淡茹水 发表于 2018-2-21 15:46
楼上的角色和敌人都会起效果,如果只有角色有效的话,可以这样:

谢谢,能做到战斗中附加状态后更换BGM,解除后换回原来的这样吗
作者: chd114    时间: 2018-2-24 03:30
zjc543463949 发表于 2018-2-23 23:13
谢谢,能做到战斗中附加状态后更换BGM,解除后换回原来的这样吗 ...

如果你不要求記錄中斷時候的位置,只記錄音樂文件的名字是很簡單的,在附加狀態的方法裏加一個id判斷,如果id==x就切換bgm並且記錄被切換掉的bgm的文件名字
不過你的遊戲有戰鬥,那就要用2個變量,1個用來記錄地圖上的音樂文件名字,1個用來記錄戰鬥中音樂文件名字

具體流程就象這樣

從地圖進入戰鬥時
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 切换战斗画面前的处理
  3.   #--------------------------------------------------------------------------
  4.   def pre_battle_scene
  5.     Graphics.update
  6.     Graphics.freeze
  7.     @spriteset.dispose_characters
  8.     BattleManager.save_bgm_and_bgs#保存進入戰鬥前的bgm和bgs
  9.     BattleManager.play_battle_bgm
  10.     Sound.play_battle_start
  11.   end


從戰鬥中離開時
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 胜利时的处理
  3.   #--------------------------------------------------------------------------
  4.   def self.process_victory
  5.     play_battle_end_me
  6.     replay_bgm_and_bgs#恢復進入戰鬥前的bgm和bgs
  7.     $game_message.add(sprintf(Vocab::Victory, $game_party.name))
  8.     display_exp
  9.     gain_gold
  10.     gain_drop_items
  11.     gain_exp
  12.     SceneManager.return
  13.     battle_end(0)
  14.     return true
  15.   end
  16.   #--------------------------------------------------------------------------
  17.   # ● 撤退时的处理
  18.   #--------------------------------------------------------------------------
  19.   def self.process_escape
  20.     $game_message.add(sprintf(Vocab::EscapeStart, $game_party.name))
  21.     success = @preemptive ? true : (rand < @escape_ratio)
  22.     Sound.play_escape
  23.     if success
  24.       process_abort
  25.     else
  26.       @escape_ratio += 0.1
  27.       $game_message.add('\.' + Vocab::EscapeFailure)
  28.       $game_party.clear_actions
  29.     end
  30.     wait_for_message
  31.     return success
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 中止时的处理
  35.   #--------------------------------------------------------------------------
  36.   def self.process_abort
  37.     replay_bgm_and_bgs
  38.     SceneManager.return
  39.     battle_end(1)
  40.     return true
  41.   end


按照進入戰鬥前保存bgm,改變bgm,離開戰鬥讀取bgm的思路
附加指定狀態前保存bgm,改變bgm,移除指定狀態讀取bgm
作者: 芯☆淡茹水    时间: 2018-2-25 08:58
本帖最后由 芯☆淡茹水 于 2018-2-25 09:03 编辑

附加的时候直接播放特定的音乐,解除时再播放战斗BGM就行了,都不带记忆的。

  1. #==============================================================================
  2. class Game_Actor < Game_Battler
  3.   STATE_ID = 5             #状态ID
  4.   BGM_NAME = "Field1"      #BGM名。
  5.   #--------------------------------------------------------------------------
  6.   def add_new_state(state_id)
  7.     super
  8.     state_id == STATE_ID && Audio.bgm_play("Audio/BGM/" + BGM_NAME, 100, 100)
  9.   end
  10.   #--------------------------------------------------------------------------
  11.   def remove_state(state_id)
  12.     state?(state_id) && state_id == STATE_ID && BattleManager.play_battle_bgm
  13.     super
  14.   end
  15. end
  16. #==============================================================================
复制代码


如果队伍不断的附加和解除这个状态,BGM播放可能就有些混乱,那就需要改战斗场景了。
作者: zjc543463949    时间: 2018-2-26 03:47
芯☆淡茹水 发表于 2018-2-25 08:58
附加的时候直接播放特定的音乐,解除时再播放战斗BGM就行了,都不带记忆的。

谢谢谢谢,问下可以实现多个状态对应不同的BGM吗




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