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

Project1

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

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

[复制链接]

Lv1.梦旅人

薄凉看客

梦石
0
星屑
50
在线时间
1269 小时
注册时间
2010-6-20
帖子
1316
跳转到指定楼层
1
发表于 2014-11-7 00:05:47 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

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

先放截图





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

其余问题:
1. fill_rect过多
2. 敌人CP没有显示

太赖暂时不考虑修正 。。


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

CP
RUBY 代码复制
  1. #------------------------------------------------------------------------------
  2. # - CP战斗
  3. #------------------------------------------------------------------------------
  4.  
  5. #------------------------------------------------------------------------------
  6. # - 设置
  7. #------------------------------------------------------------------------------
  8. module CP
  9.   Speed = 1                                # 速度
  10.   Width = 120                              # CP条宽度
  11.   Height = 6                               # CP条高度
  12.   Back_Color = Color.new(0, 0, 0)          # CP条背景色
  13.   Cp_Color = Color.new(255, 255, 64)       # CP条填充色
  14.   Cp_Color_2 = Color.new(255, 128, 255)    # CP条填充色(满)
  15. end
  16.  
  17. #------------------------------------------------------------------------------
  18. # - 战斗者CP属性
  19. #------------------------------------------------------------------------------
  20. class Game_Battler
  21.   attr_accessor :cp, :cp_speed
  22.   alias initialize_cp_old initialize
  23.   def initialize
  24.     @cp = 0
  25.     @cp_speed = 0
  26.     initialize_cp_old
  27.   end
  28. end
  29.  
  30. #------------------------------------------------------------------------------
  31. # - 战斗场景
  32. #------------------------------------------------------------------------------
  33. class Scene_Battle
  34.   #----------------------------------------------------------------------------
  35.   # - 主方法
  36.   #----------------------------------------------------------------------------
  37.   alias main_cp_old main
  38.   def main
  39.     @cp_viewport = Viewport.new(0, 465, 640, CP::Height)
  40.     @cp_viewport.z = 9999
  41.     @cp_sprite = Sprite.new(@cp_viewport)
  42.     @cp_sprite.bitmap = Bitmap.new(640, CP::Height)
  43.     cp_bar
  44.     main_cp_old
  45.     @cp_sprite.bitmap.dispose
  46.     @cp_sprite.dispose
  47.     @cp_viewport.dispose
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # - 速度
  51.   #--------------------------------------------------------------------------
  52.   def cp_speed
  53.     battlers_agi = []
  54.     for battler in $game_party.actors + $game_troop.enemies
  55.       battlers_agi << battler.agi
  56.     end
  57.     min_agi = battlers_agi.min
  58.     for battler in $game_party.actors + $game_troop.enemies
  59.       battler.cp_speed = battler.agi * 10 / min_agi * CP::Speed / 5
  60.     end
  61.   end
  62.   #----------------------------------------------------------------------------
  63.   # - 描绘CP
  64.   #----------------------------------------------------------------------------
  65.   def cp_bar
  66.     @cp_sprite.bitmap.clear
  67.     for index in 0...$game_party.actors.size
  68.       actor = $game_party.actors[index]
  69.       if actor.dead?
  70.         actor.cp = 0
  71.         next
  72.       end
  73.       x = (index + 1) * 20 + index * 140
  74.       width = CP::Width
  75.       height = CP::Height
  76.       back_color = CP::Back_Color
  77.       @cp_sprite.bitmap.fill_rect(x, 0, width, height, back_color)
  78.       if actor.cp >= width - 1
  79.         cp_color = CP::Cp_Color_2
  80.         wid = width - 1
  81.       else
  82.         cp_color = CP::Cp_Color
  83.         wid = actor.cp
  84.       end
  85.       @cp_sprite.bitmap.fill_rect(x + 1, 1, wid, height - 2, cp_color)
  86.     end
  87.   end
  88. end
  89.  
  90. class Scene_Battle
  91.   alias start_phase2_cp_old start_phase2
  92.   def start_phase2
  93.     cp_bar
  94.     start_phase2_cp_old
  95.   end
  96.   def make_action_orders
  97.     @action_battlers = [@active_battler_cp]
  98.   end
  99.   alias update_phase4_step6_cp_old update_phase4_step6
  100.   def update_phase4_step6
  101.     update_phase4_step6_cp_old
  102.     @active_battler.cp = 0
  103.   end
  104. end


