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

Project1

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

[已经解决] RMXP有没有类似于MOG - Battle Cry那样完善的战斗语音系统呢

[复制链接]

Lv1.梦旅人

梦石
0
星屑
125
在线时间
272 小时
注册时间
2012-11-11
帖子
221
跳转到指定楼层
1
发表于 2015-5-29 23:51:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RT,略懂一些脚本编辑器里修改Scene_Battle达到在角色攻击防御挨打和放技能时播放SE的方法,不过一些其他场合下播放SE的方法就不大会了……例如在战斗结束时判断最后行动角色播放胜利台词,这应该怎么写啊。上网搜索一些后找到VA上的MOG - Battle Cry,看了一眼真是相当的完善呢……那么问题来了,RMXP上是不是也有类似于这样的脚本呢?如果没有的话也无所谓,求教一下先前所说在战斗结束后判断最后行动角色播放相应SE的方法呗,跪谢m(_ _)m

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

Lv5.捕梦者

梦石
0
星屑
33079
在线时间
5104 小时
注册时间
2012-11-19
帖子
4878

开拓者

2
发表于 2015-5-30 07:42:12 | 只看该作者
用 @active_battler 来判断
  1. #因一些情况 @active_battler 为 nil ,或 @active_battler 是敌人时
  2. #(敌人中毒死亡全灭时)。
  3. #说话者 speaker 为角色队伍顺序第一个存在的角色。
  4. if @active_battler.nil? or @active_battler.is_a?(Game_Enemy)
  5.   for actor in $game_party.actors
  6.     if actor.exist?
  7.       speaker = actor
  8.       break
  9.     end
  10.   end
  11. #其他情况,说话者 speaker 为当前战斗行动者。
  12. else
  13.   speaker = @active_battler
  14. end
  15. #在结束战斗回合 start_phase5 适当的地方,附上上面这段,然后根据 speaker
  16. #的名字或ID判断要播放的SE.。
复制代码
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
125
在线时间
272 小时
注册时间
2012-11-11
帖子
221
3
 楼主| 发表于 2015-5-30 18:27:56 | 只看该作者
芯☆淡茹水 发表于 2015-5-30 07:42
用 @active_battler 来判断

