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

Project1

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

[已经解决] 逃跑加入战斗菜单的脚本有BUG,请教

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
跳转到指定楼层
1
发表于 2016-6-26 20:47:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 452234679 于 2016-6-26 20:54 编辑

脚本功能:去掉战斗开始时候的 战斗/逃跑 的选择过程,并把逃跑加入到角色命令菜单当中

如果使用事件——战斗处理,不选择“可以逃跑”,则一开始战斗就会脚本报错

报错的代码是这部分

    unless $game_temp.battle_can_escape
      @actor_command_window.disable_item(commands.size - 1)
    end

我想可能是因为无法判断逃跑按钮的状态,我希望可以进入战斗后,逃跑按钮是失效状态的

希望可以得到大神的指导,谢谢!

该脚本的全部代码如下:

RUBY 代码复制
  1. #=======================================================================
  2. # ■ 本脚本来自 [url]www.66rpg.com[/url] 转载和使用时请保留此信息
  3. #-----------------------------------------------------------------------
  4. #   脚本功能:去掉战斗开始时候的 战斗/逃跑 的选择过程.
  5. #             并把逃跑加入到角色命令菜单当中
  6. #   脚本作者:后知后觉  2010-8-11 13:46:59
  7. #   使用方法:直接在 Main 前插入即可
  8. #=======================================================================
  9. class Window_PartyCommand < Window_Selectable
  10.   def visible=(value)
  11.     super(false)
  12.   end
  13.   def active=(value)
  14.     super(false)
  15.   end
  16. end
  17. class Scene_Battle
  18.   alias hzhj_old_start_phase1 start_phase1
  19.   def start_phase1
  20.     class << @actor_command_window
  21.       attr_reader :commands
  22.       def commands=(value)
  23.         @commands = value
  24.         @item_max = @commands.size
  25.         self.height = @item_max * 32 + 32
  26.         self.y = [self.y - 32, 0].max
  27.         self.contents.dispose
  28.         self.contents = Bitmap.new(width - 32, height - 32)
  29.         refresh
  30.       end
  31.     end
  32.  
  33.     unless $game_temp.battle_can_escape
  34.       @actor_command_window.disable_item(commands.size - 1)
  35.     end
  36.     hzhj_old_start_phase1
  37.   end
  38.   alias hzhj_old_start_phase2 start_phase2
  39.   def start_phase2
  40.     hzhj_old_start_phase2
  41.     if @phase == 2
  42.       start_phase3
  43.     end
  44.   end
  45.   alias hzhj_old_update_phase3_basic_command update_phase3_basic_command
  46.   def update_phase3_basic_command
  47.     hzhj_old_update_phase3_basic_command
  48.     if Input.trigger?(13)
  49.       if @actor_command_window.index == @actor_command_window.commands.size - 1
  50.         unless $game_temp.battle_can_escape
  51.           $game_system.se_play($data_system.buzzer_se)
  52.           return
  53.         end
  54.         $game_system.se_play($data_system.decision_se)
  55.         update_phase2_escape
  56.         return
  57.       end
  58.     end
  59.   end
  60. end
  61.  
  62. #=======================================================================
  63. # ■ 本脚本来自 [url]www.66rpg.com[/url] 转载和使用时请保留此信息
  64. #=======================================================================

Lv1.梦旅人

梦石
0
星屑
50
在线时间
76 小时
注册时间
2016-2-12
帖子
18
2
发表于 2016-6-26 21:32:29 | 只看该作者
在unless 前面加上这三行
  1. commands = @actor_command_window.commands
  2.     commands.push("撤退")
  3.     @actor_command_window.commands = commands
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
3
 楼主| 发表于 2016-6-26 21:50:27 | 只看该作者
阿短 发表于 2016-6-26 21:32
在unless 前面加上这三行

还是会报错:undefined method 'disable_item' for
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
1053 小时
注册时间
2013-3-28
帖子
390

开拓者

4
发表于 2016-7-8 18:57:21 | 只看该作者
452234679 发表于 2016-6-26 21:50
还是会报错:undefined method 'disable_item' for

for 后面是什么?这个很重要
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
5
 楼主| 发表于 2016-7-12 23:24:30 | 只看该作者
陈大帅帅帅哥 发表于 2016-7-8 18:57
for 后面是什么?这个很重要

