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

Project1

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

[已经解决] 置顶中【39.如何在战斗中换人,像口袋精灵一样】中BUG问题

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
359
在线时间
5 小时
注册时间
2011-7-12
帖子
4
跳转到指定楼层
1
发表于 2011-7-16 14:02:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
http://rpg.blue/thread-163143-1-1.html

首先是非战斗的情况下要怎么换人物顺序呢
其次当出场人数超过一人,比如4人,而排在前4位的人物中有角色处于战斗不能的状态,那么进入战斗以后战斗不能的角色始终占着一个出场人物的位置而且不能被换人
而且在这种情况下对存活的角色玩家换人会有一定几率脚本报错(我出现过一次)
  1. module LimBattlePlug


  2. # 队伍最大人数

  3. MaxPartySize = 8


  4. # 出战人数

  5. MaxBattlerSize = 1


  6. # 换人语句

  7. WordChangeBattler = "换人"


  8. # 换人时播放的动画

  9. AnimationChangeBattler = 26


  10. end


  11. class Game_BattleAction

  12.   attr_accessor :change_to_battler

  13.   # 初始化

  14.   alias lbp_initialize initialize

  15.   def initialize

  16.     lbp_initialize

  17.     @change_to_battler = 0

  18.   end

  19.   # 欲更换角色编号

  20.   def set_change_battler

  21.     @kind = 3

  22.   end

  23.   # 判断行动是否为更换角色

  24.   def is_change_battler?

  25.     return (@kind == 3)

  26.   end

  27. end


  28. class Game_Party

  29.   include LimBattlePlug

  30.   attr_reader :actors2

  31.   alias lpb_initialize initialize

  32.   def initialize

  33.     lpb_initialize

  34.     @actors2 = []

  35.   end

  36.   # 角色加入

  37.   def add_actor(actor_id)

  38.     actor = $game_actors[actor_id]

  39.     if @actors.size < MaxPartySize and not @actors.include?(actor)

  40.       @actors.push(actor)

  41.       $game_player.refresh

  42.     end

  43.   end

  44.   # 设置战斗的角色

  45.   def set_actor_to_battle

  46.     @actors2 = []

  47.     @actors.each do |actor|

  48.       @actors2.push(actor)

  49.     end

  50.     @actors = []

  51.     @actors2.each do |actor|

  52.       @actors.push(actor)

  53.       break if @actors.size == MaxBattlerSize

  54.     end

  55.   end

  56.   # 还原战斗的角色

  57.   def set_actor_to_normal

  58.     @actors = []

  59.     @actors2.each do |actor|

  60.       @actors.push(actor)

  61.     end

  62.   end

  63.   # 获取角色id数组

  64.   def get_actors_id

  65.     id = []

  66.     @actors.each{|actor|id.push(actor.id)}

  67.     return id

  68.   end

  69.   # 获取角色id数组

  70.   def get_actors2_id

  71.     id = []

  72.     @actors2.each{|actor|id.push(actor.id)}

  73.     return id

  74.   end

  75.   # 兑换角色

  76.   def change_actor(index,id)

  77.     @actors[index] = $game_actors[id]

  78.   end

  79.   # 全灭判定

  80.   def all_dead?

  81.     # 同伴人数为 0 的情况下

  82.     if $game_party.actors.size == 0

  83.       return false

  84.     end

  85.     # 同伴中无人 HP 在 0 以上

  86.     for actor in @actors2

  87.       if actor.hp > 0

  88.         return false

  89.       end

  90.     end

  91.     for actor in @actors

  92.       if actor.hp > 0

  93.         return false

  94.       end

  95.     end

  96.     # 全灭

  97.     return true

  98.   end

  99.   # 其他角色

  100.   def other_actors

  101.     actors = []

  102.     @actors2.each{|actor|actors.push(actor) if [email protected]?(actor)}

  103.     return actors

  104.   end

  105.   # 角色位置互换

  106.   def change_actor_pos(id1,id2)

  107.     actor_id = []

  108.     @actors.each do |actor|

  109.       actor_id.push(actor.id)

  110.     end

  111.     return if !actor_id.include?(id1) and !actor_id.include?(id2)

  112.     id1_index = id2_index = -1

  113.     (0...actor_id.size).each do |i|

  114.       if actor_id[i] == id1

  115.         id1_index = i

  116.       elsif actor_id[i] == id2

  117.         id2_index = i

  118.       end

  119.     end

  120.     temp_actor = @actors[id1_index]

  121.     @actors[id1_index] = @actors[id2_index]

  122.     @actors[id2_index] = temp_actor

  123.   end

  124. end


  125. class Window_Actor < Window_Selectable

  126.   # 初始化

  127.   def initialize

  128.     super(0,64,640,256)

  129.     self.back_opacity = 160

  130.     refresh

  131.     self.index = -1

  132.     self.active = false

  133.   end

  134.   # 刷新

  135.   def refresh

  136.     @item_max = $game_party.actors2.size

  137.     @data = []

  138.     $game_party.actors.each do |actor|

  139.       @data.push(actor)

  140.     end

  141.     $game_party.actors2.each do |actor|

  142.       @data.push(actor) if [email protected]?(actor)

  143.     end

  144.     if self.contents != nil

  145.       self.contents.clear

  146.       self.contents = nil

  147.     end

  148.     self.contents = Bitmap.new(608,@data.size*32)

  149.     x = 4

  150.     y = 0

  151.     @data.each do |actor|

  152.       bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)

  153.       rect = Rect.new(0,0,bitmap.width/4,31)

  154.       self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)

  155.       draw_actor_name(actor,x+36,y)

  156.       draw_actor_state(actor,156,y)

  157.       draw_actor_hp(actor,x+256,y,96)

  158.       draw_actor_sp(actor,x+376,y,96)

  159.       if $game_party.actors.include?(actor)

  160.         self.contents.font.color = text_color(6)

  161.         cword = "出战"

  162.       else

  163.         self.contents.font.color = text_color(0)

  164.         cword = "待战"

  165.       end

  166.       self.contents.draw_text(x+496,y,60,32,cword)

  167.       y += 32

  168.     end

  169.   end

  170.   # 获取当前角色编号

  171.   def actor_id

  172.     return @data[self.index].id

  173.   end

  174.   # 刷新帮助

  175.   def update_help

  176.     @help_window.set_text(@data[self.index] == nil ?\

  177.                           "" : @data[self.index].name)

  178.   end

  179. end


  180. class Scene_Battle

  181.   include LimBattlePlug

  182.   # 初始化

  183.   def initialize

  184.     $game_party.set_actor_to_battle

  185.   end

  186.   # 主处理

  187.   def main

  188.     # 初始化战斗用的各种暂时数据

  189.     $game_temp.in_battle = true

  190.     $game_temp.battle_turn = 0

  191.     $game_temp.battle_event_flags.clear

  192.     $game_temp.battle_abort = false

  193.     $game_temp.battle_main_phase = false

  194.     $game_temp.battleback_name = $game_map.battleback_name

  195.     $game_temp.forcing_battler = nil

  196.     # 初始化战斗用事件解释器

  197.     $game_system.battle_interpreter.setup(nil, 0)

  198.     # 准备队伍

  199.     @troop_id = $game_temp.battle_troop_id

  200.     $game_troop.setup(@troop_id)

  201.     # 生成角色命令窗口

  202.     s1 = $data_system.words.attack

  203.     s2 = $data_system.words.skill

  204.     s3 = $data_system.words.guard

  205.     s4 = $data_system.words.item

  206.     s5 = WordChangeBattler

  207.     @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4,s5])

  208.     @actor_command_window.y = 128

  209.     @actor_command_window.back_opacity = 160

  210.     @actor_command_window.active = false

  211.     @actor_command_window.visible = false

  212.     # 生成其它窗口

  213.     @party_command_window = Window_PartyCommand.new

  214.     @help_window = Window_Help.new

  215.     @help_window.back_opacity = 160

  216.     @help_window.visible = false

  217.     @status_window = Window_BattleStatus.new

  218.     @message_window = Window_Message.new

  219.     # 生成活动块

  220.     @spriteset = Spriteset_Battle.new

  221.     # 初始化等待计数

  222.     @wait_count = 0

  223.     # 执行过渡

  224.     if $data_system.battle_transition == ""

  225.       Graphics.transition(20)

  226.     else

  227.       Graphics.transition(40, "Graphics/Transitions/" +

  228.         $data_system.battle_transition)

  229.     end

  230.     # 开始自由战斗回合

  231.     start_phase1

  232.     # 主循环

  233.     loop do

  234.       # 刷新游戏画面

  235.       Graphics.update

  236.       # 刷新输入信息

  237.       Input.update

  238.       # 刷新画面

  239.       update

  240.       # 如果画面切换的话就中断循环

  241.       if $scene != self

  242.         break

  243.       end

  244.     end

  245.     # 刷新地图

  246.     $game_map.refresh

  247.     # 准备过渡

  248.     Graphics.freeze

  249.     # 释放窗口

  250.     @actor_command_window.dispose

  251.     @party_command_window.dispose

  252.     @help_window.dispose

  253.     @status_window.dispose

  254.     @message_window.dispose

  255.     if @skill_window != nil

  256.       @skill_window.dispose

  257.     end

  258.     if @item_window != nil

  259.       @item_window.dispose

  260.     end

  261.     if @actor_window != nil

  262.       @actor_window.dispose

  263.     end

  264.     if @result_window != nil

  265.       @result_window.dispose

  266.     end

  267.     # 释放活动块

  268.     @spriteset.dispose

  269.     # 标题画面切换中的情况

  270.     if $scene.is_a?(Scene_Title)

  271.       # 淡入淡出画面

  272.       Graphics.transition

  273.       Graphics.freeze

  274.     end

  275.     # 战斗测试或者游戏结束以外的画面切换中的情况

  276.     if $BTEST and not $scene.is_a?(Scene_Gameover)

  277.       $scene = nil

  278.     end

  279.   end

  280.   # 战斗结束

  281.   alias lpb_battle_end battle_end

  282.   def battle_end(n)

  283.     lpb_battle_end(n)

  284.     $game_party.set_actor_to_normal

  285.   end

  286.   # 开始回合3

  287.   alias lbp_start_phase3 start_phase3

  288.   def start_phase3

  289.     @changed_battler_id = []

  290.     lbp_start_phase3

  291.   end

  292.   # 刷新角色命令回合画面

  293.   def update_phase3

  294.     # 敌人光标有效的情况下

  295.     if @enemy_arrow != nil

  296.       update_phase3_enemy_select

  297.     # 角色光标有效的情况下

  298.     elsif @actor_arrow != nil

  299.       update_phase3_actor_select

  300.     # 特技窗口有效的情况下

  301.     elsif @skill_window != nil

  302.       update_phase3_skill_select

  303.     # 物品窗口有效的情况下

  304.     elsif @item_window != nil

  305.       update_phase3_item_select

  306.     elsif @actor_window != nil

  307.       update_phase3_battler_select

  308.     # 角色指令窗口有效的情况下

  309.     elsif @actor_command_window.active

  310.       update_phase3_basic_command

  311.     end

  312.   end

  313.   # 角色基本命令

  314.   def update_phase3_basic_command

  315.     # 按下 B 键的情况下

  316.     if Input.trigger?(Input::B)

  317.       # 演奏取消 SE

  318.       $game_system.se_play($data_system.cancel_se)

  319.       # 转向前一个角色的指令输入

  320.       phase3_prior_actor

  321.       return

  322.     end

  323.     # 按下 C 键的情况下

  324.     if Input.trigger?(Input::C)

  325.       # 角色指令窗口光标位置分之

  326.       case @actor_command_window.index

  327.       when 0  # 攻击

  328.         # 演奏确定 SE

  329.         $game_system.se_play($data_system.decision_se)

  330.         # 设置行动

  331.         @active_battler.current_action.kind = 0

  332.         @active_battler.current_action.basic = 0

  333.         # 开始选择敌人

  334.         start_enemy_select

  335.       when 1  # 特技

  336.         # 演奏确定 SE

  337.         $game_system.se_play($data_system.decision_se)

  338.         # 设置行动

  339.         @active_battler.current_action.kind = 1

  340.         # 开始选择特技

  341.         start_skill_select

  342.       when 2  # 防御

  343.         # 演奏确定 SE

  344.         $game_system.se_play($data_system.decision_se)

  345.         # 设置行动

  346.         @active_battler.current_action.kind = 0

  347.         @active_battler.current_action.basic = 1

  348.         # 转向下一位角色的指令输入

  349.         phase3_next_actor

  350.       when 3  # 物品

  351.         # 演奏确定 SE

  352.         $game_system.se_play($data_system.decision_se)

  353.         # 设置行动

  354.         @active_battler.current_action.kind = 2

  355.         # 开始选择物品

  356.         start_item_select

  357.       when 4 # 换人

  358.         $game_system.se_play($data_system.decision_se)

  359.         @active_battler.current_action.set_change_battler

  360.         start_battler_select

  361.       end

  362.       return

  363.     end

  364.   end

  365.   # 开始角色选择

  366.   def start_battler_select

  367.     @actor_window = Window_Actor.new

  368.     @actor_window.active = true

  369.     @actor_window.index = 0

  370.     @actor_window.help_window = @help_window

  371.     @actor_command_window.active = false

  372.     @actor_command_window.visible = false

  373.   end

  374.   # 结束角色选择

  375.   def end_battler_select

  376.     @actor_window.dispose

  377.     @actor_window = nil

  378.     @help_window.visible = false

  379.     @actor_command_window.active = true

  380.     @actor_command_window.visible = true

  381.   end

  382.   # 刷新角色选择

  383.   def update_phase3_battler_select

  384.     @actor_window.visible = true

  385.     @actor_window.update

  386.     if Input.trigger?(Input::B)

  387.       $game_system.se_play($data_system.cancel_se)

  388.       end_battler_select

  389.       return

  390.     end

  391.     if Input.trigger?(Input::C)

  392.       actor_id = @actor_window.actor_id

  393.       if $game_party.get_actors_id.include?(actor_id) or

  394.          $game_actors[actor_id].dead? or
  395.          @changed_battler_id.include?(actor_id)

  396.         $game_system.se_play($data_system.buzzer_se)

  397.         return

  398.       end

  399.       $game_system.se_play($data_system.decision_se)

  400.       @active_battler.current_action.change_to_battler = actor_id

  401.       @changed_battler_id.push(actor_id)

  402.       end_battler_select

  403.       phase3_next_actor

  404.       return

  405.     end

  406.   end

  407.   # 行动方动画

  408.   def update_phase4_step3

  409.     if @active_battler.current_action.is_change_battler?

  410.       @animation1_id = AnimationChangeBattler

  411.       @target_battlers = []

  412.     end

  413.     # 行动方动画 (ID 为 0 的情况下是白色闪烁)

  414.     if @animation1_id == 0

  415.       @active_battler.white_flash = true

  416.     else

  417.       @active_battler.animation_id = @animation1_id

  418.       @active_battler.animation_hit = true

  419.     end

  420.     # 移至步骤 4

  421.     @phase4_step = 4

  422.   end

  423.   # 对象方动画

  424.   def update_phase4_step4

  425.     if @active_battler.current_action.is_change_battler?

  426.       actor1_id = @active_battler.current_action.change_to_battler

  427.       actor2_id = @active_battler.id

  428.       (0...$game_party.actors.size).each do |i|

  429.         if $game_party.actors[i].id == actor2_id

  430.           $game_party.change_actor(i,actor1_id)

  431.           @active_battler = $game_actors[actor1_id]

  432.           @status_window.refresh

  433.         end

  434.       end

  435.     end

  436.     # 对像方动画

  437.     for target in @target_battlers

  438.       target.animation_id = @animation2_id

  439.       target.animation_hit = (target.damage != "Miss")

  440.     end

  441.     # 限制动画长度、最低 8 帧

  442.     @wait_count = 8

  443.     # 移至步骤 5

  444.     @phase4_step = 5

  445.   end

  446.   # 公共事件

  447.   def update_phase4_step6

  448.     @target_battlers.each do |target|

  449.       if target.is_a?(Game_Actor) and target.dead? and

  450.          !$game_party.other_actors.all?{|actor|actor.dead?}

  451.         @actor_window = Window_Actor.new

  452.         @actor_window.index = 0

  453.         @actor_window.active = true

  454.         @actor_window.help_window = @help_window

  455.         actor_id = -1

  456.         loop do

  457.           Graphics.update

  458.           Input.update

  459.           @actor_window.update

  460.           if Input.trigger?(Input::C)

  461.             actor = $game_actors[@actor_window.actor_id]

  462.             if actor.dead? or

  463.                (@changed_battler_id.include?(actor.id) and
  464.                 target.current_action.change_to_battler != actor.id) or

  465.                $game_party.actors.include?(actor)

  466.               $game_system.se_play($data_system.buzzer_se)

  467.             else

  468.               actor_id = actor.id

  469.             end

  470.           end

  471.           break if actor_id >= 0

  472.         end

  473.         @actor_window.visible = false

  474.         @actor_window.dispose

  475.         @actor_window = nil

  476.         @help_window.visible = false

  477.         (0...$game_party.actors.size).each do |i|

  478.           if $game_party.actors[i].id == target.id

  479.             $game_party.change_actor(i,actor_id)

  480.             @status_window.refresh

  481.           end

  482.         end

  483.       end

  484.     end

  485.     # 清除强制行动对像的战斗者

  486.     $game_temp.forcing_battler = nil

  487.     # 公共事件 ID 有效的情况下

  488.     if @common_event_id > 0

  489.       # 设置事件

  490.       common_event = $data_common_events[@common_event_id]

  491.       $game_system.battle_interpreter.setup(common_event.list, 0)

  492.     end

  493.     # 移至步骤 1

  494.     @phase4_step = 1

  495.   end

  496. end


  497. class Window_MenuStatus

  498.   def refresh

  499.     self.contents.clear

  500.     @item_max = $game_party.actors.size

  501.     for i in 0...$game_party.actors.size

  502.       x = 4

  503.       y = i * 32

  504.       actor = $game_party.actors[i]

  505.       bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)

  506.       rect = Rect.new(0,0,bitmap.width/4,31)

  507.       self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)

  508.       draw_actor_name(actor, x+36, y)

  509.       draw_actor_state(actor, x + 136,y)

  510.       draw_actor_hp(actor, x + 236, y,96)

  511.       draw_actor_sp(actor, x + 336, y,96)

  512.     end

  513.   end

  514.   def update_cursor_rect

  515.     super

  516.   end

  517. end