额……还是有些不明白。意思是speaker还需另行赋值?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
226 小时
注册时间
2015-5-8
帖子
329
4
发表于 2015-5-30 18:47:35 | 只看该作者
本帖最后由 妖精蕾贝卡 于 2015-5-30 18:48 编辑
芯☆淡茹水 发表于 2015-5-30 07:42
用 @active_battler 来判断
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 2)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================

  6. class Scene_Battle
  7.   #--------------------------------------------------------------------------
  8.   # ● 开始自由战斗回合
  9.   #--------------------------------------------------------------------------
  10.   def start_phase1
  11.     # 转移到回合 1
  12.     @phase = 1
  13.     # 清除全体同伴的行动
  14.     $game_party.clear_actions
  15.     # 设置战斗事件
  16.     setup_battle_event
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 刷新画面 (自由战斗回合)
  20.   #--------------------------------------------------------------------------
  21.   def update_phase1
  22.     # 胜败判定
  23.     if judge
  24.       # 胜利或者失败的情况下 : 过程结束
  25.       return
  26.     end
  27.     # 开始同伴命令回合
  28.     start_phase2
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 开始同伴命令回合
  32.   #--------------------------------------------------------------------------
  33.   def start_phase2
  34.     # 转移到回合 2
  35.     @phase = 2
  36.     # 设置角色为非选择状态
  37.     @actor_index = -1
  38.     @active_battler = nil
  39.     # 有效化同伴指令窗口
  40.     @party_command_window.active = true
  41.     @party_command_window.visible = true
  42.     # 无效化角色指令窗口
  43.     @actor_command_window.active = false
  44.     @actor_command_window.visible = false
  45.     # 清除主回合标志
  46.     $game_temp.battle_main_phase = false
  47.     # 清除全体同伴的行动
  48.     $game_party.clear_actions
  49.     # 不能输入命令的情况下
  50.     unless $game_party.inputable?
  51.       # 开始主回合
  52.       start_phase4
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 刷新画面 (同伴命令回合)
  57.   #--------------------------------------------------------------------------
  58.   def update_phase2
  59.     # 按下 C 键的情况下
  60.     if Input.trigger?(Input::C)
  61.       # 同伴指令窗口光标位置分支
  62.       case @party_command_window.index
  63.       when 0  # 战斗
  64.         # 演奏确定 SE
  65.         $game_system.se_play($data_system.decision_se)
  66.         # 开始角色的命令回合
  67.         start_phase3
  68.       when 1  # 逃跑
  69.         # 不能逃跑的情况下
  70.         if $game_temp.battle_can_escape == false
  71.           # 演奏冻结 SE
  72.           $game_system.se_play($data_system.buzzer_se)
  73.           return
  74.         end
  75.         # 演奏确定 SE
  76.         $game_system.se_play($data_system.decision_se)
  77.         # 逃走处理
  78.         update_phase2_escape
  79.       end
  80.       return
  81.     end
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 画面更新 (同伴指令回合 : 逃跑)
  85.   #--------------------------------------------------------------------------
  86.   def update_phase2_escape
  87.     # 计算敌人速度的平均值
  88.     enemies_agi = 0
  89.     enemies_number = 0
  90.     for enemy in $game_troop.enemies
  91.       if enemy.exist?
  92.         enemies_agi += enemy.agi
  93.         enemies_number += 1
  94.       end
  95.     end
  96.     if enemies_number > 0
  97.       enemies_agi /= enemies_number
  98.     end
  99.     # 计算角色速度的平均值
  100.     actors_agi = 0
  101.     actors_number = 0
  102.     for actor in $game_party.actors
  103.       if actor.exist?
  104.         actors_agi += actor.agi
  105.         actors_number += 1
  106.       end
  107.     end
  108.     if actors_number > 0
  109.       actors_agi /= actors_number
  110.     end
  111.     # 逃跑成功判定
  112.     success = rand(100) < 50 * actors_agi / enemies_agi
  113.     # 成功逃跑的情况下
  114.     if success
  115.       # 演奏逃跑 SE
  116.       $game_system.se_play($data_system.escape_se)
  117.       # 还原为战斗开始前的 BGM
  118.       $game_system.bgm_play($game_temp.map_bgm)
  119.       # 战斗结束
  120.       battle_end(1)
  121.     # 逃跑失败的情况下
  122.     else
  123.       # 清除全体同伴的行动
  124.       $game_party.clear_actions
  125.       # 开始主回合
  126.       start_phase4
  127.     end
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 开始结束战斗回合
  131.   #--------------------------------------------------------------------------
  132.   def start_phase5
  133.     # 转移到回合 5
  134.     @phase = 5
  135.     # 演奏战斗结束 ME
  136.     #因一些情况 @active_battler 为 nil ,或 @active_battler 是敌人时
  137.     #(敌人中毒死亡全灭时)。
  138.     #说话者 speaker 为角色队伍顺序第一个存在的角色。
  139.     if @active_battler.nil? or @active_battler.is_a?(Game_Enemy)
  140.     for actor in $game_party.actors
  141.     if actor.exist?
  142.       speaker = actor
  143.     break
  144.     end
  145.     end
  146.     #其他情况,说话者 speaker 为当前战斗行动者。
  147.     else
  148.     speaker = @active_battler
  149.   end
  150.     Audio.se_play(@active_battler.name+"音效")
  151.    
  152. #在结束战斗回合 start_phase5 适当的地方,附上上面这段,然后根据 speaker
  153. #的名字或ID判断要播放的SE.。
  154.     $game_system.me_play($game_system.battle_end_me)
  155.     # 还原为战斗开始前的 BGM
  156.     $game_system.bgm_play($game_temp.map_bgm)
  157.     # 初始化 EXP、金钱、宝物
  158.     exp = 0
  159.     gold = 0
  160.     treasures = []
  161.     # 循环
  162.     for enemy in $game_troop.enemies
  163.       # 敌人不是隐藏状态的情况下
  164.       unless enemy.hidden
  165.         # 获得 EXP、增加金钱
  166.         exp += enemy.exp
  167.         gold += enemy.gold
  168.         # 出现宝物判定
  169.         if rand(100) < enemy.treasure_prob
  170.           if enemy.item_id > 0
  171.             treasures.push($data_items[enemy.item_id])
  172.           end
  173.           if enemy.weapon_id > 0
  174.             treasures.push($data_weapons[enemy.weapon_id])
  175.           end
  176.           if enemy.armor_id > 0
  177.             treasures.push($data_armors[enemy.armor_id])
  178.           end
  179.         end
  180.       end
  181.     end
  182.     # 限制宝物数为 6 个
  183.     treasures = treasures[0..5]
  184.     # 获得 EXP
  185.     for i in 0...$game_party.actors.size
  186.       actor = $game_party.actors[i]
  187.       if actor.cant_get_exp? == false
  188.         last_level = actor.level
  189.         actor.exp += exp
  190.         if actor.level > last_level
  191.           @status_window.level_up(i)
  192.         end
  193.       end
  194.     end
  195.     # 获得金钱
  196.     $game_party.gain_gold(gold)
  197.     # 获得宝物
  198.     for item in treasures
  199.       case item
  200.       when RPG::Item
  201.         $game_party.gain_item(item.id, 1)
  202.       when RPG::Weapon
  203.         $game_party.gain_weapon(item.id, 1)
  204.       when RPG::Armor
  205.         $game_party.gain_armor(item.id, 1)
  206.       end
  207.     end
  208.     # 生成战斗结果窗口
  209.     @result_window = Window_BattleResult.new(exp, gold, treasures)
  210.     # 设置等待计数
  211.     @phase5_wait_count = 100
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ● 画面更新 (结束战斗回合)
  215.   #--------------------------------------------------------------------------
  216.   def update_phase5
  217.     # 等待计数大于 0 的情况下
  218.     if @phase5_wait_count > 0
  219.       # 减少等待计数
  220.       @phase5_wait_count -= 1
  221.       # 等待计数为 0 的情况下
  222.       if @phase5_wait_count == 0
  223.         # 显示结果窗口
  224.         @result_window.visible = true
  225.         # 清除主回合标志
  226.         $game_temp.battle_main_phase = false
  227.         # 刷新状态窗口
  228.         @status_window.refresh
  229.       end
  230.       return
  231.     end
  232.     # 按下 C 键的情况下
  233.     if Input.trigger?(Input::C)
  234.       # 战斗结束
  235.       battle_end(0)
  236.     end
  237.   end
  238. end
