查看: 5537|回复: 15

[已经解决] 请问如何附加状态就执行公共事件

[复制链接]
梦石
0
星屑
170
在线时间
45 小时
注册时间
2013-8-9
回帖
9
发表于 2018-2-21 01:17:19 | 显示全部楼层 |阅读模式
悬赏10星屑已解决
比如队友附加某个状态就执行一个公共事件,状态解除就不执行
梦石
0
星屑
34460
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-2-21 01:17:20 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 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. #==============================================================================
复制代码
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
2497
在线时间
215 小时
注册时间
2017-9-27
回帖
563
发表于 2018-2-21 01:53:27 | 显示全部楼层
笨方法:
游戏开始开一个开关,然后公共事件里一个事件通过此开关触发,并行处理。
1.此事件内用条件分歧判断每一个角色的每种状态,如果是则xxx。
2.想要只执行一次,就是在分歧下打开另外一个开关,在此分歧前再次分歧,如果已打开触发开关则不进行分歧(避免无限判断),触发则每一个开关控制着每一个角色的每一个状态所触发的公共事件,公共事件内进行xxx然后关掉这个触发开关,并打开总控制事件里的已触发开关,每回合开始时关闭所有已触发开关。
建议你用第二种,不知道什么指令能禁得起你不停并行处理。
当然,如果有触子给你脚本那是最好的,就可以不用这种既麻烦又不一定成功的手动事件判断了。

点评

为了避免出现误导问题,请先看我的方法是否有可行的可能性,如果不可行请告诉在下,避免出现误导问题,我秉持着一种“我认为可行”的态度。  发表于 2018-2-21 01:55
浅尝辄止,宜乎众矣。
回复

使用道具 举报

梦石
0
星屑
1345
在线时间
378 小时
注册时间
2015-6-16
回帖
526
发表于 2018-2-21 15:24:55 | 显示全部楼层
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
P1不太上了,有问题加个Q1286124843,不管是脚本还是游戏问题都可以来找我
回复

使用道具 举报

梦石
0
星屑
34460
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-2-21 15:46:59 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 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. #==============================================================================
复制代码


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

话说,你把公共事件放在附加这个状态的技能里,效果不是差不多么?!

点评

大大,你忘了可以if self.actor?  发表于 2018-2-25 10:34
不能一概而论,可能还要涉及状态免疫还有战场状态这些问题  发表于 2018-2-22 01:09
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
170
在线时间
45 小时
注册时间
2013-8-9
回帖
9
 楼主| 发表于 2018-2-23 23:09:36 | 显示全部楼层
刹那铃音 发表于 2018-2-21 01:53
笨方法:
游戏开始开一个开关,然后公共事件里一个事件通过此开关触发,并行处理。
1.此事件内用条件分歧判 ...

谢谢,这方法我试过,但是战斗中好像判断不了
回复

使用道具 举报

梦石
0
星屑
170
在线时间
45 小时
注册时间
2013-8-9
回帖
9
 楼主| 发表于 2018-2-23 23:11:17 | 显示全部楼层
300英雄 发表于 2018-2-21 15:24
Game_Battler里面有个类叫做add_state(state_id)
然后你在@result.added_states.push(state_id).uniq!这一 ...

谢谢,我没有表达清楚,像战斗中附加这状态就换BGM,状态解除就换回原来的,做得到这样吗
回复

使用道具 举报

梦石
0
星屑
170
在线时间
45 小时
注册时间
2013-8-9
回帖
9
 楼主| 发表于 2018-2-23 23:13:15 | 显示全部楼层
芯☆淡茹水 发表于 2018-2-21 15:46
楼上的角色和敌人都会起效果,如果只有角色有效的话,可以这样:

谢谢,能做到战斗中附加状态后更换BGM,解除后换回原来的这样吗

点评

BGM也可以用变量记录吗?  发表于 2018-2-24 02:53
那需要1個變量來記錄正常情況下的bgm  发表于 2018-2-24 01:29
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2018-2-24 03:30:05 | 显示全部楼层
zjc543463949 发表于 2018-2-23 23:13
谢谢,能做到战斗中附加状态后更换BGM,解除后换回原来的这样吗 ...

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

具體流程就象這樣

從地圖進入戰鬥時
[pre lang="ruby"]
  #--------------------------------------------------------------------------
  # ● 切换战斗画面前的处理
  #--------------------------------------------------------------------------
  def pre_battle_scene
    Graphics.update
    Graphics.freeze
    @spriteset.dispose_characters
    BattleManager.save_bgm_and_bgs#保存進入戰鬥前的bgm和bgs
    BattleManager.play_battle_bgm
    Sound.play_battle_start
  end[/pre]

從戰鬥中離開時
[pre lang="ruby"]
  #--------------------------------------------------------------------------
  # ● 胜利时的处理
  #--------------------------------------------------------------------------
  def self.process_victory
    play_battle_end_me
    replay_bgm_and_bgs#恢復進入戰鬥前的bgm和bgs
    $game_message.add(sprintf(Vocab::Victory, $game_party.name))
    display_exp
    gain_gold
    gain_drop_items
    gain_exp
    SceneManager.return
    battle_end(0)
    return true
  end
  #--------------------------------------------------------------------------
  # ● 撤退时的处理
  #--------------------------------------------------------------------------
  def self.process_escape
    $game_message.add(sprintf(Vocab::EscapeStart, $game_party.name))
    success = @preemptive ? true : (rand < @escape_ratio)
    Sound.play_escape
    if success
      process_abort
    else
      @escape_ratio += 0.1
      $game_message.add('\.' + Vocab::EscapeFailure)
      $game_party.clear_actions
    end
    wait_for_message
    return success
  end
  #--------------------------------------------------------------------------
  # ● 中止时的处理
  #--------------------------------------------------------------------------
  def self.process_abort
    replay_bgm_and_bgs
    SceneManager.return
    battle_end(1)
    return true
  end[/pre]

按照進入戰鬥前保存bgm,改變bgm,離開戰鬥讀取bgm的思路
附加指定狀態前保存bgm,改變bgm,移除指定狀態讀取bgm
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
34460
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-2-25 08:58:34 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 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播放可能就有些混乱,那就需要改战斗场景了。
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部