搜索附件  

战斗中换人.rar

 

战斗中换人,口袋口袋依旧是口袋:
以前曾经写了一个,貌似那个贴已经失踪到不懂哪里去了,所以今天重写了一个。而且之前写那个还可以玩围攻,这个是模仿口袋的战斗换人,功能就是那样,没得介绍,插入脚本后即可用。

脚本已经更新,请使用以下脚本,范例的脚本已经旧了。

范例:
  1. module LimBattlePlug# 队伍最大人数MaxPartySize = 8# 出战人数MaxBattlerSize = 1# 换人语句WordChangeBattler = "换人"# 换人时播放的动画AnimationChangeBattler = 26endclass Game_BattleAction  attr_accessor :change_to_battler  # 初始化  alias lbp_initialize initialize  def initialize    lbp_initialize    @change_to_battler = 0  end  # 欲更换角色编号  def set_change_battler    @kind = 3  end  # 判断行动是否为更换角色  def is_change_battler?    return (@kind == 3)  endendclass Game_Party  include LimBattlePlug  attr_reader :actors2  alias lpb_initialize initialize  def initialize    lpb_initialize    @actors2 = []  end  # 角色加入  def add_actor(actor_id)    actor = $game_actors[actor_id]    if @actors.size < MaxPartySize and not @actors.include?(actor)      @actors.push(actor)      $game_player.refresh    end  end  # 设置战斗的角色  def set_actor_to_battle    @actors2 = []    @actors.each do |actor|      @actors2.push(actor)    end    @actors = []    dead_actor = []    @actors2.each do |actor|      if !actor.dead?        @actors.push(actor)      else        dead_actor.push(actor)      end      break if @actors.size == MaxBattlerSize    end    if @actors.size < MaxBattlerSize      for actor in dead_actor        @actors.push(actor)        break if @actors.size == MaxBattlerSize      end    end  end  # 还原战斗的角色  def set_actor_to_normal    @actors = []    @actors2.each do |actor|      @actors.push(actor)    end  end  # 获取角色id数组  def get_actors_id    id = []    @actors.each{|actor|id.push(actor.id)}    return id  end  # 获取角色id数组  def get_actors2_id    id = []    @actors2.each{|actor|id.push(actor.id)}    return id  end  # 兑换角色  def change_actor(index,id)    @actors[index] = $game_actors[id]  end  # 全灭判定  def all_dead?    # 同伴人数为 0 的情况下    if $game_party.actors.size == 0      return false    end    # 同伴中无人 HP 在 0 以上    for actor in @actors2      if actor.hp > 0        return false      end    end    for actor in @actors      if actor.hp > 0        return false      end    end    # 全灭    return true  end  # 其他角色  def other_actors    actors = []    @actors2.each{|actor|actors.push(actor) if [email protected]?(actor)}    return actors  end  # 角色位置互换  def change_actor_pos(id1,id2)    actor_id = []    @actors.each do |actor|      actor_id.push(actor.id)    end    return if !actor_id.include?(id1) and !actor_id.include?(id2)    id1_index = id2_index = -1    (0...actor_id.size).each do |i|      if actor_id[i] == id1        id1_index = i      elsif actor_id[i] == id2        id2_index = i      end    end    temp_actor = @actors[id1_index]    @actors[id1_index] = @actors[id2_index]    @actors[id2_index] = temp_actor  endendclass Window_Actor < Window_Selectable  # 初始化  def initialize    super(0,64,640,256)    self.back_opacity = 160    refresh    self.index = -1    self.active = false  end  # 刷新  def refresh    @item_max = $game_party.actors2.size    @data = []    $game_party.actors.each do |actor|      @data.push(actor)    end    $game_party.actors2.each do |actor|      @data.push(actor) if [email protected]?(actor)    end    if self.contents != nil      self.contents.clear      self.contents = nil    end    self.contents = Bitmap.new(608,@data.size*32)    x = 4    y = 0    @data.each do |actor|      bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)      rect = Rect.new(0,0,bitmap.width/4,31)      self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)      draw_actor_name(actor,x+36,y)      draw_actor_state(actor,156,y)      draw_actor_hp(actor,x+256,y,96)      draw_actor_sp(actor,x+376,y,96)      if $game_party.actors.include?(actor)        self.contents.font.color = text_color(6)        cword = "出战"      else        self.contents.font.color = text_color(0)        cword = "待战"      end      self.contents.draw_text(x+496,y,60,32,cword)      y += 32    end  end  # 获取当前角色编号  def actor_id    return @data[self.index].id  end  # 刷新帮助  def update_help    @help_window.set_text(@data[self.index] == nil ?\                          "" : @data[self.index].name)  endendclass Scene_Battle  include LimBattlePlug  # 初始化  def initialize    $game_party.set_actor_to_battle  end  # 主处理  def main    # 初始化战斗用的各种暂时数据    $game_temp.in_battle = true    $game_temp.battle_turn = 0    $game_temp.battle_event_flags.clear    $game_temp.battle_abort = false    $game_temp.battle_main_phase = false    $game_temp.battleback_name = $game_map.battleback_name    $game_temp.forcing_battler = nil    # 初始化战斗用事件解释器    $game_system.battle_interpreter.setup(nil, 0)    # 准备队伍    @troop_id = $game_temp.battle_troop_id    $game_troop.setup(@troop_id)    # 生成角色命令窗口    s1 = $data_system.words.attack    s2 = $data_system.words.skill    s3 = $data_system.words.guard    s4 = $data_system.words.item    s5 = WordChangeBattler    @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4,s5])    @actor_command_window.y = 128    @actor_command_window.back_opacity = 160    @actor_command_window.active = false    @actor_command_window.visible = false    # 生成其它窗口    @party_command_window = Window_PartyCommand.new    @help_window = Window_Help.new    @help_window.back_opacity = 160    @help_window.visible = false    @status_window = Window_BattleStatus.new    @message_window = Window_Message.new    # 生成活动块    @spriteset = Spriteset_Battle.new    # 初始化等待计数    @wait_count = 0    # 执行过渡    if $data_system.battle_transition == ""      Graphics.transition(20)    else      Graphics.transition(40, "Graphics/Transitions/" +        $data_system.battle_transition)    end    # 开始自由战斗回合    start_phase1    # 主循环    loop do      # 刷新游戏画面      Graphics.update      # 刷新输入信息      Input.update      # 刷新画面      update      # 如果画面切换的话就中断循环      if $scene != self        break      end    end    # 刷新地图    $game_map.refresh    # 准备过渡    Graphics.freeze    # 释放窗口    @actor_command_window.dispose    @party_command_window.dispose    @help_window.dispose    @status_window.dispose    @message_window.dispose    if @skill_window != nil      @skill_window.dispose    end    if @item_window != nil      @item_window.dispose    end    if @actor_window != nil      @actor_window.dispose    end    if @result_window != nil      @result_window.dispose    end    # 释放活动块    @spriteset.dispose    # 标题画面切换中的情况    if $scene.is_a?(Scene_Title)      # 淡入淡出画面      Graphics.transition      Graphics.freeze    end    # 战斗测试或者游戏结束以外的画面切换中的情况    if $BTEST and not $scene.is_a?(Scene_Gameover)      $scene = nil    end  end  # 战斗结束  alias lpb_battle_end battle_end  def battle_end(n)    lpb_battle_end(n)    $game_party.set_actor_to_normal  end  # 开始回合3  alias lbp_start_phase3 start_phase3  def start_phase3    @changed_battler_id = []    lbp_start_phase3  end  # 刷新角色命令回合画面  def update_phase3    # 敌人光标有效的情况下    if @enemy_arrow != nil      update_phase3_enemy_select    # 角色光标有效的情况下    elsif @actor_arrow != nil      update_phase3_actor_select    # 特技窗口有效的情况下    elsif @skill_window != nil      update_phase3_skill_select    # 物品窗口有效的情况下    elsif @item_window != nil      update_phase3_item_select    elsif @actor_window != nil      update_phase3_battler_select    # 角色指令窗口有效的情况下    elsif @actor_command_window.active      update_phase3_basic_command    end  end  # 角色基本命令  def update_phase3_basic_command    # 按下 B 键的情况下    if Input.trigger?(Input::B)      # 演奏取消 SE      $game_system.se_play($data_system.cancel_se)      # 转向前一个角色的指令输入      phase3_prior_actor      return    end    # 按下 C 键的情况下    if Input.trigger?(Input::C)      # 角色指令窗口光标位置分之      case @actor_command_window.index      when 0  # 攻击        # 演奏确定 SE        $game_system.se_play($data_system.decision_se)        # 设置行动        @active_battler.current_action.kind = 0        @active_battler.current_action.basic = 0        # 开始选择敌人        start_enemy_select      when 1  # 特技        # 演奏确定 SE        $game_system.se_play($data_system.decision_se)        # 设置行动        @active_battler.current_action.kind = 1        # 开始选择特技        start_skill_select      when 2  # 防御        # 演奏确定 SE        $game_system.se_play($data_system.decision_se)        # 设置行动        @active_battler.current_action.kind = 0        @active_battler.current_action.basic = 1        # 转向下一位角色的指令输入        phase3_next_actor      when 3  # 物品        # 演奏确定 SE        $game_system.se_play($data_system.decision_se)        # 设置行动        @active_battler.current_action.kind = 2        # 开始选择物品        start_item_select      when 4 # 换人        $game_system.se_play($data_system.decision_se)        @active_battler.current_action.set_change_battler        start_battler_select      end      return    end  end  # 开始角色选择  def start_battler_select    @actor_window = Window_Actor.new    @actor_window.active = true    @actor_window.index = 0    @actor_window.help_window = @help_window    @actor_command_window.active = false    @actor_command_window.visible = false  end  # 结束角色选择  def end_battler_select    @actor_window.dispose    @actor_window = nil    @help_window.visible = false    @actor_command_window.active = true    @actor_command_window.visible = true  end  # 刷新角色选择  def update_phase3_battler_select    @actor_window.visible = true    @actor_window.update    if Input.trigger?(Input::B)      $game_system.se_play($data_system.cancel_se)      end_battler_select      return    end    if Input.trigger?(Input::C)      actor_id = @actor_window.actor_id      if $game_party.get_actors_id.include?(actor_id) or         $game_actors[actor_id].dead? or          @changed_battler_id.include?(actor_id)        $game_system.se_play($data_system.buzzer_se)        return      end      $game_system.se_play($data_system.decision_se)      @active_battler.current_action.change_to_battler = actor_id      @changed_battler_id.push(actor_id)      end_battler_select      phase3_next_actor      return    end  end  # 行动方动画  def update_phase4_step3    if @active_battler.current_action.is_change_battler?      @animation1_id = AnimationChangeBattler      @target_battlers = []    end    # 行动方动画 (ID 为 0 的情况下是白色闪烁)    if @animation1_id == 0      @active_battler.white_flash = true    else      @active_battler.animation_id = @animation1_id      @active_battler.animation_hit = true    end    # 移至步骤 4    @phase4_step = 4  end  # 对象方动画  def update_phase4_step4    if @active_battler.current_action.is_change_battler?      actor1_id = @active_battler.current_action.change_to_battler      actor2_id = @active_battler.id      (0...$game_party.actors.size).each do |i|        if $game_party.actors[i].id == actor2_id          $game_party.change_actor(i,actor1_id)          @active_battler = $game_actors[actor1_id]          @status_window.refresh        end      end    end    # 对像方动画    for target in @target_battlers      target.animation_id = @animation2_id      target.animation_hit = (target.damage != "Miss")    end    # 限制动画长度、最低 8 帧    @wait_count = 8    # 移至步骤 5    @phase4_step = 5  end  # 公共事件  def update_phase4_step6    @target_battlers.each do |target|      if target.is_a?(Game_Actor) and target.dead? and         !$game_party.other_actors.all?{|actor|actor.dead?}        @actor_window = Window_Actor.new        @actor_window.index = 0        @actor_window.active = true        @actor_window.help_window = @help_window        actor_id = -1        loop do          Graphics.update          Input.update          @actor_window.update          if Input.trigger?(Input::C)            actor = $game_actors[@actor_window.actor_id]            if actor.dead? or               (@changed_battler_id.include?(actor.id) and                 target.current_action.change_to_battler != actor.id) or               $game_party.actors.include?(actor)              $game_system.se_play($data_system.buzzer_se)            else              actor_id = actor.id            end          end          break if actor_id >= 0        end        @actor_window.visible = false        @actor_window.dispose        @actor_window = nil        @help_window.visible = false        (0...$game_party.actors.size).each do |i|          if $game_party.actors[i].id == target.id            $game_party.change_actor(i,actor_id)            @status_window.refresh          end        end      end    end    # 清除强制行动对像的战斗者    $game_temp.forcing_battler = nil    # 公共事件 ID 有效的情况下    if @common_event_id > 0      # 设置事件      common_event = $data_common_events[@common_event_id]      $game_system.battle_interpreter.setup(common_event.list, 0)    end    # 移至步骤 1    @phase4_step = 1  endendclass Window_MenuStatus  def refresh    self.contents.clear    @item_max = $game_party.actors.size    for i in 0...$game_party.actors.size      x = 4      y = i * 32      actor = $game_party.actors[i]      bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)      rect = Rect.new(0,0,bitmap.width/4,31)      self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)      draw_actor_name(actor, x+36, y)      draw_actor_state(actor, x + 136,y)      draw_actor_hp(actor, x + 236, y,96)      draw_actor_sp(actor, x + 336, y,96)    end  end  def update_cursor_rect    super  endend复制代码
复制代码
            本帖来自P1论坛作者enghao_lim,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=163143  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2024-9-21 16:38 , Processed in 0.037835 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部