复制代码
稍微嘗試一下,看看正確與否?
我是妖精蕾貝卡,沉默少言,孤獨自卑。完成了一個小遊戲,歡迎試玩。同時也歡迎試玩師傅的遊戲,謝謝。
現正在努力學習事件中,有不明白的地方請各位指教。

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
125
在线时间
272 小时
注册时间
2012-11-11
帖子
221
5
 楼主| 发表于 2015-5-30 22:40:55 | 只看该作者
芯☆淡茹水 发表于 2015-5-30 07:42
用 @active_battler 来判断


RUBY 代码复制
  1. def start_phase5
  2.     # フェーズ 5 に移行
  3.     @phase = 5
  4.     # バトル終了 ME を演奏
  5.  
  6.  
  7.     #因一些情况 @active_battler 为 nil ,或 @active_battler 是敌人时
  8.     #(敌人中毒死亡全灭时)。
  9.     #说话者 speaker 为角色队伍顺序第一个存在的角色。
  10.     if @active_battler.nil? or @active_battler.is_a?(Game_Enemy)
  11.       for actor in $game_party.actors
  12.         if actor.exist?
  13.           speaker = actor
  14.           break
  15.         end
  16.       end
  17.     #其他情况,说话者 speaker 为当前战斗行动者。
  18.     else
  19.       speaker = @active_battler
  20.     end
  21.  
  22.       if ACTOR_WIN_VOICE.key?(speaker.id)
  23.         name = ACTOR_WIN_VOICE[speaker.id][0]
  24.         volume = ACTOR_WIN_VOICE[speaker.id][1]
  25.         pitch = ACTOR_WIN_VOICE[speaker.id][2]
  26.         Audio.se_play("Audio/SE/" + name, volume, pitch)
  27.       end
  28.  
  29.     #在结束战斗回合 start_phase5 适当的地方,附上上面这段,然后根据 speaker
  30.     #的名字或ID判断要播放的SE.。   
  31.  
  32.  
  33.     $game_system.me_play($game_system.battle_end_me)
  34.     # バトル開始前の BGM に戻す
  35.     $game_system.bgm_play($game_temp.map_bgm)
  36.     # EXP、ゴールド、トレジャーを初期化
  37.     exp = 0
  38.     gold = 0
  39.     treasures = []
  40.     if @active_actor != nil
  41.       @active_actor.blink = false
  42.     end