复制代码

评分

参与人数 1星屑 -30 收起 理由
禾西 -30 乱用标签和主题

查看全部评分

Lv4.逐梦者

梦石
0
星屑
7981
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
2
发表于 2011-7-16 23:48:03 | 只看该作者
身为作者我道歉一下……==
这个问题之前就解决的了,不过望了更新脚本……抱歉……
找到注释这行开始的脚本,到下一个注释前的原脚本替换以下脚本:
  1.   # 设置战斗的角色
  2.   def set_actor_to_battle
  3.     @actors2 = []
  4.     @actors.each do |actor|
  5.       @actors2.push(actor)
  6.     end
  7.     @actors = []
  8.     dead_actor = []
  9.     @actors2.each do |actor|
  10.       if !actor.dead?
  11.         @actors.push(actor)
  12.       else
  13.         dead_actor.push(actor)
  14.       end
  15.       break if @actors.size == MaxBattlerSize
  16.     end
  17.     if @actors.size < MaxBattlerSize
  18.       for actor in dead_actor
  19.         @actors.push(actor)
  20.         break if @actors.size == MaxBattlerSize
  21.       end
  22.     end
  23.   end
复制代码
至于你那个几率出问题的我试了几十次还是没试到……要是在出现你就尽量记得当时的情况,比如说有几人,然后记下出问题的提示句子。

评分

参与人数 1星屑 +200 梦石 +2 收起 理由
「旅」 + 200 + 2 认可答案,恭喜你获得由66RPG提供的精美好.

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 12:44

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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