查看: 4229|回复: 2

[原创发布] 恐惧剑刃版CP制战斗

[复制链接]

薄凉看客

梦石
0
星屑
50
在线时间
1269 小时
注册时间
2010-6-20
回帖
1223
发表于 2014-11-7 00:05:47 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 恐惧剑刃 于 2014-11-7 19:38 编辑

先放截图
2.jpg
1.jpg



我的思路仅供参考。
再次更新,这次测试没发现问题。。

其余问题:
1. fill_rect过多
2. 敌人CP没有显示
等
太赖暂时不考虑修正 。。


工程
CP.zip (230.77 KB, 下载次数: 112)

CP
[pre lang="ruby" line="1"]#------------------------------------------------------------------------------
# - CP战斗
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# - 设置
#------------------------------------------------------------------------------
module CP
  Speed = 1                                # 速度
  Width = 120                              # CP条宽度
  Height = 6                               # CP条高度
  Back_Color = Color.new(0, 0, 0)          # CP条背景色
  Cp_Color = Color.new(255, 255, 64)       # CP条填充色
  Cp_Color_2 = Color.new(255, 128, 255)    # CP条填充色(满)
end

#------------------------------------------------------------------------------
# - 战斗者CP属性
#------------------------------------------------------------------------------
class Game_Battler
  attr_accessor :cp, :cp_speed
  alias initialize_cp_old initialize
  def initialize
    @cp = 0
    @cp_speed = 0
    initialize_cp_old
  end
end

#------------------------------------------------------------------------------
# - 战斗场景
#------------------------------------------------------------------------------
class Scene_Battle
  #----------------------------------------------------------------------------
  # - 主方法
  #----------------------------------------------------------------------------
  alias main_cp_old main
  def main
    @cp_viewport = Viewport.new(0, 465, 640, CP::Height)
    @cp_viewport.z = 9999
    @cp_sprite = Sprite.new(@cp_viewport)
    @cp_sprite.bitmap = Bitmap.new(640, CP::Height)
    cp_bar
    main_cp_old
    @cp_sprite.bitmap.dispose
    @cp_sprite.dispose
    @cp_viewport.dispose
  end
  #--------------------------------------------------------------------------
  # - 速度
  #--------------------------------------------------------------------------
  def cp_speed
    battlers_agi = []
    for battler in $game_party.actors + $game_troop.enemies
      battlers_agi << battler.agi
    end
    min_agi = battlers_agi.min
    for battler in $game_party.actors + $game_troop.enemies
      battler.cp_speed = battler.agi * 10 / min_agi * CP::Speed / 5
    end
  end
  #----------------------------------------------------------------------------
  # - 描绘CP
  #----------------------------------------------------------------------------
  def cp_bar
    @cp_sprite.bitmap.clear
    for index in 0...$game_party.actors.size
      actor = $game_party.actors[index]
      if actor.dead?
        actor.cp = 0
        next
      end
      x = (index + 1) * 20 + index * 140
      width = CP::Width
      height = CP::Height
      back_color = CP::Back_Color
      @cp_sprite.bitmap.fill_rect(x, 0, width, height, back_color)
      if actor.cp >= width - 1
        cp_color = CP::Cp_Color_2
        wid = width - 1
      else
        cp_color = CP::Cp_Color
        wid = actor.cp
      end
      @cp_sprite.bitmap.fill_rect(x + 1, 1, wid, height - 2, cp_color)
    end
  end
end

class Scene_Battle
  alias start_phase2_cp_old start_phase2
  def start_phase2
    cp_bar
    start_phase2_cp_old
  end
  def make_action_orders
    @action_battlers = [@active_battler_cp]
  end
  alias update_phase4_step6_cp_old update_phase4_step6
  def update_phase4_step6
    update_phase4_step6_cp_old
    @active_battler.cp = 0
  end
end[/pre]