Scene_Battle 3
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 3)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================
  6.  
  7. class Scene_Battle
  8.   #--------------------------------------------------------------------------
  9.   # ● 开始角色命令回合
  10.   #--------------------------------------------------------------------------
  11.   def start_phase3
  12.     # 转移到回合 3
  13.     @phase = 3
  14.     # 设置角色为非选择状态
  15.     @actor_index = -1
  16.     @active_battler = nil
  17.     @active_battler_cp = nil
  18.     # 同伴指令窗口无效化
  19.     @party_command_window.active = false
  20.     @party_command_window.visible = false
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● 设置角色指令窗口
  24.   #--------------------------------------------------------------------------
  25.   def phase3_setup_command_window
  26.     if !@active_battler_cp.is_a?(Game_Actor)
  27.       start_phase4 # 回合4
  28.       @phase = 4
  29.       return
  30.     end
  31.     # 角色指令窗口无效化
  32.     @actor_command_window.active = true
  33.     @actor_command_window.visible = true
  34.     @actor_command_window.x = $game_party.actors.index(@active_battler_cp) * 160
  35.     # 设置索引为 0
  36.     @actor_command_window.index = 0
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 刷新画面 (角色命令回合)
  40.   #--------------------------------------------------------------------------
  41.   def update_phase3
  42.     if judge # 判断胜负
  43.       return
  44.     end
  45.     if @active_battler_cp == nil # 可以刷新
  46.       cp_speed # 新速度
  47.       cp_bar # 刷新cp条
  48.       for battler in $game_party.actors + $game_troop.enemies
  49.         battler.cp += battler.cp_speed
  50.         if battler.cp >= CP::Width - 1
  51.           cp_bar # 变色
  52.           @active_battler_cp = battler # 输入命令者
  53.           phase3_setup_command_window
  54.         end
  55.       end
  56.     end
  57.     # 敌人光标有效的情况下
  58.     if @enemy_arrow != nil
  59.       update_phase3_enemy_select
  60.     # 角色光标有效的情况下
  61.     elsif @actor_arrow != nil
  62.       update_phase3_actor_select
  63.     # 特技窗口有效的情况下
  64.     elsif @skill_window != nil
  65.       update_phase3_skill_select
  66.     # 物品窗口有效的情况下
  67.     elsif @item_window != nil
  68.       update_phase3_item_select
  69.     # 角色指令窗口有效的情况下
  70.     elsif @actor_command_window.active
  71.       update_phase3_basic_command
  72.     end
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● 刷新画面 (角色命令回合 : 基本命令)
  76.   #--------------------------------------------------------------------------
  77.   def update_phase3_basic_command
  78.     # 按下 C 键的情况下
  79.     if Input.trigger?(Input::C)
  80.       # 角色指令窗口光标位置分之
  81.       case @actor_command_window.index
  82.       when 0  # 攻击
  83.         # 演奏确定 SE
  84.         $game_system.se_play($data_system.decision_se)
  85.         # 设置行动
  86.         @active_battler_cp.current_action.kind = 0
  87.         @active_battler_cp.current_action.basic = 0
  88.         # 开始选择敌人
  89.         start_enemy_select
  90.       when 1  # 特技
  91.         # 演奏确定 SE
  92.         $game_system.se_play($data_system.decision_se)
  93.         # 设置行动
  94.         @active_battler_cp.current_action.kind = 1
  95.         # 开始选择特技
  96.         start_skill_select
  97.       when 2  # 防御
  98.         # 演奏确定 SE
  99.         $game_system.se_play($data_system.decision_se)
  100.         # 设置行动
  101.         @active_battler_cp.current_action.kind = 0
  102.         @active_battler_cp.current_action.basic = 1
  103.         start_phase4
  104.         @phase = 4
  105.       when 3  # 物品
  106.         # 演奏确定 SE
  107.         $game_system.se_play($data_system.decision_se)
  108.         # 设置行动
  109.         @active_battler_cp.current_action.kind = 2
  110.         # 开始选择物品
  111.         start_item_select
  112.       end
  113.       return
  114.     end
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   # ● 刷新画面 (角色命令回合 : 选择特技)
  118.   #--------------------------------------------------------------------------
  119.   def update_phase3_skill_select
  120.     # 设置特技窗口为可视状态
  121.     @skill_window.visible = true
  122.     # 刷新特技窗口
  123.     @skill_window.update
  124.     # 按下 B 键的情况下
  125.     if Input.trigger?(Input::B)
  126.       # 演奏取消 SE
  127.       $game_system.se_play($data_system.cancel_se)
  128.       # 结束特技选择
  129.       end_skill_select
  130.       return
  131.     end
  132.     # 按下 C 键的情况下
  133.     if Input.trigger?(Input::C)
  134.       # 获取特技选择窗口现在选择的特技的数据
  135.       [url=home.php?mod=space&uid=260100]@skill[/url] = @skill_window.skill
  136.       # 无法使用的情况下
  137.       if @skill == nil or not @active_battler_cp.skill_can_use?(@skill.id)
  138.         # 演奏冻结 SE
  139.         $game_system.se_play($data_system.buzzer_se)
  140.         return
  141.       end
  142.       # 演奏确定 SE
  143.       $game_system.se_play($data_system.decision_se)
  144.       # 设置行动
  145.       @active_battler_cp.current_action.skill_id = @skill.id
  146.       # 设置特技窗口为不可见状态
  147.       @skill_window.visible = false
  148.       if ![1, 3, 5].include?(@skill.scope)
  149.         start_phase4
  150.         @phase = 4
  151.         return
  152.       end
  153.       # 效果范围是敌单体的情况下
  154.       if @skill.scope == 1
  155.         # 开始选择敌人
  156.         start_enemy_select
  157.       # 效果范围是我方单体的情况下
  158.       elsif @skill.scope == 3 or @skill.scope == 5
  159.         # 开始选择角色
  160.         start_actor_select
  161.       # 效果范围不是单体的情况下
  162.       else
  163.         # 选择特技结束
  164.         end_skill_select
  165.       end
  166.       return
  167.     end
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # ● 刷新画面 (角色命令回合 : 选择物品)
  171.   #--------------------------------------------------------------------------
  172.   def update_phase3_item_select
  173.     # 设置物品窗口为可视状态
  174.     @item_window.visible = true
  175.     # 刷新物品窗口
  176.     @item_window.update
  177.     # 按下 B 键的情况下
  178.     if Input.trigger?(Input::B)
  179.       # 演奏取消 SE
  180.       $game_system.se_play($data_system.cancel_se)
  181.       # 选择物品结束
  182.       end_item_select
  183.       return
  184.     end
  185.     # 按下 C 键的情况下
  186.     if Input.trigger?(Input::C)
  187.       # 获取物品窗口现在选择的物品资料
  188.       @item = @item_window.item
  189.       # 无法使用的情况下
  190.       unless $game_party.item_can_use?(@item.id)
  191.         # 演奏冻结 SE
  192.         $game_system.se_play($data_system.buzzer_se)
  193.         return
  194.       end
  195.       # 演奏确定 SE
  196.       $game_system.se_play($data_system.decision_se)
  197.       # 设置行动
  198.       @active_battler_cp.current_action.item_id = @item.id
  199.       # 设置物品窗口为不可见状态
  200.       @item_window.visible = false
  201.       if ![1, 3, 5].include?(@item.scope)
  202.         start_phase4
  203.         @phase = 4
  204.         return
  205.       end
  206.       # 效果范围是敌单体的情况下
  207.       if @item.scope == 1
  208.         # 开始选择敌人
  209.         start_enemy_select
  210.       # 效果范围是我方单体的情况下
  211.       elsif @item.scope == 3 or @item.scope == 5
  212.         # 开始选择角色
  213.         start_actor_select
  214.       # 效果范围不是单体的情况下
  215.       else
  216.         # 物品选择结束
  217.         end_item_select
  218.       end
  219.       return
  220.     end
  221.   end
  222.   #--------------------------------------------------------------------------
  223.   # ● 刷新画面画面 (角色命令回合 : 选择敌人)
  224.   #--------------------------------------------------------------------------
  225.   def update_phase3_enemy_select
  226.     # 刷新敌人箭头
  227.     @enemy_arrow.update
  228.     # 按下 B 键的情况下
  229.     if Input.trigger?(Input::B)
  230.       # 演奏取消 SE
  231.       $game_system.se_play($data_system.cancel_se)
  232.       # 选择敌人结束
  233.       end_enemy_select
  234.       return
  235.     end
  236.     # 按下 C 键的情况下
  237.     if Input.trigger?(Input::C)
  238.       # 演奏确定 SE
  239.       $game_system.se_play($data_system.decision_se)
  240.       # 设置行动
  241.       @active_battler_cp.current_action.target_index = @enemy_arrow.index
  242.       # 选择敌人结束
  243.       end_enemy_select
  244.       # 显示特技窗口中的情况下
  245.       if @skill_window != nil
  246.         # 结束特技选择
  247.         end_skill_select
  248.       end
  249.       # 显示物品窗口的情况下
  250.       if @item_window != nil
  251.         # 结束物品选择
  252.         end_item_select
  253.       end
  254.       start_phase4
  255.       @phase = 4
  256.       return
  257.     end
  258.   end
  259.   #--------------------------------------------------------------------------
  260.   # ● 画面更新 (角色指令回合 : 选择角色)
  261.   #--------------------------------------------------------------------------
  262.   def update_phase3_actor_select
  263.     # 刷新角色箭头
  264.     @actor_arrow.update
  265.     # 按下 B 键的情况下
  266.     if Input.trigger?(Input::B)
  267.       # 演奏取消 SE
  268.       $game_system.se_play($data_system.cancel_se)
  269.       # 选择角色结束
  270.       end_actor_select
  271.       return
  272.     end
  273.     # 按下 C 键的情况下
  274.     if Input.trigger?(Input::C)
  275.       # 演奏确定 SE
  276.       $game_system.se_play($data_system.decision_se)
  277.       # 设置行动
  278.       @active_battler_cp.current_action.target_index = @actor_arrow.index
  279.       # 选择角色结束
  280.       end_actor_select
  281.       # 显示特技窗口中的情况下
  282.       if @skill_window != nil
  283.         # 结束特技选择
  284.         end_skill_select
  285.       end
  286.       # 显示物品窗口的情况下
  287.       if @item_window != nil
  288.         # 结束物品选择
  289.         end_item_select
  290.       end
  291.       start_phase4
  292.       @phase = 4
  293.       return
  294.     end
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● 开始选择特技
  298.   #--------------------------------------------------------------------------
  299.   def start_skill_select
  300.     # 生成特技窗口
  301.     @skill_window = Window_Skill.new(@active_battler_cp)
  302.     # 关联帮助窗口
  303.     @skill_window.help_window = @help_window
  304.     # 无效化角色指令窗口
  305.     @actor_command_window.active = false
  306.     @actor_command_window.visible = false
  307.   end
  308. end

评分

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

查看全部评分

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

3
发表于 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 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

路路 该用户已被删除
2
发表于 2014-11-7 01:08:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 23:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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