undefined method 'disable_item' for #<Scene_Battle 0x22a0260>
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
1053 小时
注册时间
2013-3-28
帖子
390

开拓者

6
发表于 2016-7-13 10:47:37 | 只看该作者
452234679 发表于 2016-7-12 23:24
undefined method 'disable_item' for #


我尝试了下没有问题,有可能是你其他的脚本把这个脚本的某个方法覆盖了,能不能发一下你的整个工程
不方便的话可以私信
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
7
 楼主| 发表于 2016-7-13 16:24:57 | 只看该作者
陈大帅帅帅哥 发表于 2016-7-13 10:47
我尝试了下没有问题,有可能是你其他的脚本把这个脚本的某个方法覆盖了,能不能发一下你的整个工程
不方 ...

您好,我仔细看了下,确实我的工程还修改了一个地方,我将战斗命令的排列方式改成横排了,所以冲突

但是,但是工程传不上来,文件太大了,可否告知您的联系方式

我先将涉及到的3个脚本发到这里,您新建一个工程加入这3个脚本就可以发现BUG了:


第1个改动的地方(默认脚本,替换的):

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 1)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================
  6.  
  7. class Scene_Battle
  8.   #--------------------------------------------------------------------------
  9.   # ● 主处理
  10.   #--------------------------------------------------------------------------
  11.   def main
  12.     # 初始化战斗用的各种暂时数据
  13.     $game_temp.in_battle = true
  14.     $game_temp.battle_turn = 0
  15.     $game_temp.battle_event_flags.clear
  16.     $game_temp.battle_abort = false
  17.     $game_temp.battle_main_phase = false
  18.     $game_temp.battleback_name = $game_map.battleback_name
  19.     $game_temp.forcing_battler = nil
  20.     # 初始化战斗用事件解释器
  21.     $game_system.battle_interpreter.setup(nil, 0)
  22.     # 准备队伍
  23.     @troop_id = $game_temp.battle_troop_id
  24.     $game_troop.setup(@troop_id)
  25.     # 生成角色命令窗口
  26.     @actor_command_window = Window_BattleCommand.new
  27.     @actor_command_window.y = 160
  28.     @actor_command_window.back_opacity = 160
  29.     @actor_command_window.active = false
  30.     @actor_command_window.visible = false
  31.     # 生成其它窗口
  32.     @party_command_window = Window_PartyCommand.new
  33.     @help_window = Window_Help.new
  34.     @help_window.back_opacity = 160
  35.     @help_window.visible = false
  36.     @status_window = Window_BattleStatus.new
  37.     @message_window = Window_Message.new
  38.     # 生成活动块
  39.     @spriteset = Spriteset_Battle.new
  40.     # 初始化等待计数
  41.     @wait_count = 0
  42.     # 执行过渡
  43.     if $data_system.battle_transition == ""
  44.       Graphics.transition(20)
  45.     else
  46.       Graphics.transition(40, "Graphics/Transitions/" +
  47.         $data_system.battle_transition)
  48.     end
  49.     # 开始自由战斗回合
  50.     start_phase1
  51.     # 主循环
  52.     loop do
  53.       # 刷新游戏画面
  54.       Graphics.update
  55.       # 刷新输入信息
  56.       Input.update
  57.       # 刷新画面
  58.       update
  59.       # 如果画面切换的话就中断循环
  60.       if $scene != self
  61.         break
  62.       end
  63.     end
  64.     # 刷新地图
  65.     $game_map.refresh
  66.     # 准备过渡
  67.     Graphics.freeze
  68.     # 释放窗口
  69.     @actor_command_window.dispose
  70.     @party_command_window.dispose
  71.     @help_window.dispose
  72.     @status_window.dispose
  73.     @message_window.dispose
  74.     if @skill_window != nil
  75.       @skill_window.dispose
  76.     end
  77.     if @item_window != nil
  78.       @item_window.dispose
  79.     end
  80.     if @result_window != nil
  81.       @result_window.dispose
  82.     end
  83.     # 释放活动块
  84.     @spriteset.dispose
  85.     # 标题画面切换中的情况
  86.     if $scene.is_a?(Scene_Title)
  87.       # 淡入淡出画面
  88.       Graphics.transition
  89.       Graphics.freeze
  90.     end
  91.     # 战斗测试或者游戏结束以外的画面切换中的情况
  92.     if $BTEST and not $scene.is_a?(Scene_Gameover)
  93.       $scene = nil
  94.     end
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ● 胜负判定
  98.   #--------------------------------------------------------------------------
  99.   def judge
  100.     # 全灭判定是真、并且同伴人数为 0 的情况下
  101.     if $game_party.all_dead? or $game_party.actors.size == 0
  102.       # 允许失败的情况下
  103.       if $game_temp.battle_can_lose
  104.         # 还原为战斗开始前的 BGM
  105.         $game_system.bgm_play($game_temp.map_bgm)
  106.         # 战斗结束
  107.         battle_end(2)
  108.         # 返回 true
  109.         return true
  110.       end
  111.       # 设置游戏结束标志
  112.       $game_temp.gameover = true
  113.       # 返回 true
  114.       return true
  115.     end
  116.     # 如果存在任意 1 个敌人就返回 false
  117.     for enemy in $game_troop.enemies
  118.       if enemy.exist?
  119.         return false
  120.       end
  121.     end
  122.     # 开始结束战斗回合 (胜利)
  123.     start_phase5
  124.     # 返回 true
  125.     return true
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● 战斗结束
  129.   #     result : 結果 (0:胜利 1:失败 2:逃跑)
  130.   #--------------------------------------------------------------------------
  131.   def battle_end(result)
  132.     # 清除战斗中标志
  133.     $game_temp.in_battle = false
  134.     # 清除全体同伴的行动
  135.     $game_party.clear_actions
  136.     # 解除战斗用状态
  137.     for actor in $game_party.actors
  138.       actor.remove_states_battle
  139.     end
  140.     # 清除敌人
  141.     $game_troop.enemies.clear
  142.     # 调用战斗返回调用
  143.     if $game_temp.battle_proc != nil
  144.       $game_temp.battle_proc.call(result)
  145.       $game_temp.battle_proc = nil
  146.     end
  147.     # 切换到地图画面
  148.     $scene = Scene_Map.new
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ● 设置战斗事件
  152.   #--------------------------------------------------------------------------
  153.   def setup_battle_event
  154.     # 正在执行战斗事件的情况下
  155.     if $game_system.battle_interpreter.running?
  156.       return
  157.     end
  158.     # 搜索全部页的战斗事件
  159.     for index in 0...$data_troops[@troop_id].pages.size
  160.       # 获取事件页
  161.       page = $data_troops[@troop_id].pages[index]
  162.       # 事件条件可以参考 c
  163.       c = page.condition
  164.       # 没有指定任何条件的情况下转到下一页
  165.       unless c.turn_valid or c.enemy_valid or
  166.              c.actor_valid or c.switch_valid
  167.         next
  168.       end
  169.       # 执行完毕的情况下转到下一页
  170.       if $game_temp.battle_event_flags[index]
  171.         next
  172.       end
  173.       # 确认回合条件
  174.       if c.turn_valid
  175.         n = $game_temp.battle_turn
  176.         a = c.turn_a
  177.         b = c.turn_b
  178.         if (b == 0 and n != a) or
  179.            (b > 0 and (n < 1 or n < a or n % b != a % b))
  180.           next
  181.         end
  182.       end
  183.       # 确认敌人条件
  184.       if c.enemy_valid
  185.         enemy = $game_troop.enemies[c.enemy_index]
  186.         if enemy == nil or enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
  187.           next
  188.         end
  189.       end
  190.       # 确认角色条件
  191.       if c.actor_valid
  192.         actor = $game_actors[c.actor_id]
  193.         if actor == nil or actor.hp * 100.0 / actor.maxhp > c.actor_hp
  194.           next
  195.         end
  196.       end
  197.       # 确认开关条件
  198.       if c.switch_valid
  199.         if $game_switches[c.switch_id] == false
  200.           next
  201.         end
  202.       end
  203.       # 设置事件
  204.       $game_system.battle_interpreter.setup(page.list, 0)
  205.       # 本页的范围是 [战斗] 或 [回合] 的情况下
  206.       if page.span <= 1
  207.         # 设置执行结束标志
  208.         $game_temp.battle_event_flags[index] = true
  209.       end
  210.       return
  211.     end
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ● 刷新画面
  215.   #--------------------------------------------------------------------------
  216.   def update
  217.     # 执行战斗事件中的情况下
  218.     if $game_system.battle_interpreter.running?
  219.       # 刷新解释器
  220.       $game_system.battle_interpreter.update
  221.       # 强制行动的战斗者不存在的情况下
  222.       if $game_temp.forcing_battler == nil
  223.         # 执行战斗事件结束的情况下
  224.         unless $game_system.battle_interpreter.running?
  225.           # 继续战斗的情况下、再执行战斗事件的设置
  226.           unless judge
  227.             setup_battle_event
  228.           end
  229.         end
  230.         # 如果不是结束战斗回合的情况下
  231.         if @phase != 5
  232.           # 刷新状态窗口
  233.           @status_window.refresh
  234.         end
  235.       end
  236.     end
  237.     # 系统 (计时器)、刷新画面
  238.     $game_system.update
  239.     $game_screen.update
  240.     # 计时器为 0 的情况下
  241.     if $game_system.timer_working and $game_system.timer == 0
  242.       # 中断战斗
  243.       $game_temp.battle_abort = true
  244.     end
  245.     # 刷新窗口
  246.     @help_window.update
  247.     @party_command_window.update
  248.     @actor_command_window.update
  249.     @status_window.update
  250.     @message_window.update
  251.     # 刷新活动块
  252.     @spriteset.update
  253.     # 处理过渡中的情况下
  254.     if $game_temp.transition_processing
  255.       # 清除处理过渡中标志
  256.       $game_temp.transition_processing = false
  257.       # 执行过渡
  258.       if $game_temp.transition_name == ""
  259.         Graphics.transition(20)
  260.       else
  261.         Graphics.transition(40, "Graphics/Transitions/" +
  262.           $game_temp.transition_name)
  263.       end
  264.     end
  265.     # 显示信息窗口中的情况下
  266.     if $game_temp.message_window_showing
  267.       return
  268.     end
  269.     # 显示效果中的情况下
  270.     if @spriteset.effect?
  271.       return
  272.     end
  273.     # 游戏结束的情况下
  274.     if $game_temp.gameover
  275.       # 切换到游戏结束画面
  276.       $scene = Scene_Gameover.new
  277.       return
  278.     end
  279.     # 返回标题画面的情况下
  280.     if $game_temp.to_title
  281.       # 切换到标题画面
  282.       $scene = Scene_Title.new
  283.       return
  284.     end
  285.     # 中断战斗的情况下
  286.     if $game_temp.battle_abort
  287.       # 还原为战斗前的 BGM
  288.       $game_system.bgm_play($game_temp.map_bgm)
  289.       # 战斗结束
  290.       battle_end(1)
  291.       return
  292.     end
  293.     # 等待中的情况下
  294.     if @wait_count > 0
  295.       # 减少等待计数
  296.       @wait_count -= 1
  297.       return
  298.     end
  299.     # 强制行动的角色存在、
  300.     # 并且战斗事件正在执行的情况下
  301.     if $game_temp.forcing_battler == nil and
  302.        $game_system.battle_interpreter.running?
  303.       return
  304.     end
  305.     # 回合分支
  306.     case @phase
  307.     when 1  # 自由战斗回合
  308.       update_phase1
  309.     when 2  # 同伴命令回合
  310.       update_phase2
  311.     when 3  # 角色命令回合
  312.       update_phase3
  313.     when 4  # 主回合
  314.       update_phase4
  315.     when 5  # 战斗结束回合
  316.       update_phase5
  317.     end
  318.   end
  319. end