Scene_Battle 3
[pre lang="ruby" line="1"]#==============================================================================
# ■ Scene_Battle (分割定义 3)
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 开始角色命令回合
  #--------------------------------------------------------------------------
  def start_phase3
    # 转移到回合 3
    @phase = 3
    # 设置角色为非选择状态
    @actor_index = -1
    @active_battler = nil
    @active_battler_cp = nil
    # 同伴指令窗口无效化
    @party_command_window.active = false
    @party_command_window.visible = false
  end
  #--------------------------------------------------------------------------
  # ● 设置角色指令窗口
  #--------------------------------------------------------------------------
  def phase3_setup_command_window
    if !@active_battler_cp.is_a?(Game_Actor)
      start_phase4 # 回合4
      @phase = 4
      return
    end
    # 角色指令窗口无效化
    @actor_command_window.active = true
    @actor_command_window.visible = true
    @actor_command_window.x = $game_party.actors.index(@active_battler_cp) * 160
    # 设置索引为 0
    @actor_command_window.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (角色命令回合)
  #--------------------------------------------------------------------------
  def update_phase3
    if judge # 判断胜负
      return
    end
    if @active_battler_cp == nil # 可以刷新
      cp_speed # 新速度
      cp_bar # 刷新cp条
      for battler in $game_party.actors + $game_troop.enemies
        battler.cp += battler.cp_speed
        if battler.cp >= CP::Width - 1
          cp_bar # 变色
          @active_battler_cp = battler # 输入命令者
          phase3_setup_command_window
        end
      end
    end
    # 敌人光标有效的情况下
    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_command_window.active
      update_phase3_basic_command
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (角色命令回合 : 基本命令)
  #--------------------------------------------------------------------------
  def update_phase3_basic_command
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 角色指令窗口光标位置分之
      case @actor_command_window.index
      when 0  # 攻击
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 设置行动
        @active_battler_cp.current_action.kind = 0
        @active_battler_cp.current_action.basic = 0
        # 开始选择敌人
        start_enemy_select
      when 1  # 特技
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 设置行动
        @active_battler_cp.current_action.kind = 1
        # 开始选择特技
        start_skill_select
      when 2  # 防御
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 设置行动
        @active_battler_cp.current_action.kind = 0
        @active_battler_cp.current_action.basic = 1
        start_phase4
        @phase = 4
      when 3  # 物品
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 设置行动
        @active_battler_cp.current_action.kind = 2
        # 开始选择物品
        start_item_select
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (角色命令回合 : 选择特技)
  #--------------------------------------------------------------------------
  def update_phase3_skill_select
    # 设置特技窗口为可视状态
    @skill_window.visible = true
    # 刷新特技窗口
    @skill_window.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 结束特技选择
      end_skill_select
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取特技选择窗口现在选择的特技的数据
      @skill = @skill_window.skill
      # 无法使用的情况下
      if @skill == nil or not @active_battler_cp.skill_can_use?(@skill.id)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 设置行动
      @active_battler_cp.current_action.skill_id = @skill.id
      # 设置特技窗口为不可见状态
      @skill_window.visible = false
      if ![1, 3, 5].include?(@skill.scope)
        start_phase4
        @phase = 4
        return
      end
      # 效果范围是敌单体的情况下
      if @skill.scope == 1
        # 开始选择敌人
        start_enemy_select
      # 效果范围是我方单体的情况下
      elsif @skill.scope == 3 or @skill.scope == 5
        # 开始选择角色
        start_actor_select
      # 效果范围不是单体的情况下
      else
        # 选择特技结束
        end_skill_select
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (角色命令回合 : 选择物品)
  #--------------------------------------------------------------------------
  def update_phase3_item_select
    # 设置物品窗口为可视状态
    @item_window.visible = true
    # 刷新物品窗口
    @item_window.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 选择物品结束
      end_item_select
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取物品窗口现在选择的物品资料
      @item = @item_window.item
      # 无法使用的情况下
      unless $game_party.item_can_use?(@item.id)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 设置行动
      @active_battler_cp.current_action.item_id = @item.id
      # 设置物品窗口为不可见状态
      @item_window.visible = false
      if ![1, 3, 5].include?(@item.scope)
        start_phase4
        @phase = 4
        return
      end
      # 效果范围是敌单体的情况下
      if @item.scope == 1
        # 开始选择敌人
        start_enemy_select
      # 效果范围是我方单体的情况下
      elsif @item.scope == 3 or @item.scope == 5
        # 开始选择角色
        start_actor_select
      # 效果范围不是单体的情况下
      else
        # 物品选择结束
        end_item_select
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面画面 (角色命令回合 : 选择敌人)
  #--------------------------------------------------------------------------
  def update_phase3_enemy_select
    # 刷新敌人箭头
    @enemy_arrow.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 选择敌人结束
      end_enemy_select
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 设置行动
      @active_battler_cp.current_action.target_index = @enemy_arrow.index
      # 选择敌人结束
      end_enemy_select
      # 显示特技窗口中的情况下
      if @skill_window != nil
        # 结束特技选择
        end_skill_select
      end
      # 显示物品窗口的情况下
      if @item_window != nil
        # 结束物品选择
        end_item_select
      end
      start_phase4
      @phase = 4
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 画面更新 (角色指令回合 : 选择角色)
  #--------------------------------------------------------------------------
  def update_phase3_actor_select
    # 刷新角色箭头
    @actor_arrow.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 选择角色结束
      end_actor_select
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 设置行动
      @active_battler_cp.current_action.target_index = @actor_arrow.index
      # 选择角色结束
      end_actor_select
      # 显示特技窗口中的情况下
      if @skill_window != nil
        # 结束特技选择
        end_skill_select
      end
      # 显示物品窗口的情况下
      if @item_window != nil
        # 结束物品选择
        end_item_select
      end
      start_phase4
      @phase = 4
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 开始选择特技
  #--------------------------------------------------------------------------
  def start_skill_select
    # 生成特技窗口
    @skill_window = Window_Skill.new(@active_battler_cp)
    # 关联帮助窗口
    @skill_window.help_window = @help_window
    # 无效化角色指令窗口
    @actor_command_window.active = false
    @actor_command_window.visible = false
  end