同尝试修改了下……根据speaker赋值给予了id,然后分别根据id来判断actor对应的语音文件,但实际测试的时候只能发出1号角色的se,求修改……
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33079
在线时间
5104 小时
注册时间
2012-11-19
帖子
4878

开拓者

6
发表于 2015-5-31 19:22:25 | 只看该作者
本帖最后由 芯☆淡茹水 于 2015-5-31 19:23 编辑

你的什么战斗系统,怎么是@active_actor ?
  1. def start_phase5
  2.     # フェーズ 5 に移行
  3.     @phase = 5
  4.     # バトル終了 ME を演奏
  5.    
  6.    
  7.     #因一些情况 @active_battler 为 nil ,或 @active_battler 是敌人时
  8.     #(敌人中毒死亡全灭时)。
  9.     #说话者 speaker 为角色队伍顺序第一个存在的角色。
  10.     if @active_actor.nil? or @active_actor.is_a?(Game_Enemy)
  11.       for actor in $game_party.actors
  12.         if actor.exist?
  13.           speaker = actor
  14.           break
  15.         end
  16.       end
  17.     #其他情况,说话者 speaker 为当前战斗行动者。
  18.     else
  19.       speaker = @active_actor
  20.     end
  21.    
  22.     if ACTOR_WIN_VOICE.key?(speaker.id)
  23.       name = ACTOR_WIN_VOICE[speaker.id][0]
  24.       volume = ACTOR_WIN_VOICE[speaker.id][1]
  25.       pitch = ACTOR_WIN_VOICE[speaker.id][2]
  26.       Audio.se_play("Audio/SE/" + name, volume, pitch)
  27.     end
  28.    
  29.     #在结束战斗回合 start_phase5 适当的地方,附上上面这段,然后根据 speaker
  30.     #的名字或ID判断要播放的SE.。   
  31.    

  32.     $game_system.me_play($game_system.battle_end_me)
  33.     # バトル開始前の BGM に戻す
  34.     $game_system.bgm_play($game_temp.map_bgm)
  35.     # EXP、ゴールド、トレジャーを初期化
  36.     exp = 0
  37.     gold = 0
  38.     treasures = []
  39.     if @active_actor != nil
  40.       @active_actor.blink = false
  41.     end
复制代码

评分

参与人数 2星屑 +20 梦石 +1 收起 理由
RyanBern + 1 认可答案
enitsirhc + 20 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
125
在线时间
272 小时
注册时间
2012-11-11
帖子
221
7
 楼主| 发表于 2015-5-31 20:01:03 | 只看该作者
芯☆淡茹水 发表于 2015-5-31 19:22
你的什么战斗系统,怎么是@active_actor ?

额……RTAB战斗系统
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
125
在线时间
272 小时
注册时间
2012-11-11
帖子
221
8
 楼主| 发表于 2015-5-31 20:08:42 | 只看该作者
芯☆淡茹水 发表于 2015-5-31 19:22
你的什么战斗系统,怎么是@active_actor ?

已经完美解决了,谢谢诶=w=
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-23 01:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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