第2个改动的地方(自定义脚本):
RUBY 代码复制
  1. #==============================================================================
  2.  
  3. class Window_BattleCommand < Window_Selectable
  4.   #--------------------------------------------------------------------------
  5.   def initialize
  6.     super(0, 0, 180, 60)
  7.     self.contents = Bitmap.new(width - 32, height - 32)
  8.     self.back_opacity = 160
  9.     @commands = ["攻","技","防","物","逃"]
  10.     @item_max = 5
  11.     @column_max = 5
  12.     refresh
  13.     self.active = false
  14.     self.visible = false
  15.     self.index = 0
  16.   end
  17.   #---------------------------------------------------------------------------
  18.   def refresh
  19.     self.contents.clear
  20.     for i in 0...@item_max
  21.       draw_item(i)
  22.     end
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   def draw_item(index)
  26.     x = index % 5 * 30
  27.     y = index / 5 * 30
  28.     self.contents.font.color = normal_color
  29.     self.contents.draw_text(x, y, 30, 30, @commands[index], 1)
  30.   end
  31.   #--------------------------------------------------------------------------
  32.   def update_cursor_rect
  33.     x = index % 5 * 30
  34.     y = index / 5 * 30
  35.     self.cursor_rect.set(x, y, 30, 30)
  36.   end
  37. end
  38. #===============================================================================