end
[/pre]

评分

参与人数 2星屑 +25 收起 理由
【凌】 + 10 我很赞同
路路 + 15 我很赞同

查看全部评分

路路 该用户已被删除
发表于 2014-11-7 01:08:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2014-11-7 09:21:27 | 显示全部楼层
cp值的计算公式好奇怪,不管怎么说,这样写肯定会出现负值。
总的来说,cp值计算要满足下面几个原则:
1.agi越高,cp值增加越快
2.agi最低的玩家cp值增长必须为正
3.在全体agi都很低或都很高时,不会出现等待时间过长或过短的情况。
在这里我看到了用cp条宽度来表示cp总量,这样不是不可以,涉及到了浮点运算我就忍了吧。
不过可以考虑这样的简单经验公式,用一个较大数来表示CP上限,比如65535/32767等,cp增长的速度正比于各个战斗者的agi,每场战斗保证agi最高的那个人蓄力时间是一个定值(比如说80帧),在每个人的agi前乘以一个系数就可以做一个伸缩变换。原理同2L。
最后是几个可以改进的地方:
1.效果图里面看不到敌人的cp条,希望加上。当然敌人死亡时cp条就要去掉了。
2.是否考虑2个以上人同时蓄力完毕的情况?感觉应该同时下达操作才是。如果主角和敌人同时完成蓄力,那么应当先对主角下达命令,再进行战斗。
3.当角色死亡时,cp就不应该蓄力了,当死亡的角色复活时,cp应该重置为0。(这里我可能没看到吧,或许有这样的问题)
4.当角色被附加某些特殊状态时(睡眠,混乱),体现的效果是?我好像也没看到处理方式。
5.src_rect的想法很好,实现的方式同2L,不再阐述。
暂时就想到这些,别的想到了我会补充的。

评分

参与人数 1星屑 +100 收起 理由
恐惧剑刃 + 100 我很赞同

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部