第3个改动的地方(自定义脚本,逃跑脚本):
RUBY 代码复制
  1. #=======================================================================
  2. # ■ 本脚本来自 [url]www.66rpg.com[/url] 转载和使用时请保留此信息
  3. #-----------------------------------------------------------------------
  4. #   脚本功能:去掉战斗开始时候的 战斗/逃跑 的选择过程.
  5. #             并把逃跑加入到角色命令菜单当中
  6. #   脚本作者:后知后觉  2010-8-11 13:46:59
  7. #   使用方法:直接在 Main 前插入即可
  8. #=======================================================================
  9. class Window_PartyCommand < Window_Selectable
  10.   def visible=(value)
  11.     super(false)
  12.   end
  13.   def active=(value)
  14.     super(false)
  15.   end
  16. end
  17. class Scene_Battle
  18.   alias hzhj_old_start_phase1 start_phase1
  19.   def start_phase1
  20.     class << @actor_command_window
  21.       attr_reader :commands
  22.       def commands=(value)
  23.         @commands = value
  24.         @item_max = @commands.size
  25.         self.height = @item_max * 32 + 32
  26.         self.y = [self.y - 32, 0].max
  27.         self.contents.dispose
  28.         self.contents = Bitmap.new(width - 32, height - 32)
  29.         refresh
  30.       end
  31.     end
  32.     commands = @actor_command_window.commands
  33.     commands.push("撤退")
  34.     @actor_command_window.commands = commands
  35.     unless $game_temp.battle_can_escape
  36.       @actor_command_window.disable_item(commands.size - 1)
  37.     end
  38.     hzhj_old_start_phase1
  39.   end
  40.   alias hzhj_old_start_phase2 start_phase2
  41.   def start_phase2
  42.     hzhj_old_start_phase2
  43.     if @phase == 2
  44.       start_phase3
  45.     end
  46.   end
  47.   alias hzhj_old_update_phase3_basic_command update_phase3_basic_command
  48.   def update_phase3_basic_command
  49.     hzhj_old_update_phase3_basic_command
  50.     if Input.trigger?(13)
  51.       if @actor_command_window.index == @actor_command_window.commands.size - 1
  52.         unless $game_temp.battle_can_escape
  53.           $game_system.se_play($data_system.buzzer_se)
  54.           return
  55.         end
  56.         $game_system.se_play($data_system.decision_se)
  57.         update_phase2_escape
  58.         return
  59.       end
  60.     end
  61.   end
  62. end
  63.  
  64. #=======================================================================
  65. # ■ 本脚本来自 [url]www.66rpg.com[/url] 转载和使用时请保留此信息
  66. #=======================================================================
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
1053 小时
注册时间
2013-3-28
帖子
390

开拓者

8
发表于 2016-7-13 17:52:17 | 只看该作者
452234679 发表于 2016-7-13 16:24
您好,我仔细看了下,确实我的工程还修改了一个地方,我将战斗命令的排列方式改成横排了,所以冲突

但是 ...


还是没有问题,可不可以把Data文件夹里的Scripts.rxdata文件发给我
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
9
 楼主| 发表于 2016-7-15 00:05:50 | 只看该作者
陈大帅帅帅哥 发表于 2016-7-13 17:52
还是没有问题,可不可以把Data文件夹里的Scripts.rxdata文件发给我

您好,这是Scripts.rxdata,非常感谢您愿意帮我。

Scripts.rar

119.66 KB, 下载次数: 46

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
1053 小时
注册时间
2013-3-28
帖子
390

开拓者

10
发表于 2016-7-15 11:19:49 | 只看该作者
本帖最后由 陈大帅帅帅哥 于 2016-7-15 11:20 编辑

在*Plugin_BattleCommand的末尾(end之前)添加
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 项目无效化
  3.   #     index : 项目编号
  4.   #--------------------------------------------------------------------------
  5.   def disable_item(index)
  6.     draw_item(index)
  7.   end
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-13 20:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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