定制小程序开发费用RMXP脚本解析(九):Game_BattleAction

目录


定制小程序开发费用让我们继续跟着Scene_Title定制小程序开发费用的脉络走下去。定制小程序开发费用本来这一节是要解析Game_Party,但由于Game_Party定制小程序开发费用类中又反复使用了一个定制小程序开发费用较为简单的类Game_Actors,Game_Actors定制小程序开发费用中又使用了Game_Actor……最后定义到了Game_BattleAction。查找RMXP脚本系统中最基础的类的感觉就像中不停地查找节点的子树。所以我们就先解析Game_BattleAction。

Scene_Title用到的类的集合,红色透明框内是我们这几节的内容

具体定义

Game_BattleAction类代码解析

  1. #==============================================================================
  2. # ■ Game_BattleAction
  3. #------------------------------------------------------------------------------
  4. #  处理行动 (战斗中的行动) 的类。这个类在 Game_Battler 类
  5. # 的内部使用。 #可以理解为这个类专门为Game_Battler设计
  6. #==============================================================================
  7. class Game_BattleAction #这个类的对象们是一个个行为
  8. #--------------------------------------------------------------------------
  9. # ● 定义实例变量
  10. #--------------------------------------------------------------------------
  11. attr_accessor :speed # 速度
  12. attr_accessor :kind # 种类 (基本 / 特技 / 物品) #此行为的种类
  13. attr_accessor :basic # 基本 (攻击 / 防御 / 逃跑) #此行为的类别
  14. attr_accessor :skill_id # 特技 ID #此行为使用的特技的ID
  15. attr_accessor :item_id # 物品 ID #此行为使用的物品的ID
  16. attr_accessor :target_index # 对像索引 #此行为指向的对象 也就是目标的索引光标
  17. attr_accessor :forcing # 强制标志
  18. #--------------------------------------------------------------------------
  19. # ● 初始化对像
  20. #--------------------------------------------------------------------------
  21. def initialize
  22. clear #Ruby中有个clear方法用于清空数组,但此类中指的是同名的类方法
  23. end
  24. #--------------------------------------------------------------------------
  25. # ● 清除
  26. #--------------------------------------------------------------------------
  27. def clear #说是清除,其实也就是恢复初始化 #当然,这个类的定义就注定了初始化的对象是无效的
  28. @speed = 0
  29. @kind = 0
  30. @basic = 3
  31. @skill_id = 0
  32. @item_id = 0
  33. @target_index = -1
  34. @forcing = false
  35. end
  36. #--------------------------------------------------------------------------
  37. # ● 有效判定
  38. #--------------------------------------------------------------------------
  39. def valid?
  40. return (not (@kind == 0 and @basic == 3)) #除了基本逃跑其他都有效,因为基本动作只有攻击和防御
  41. end
  42. #--------------------------------------------------------------------------
  43. # ● 己方单体使用判定
  44. #--------------------------------------------------------------------------
  45. def for_one_friend? #判断是否可以使用
  46. # 种类为特技、效果范围是我方单体 (包含 HP 0) 的情况
  47. if @kind == 1 and [3, 5].include?($data_skills[@skill_id].scope) #RPG::Skill.scope 表明技能的使用对象范围
  48. return true
  49. end
  50. # 种类为物品、效果范围是我方单体 (包含 HP 0) 的情况
  51. if @kind == 2 and [3, 5].include?($data_items[@item_id].scope)
  52. return true
  53. end
  54. return false #其他情况不可使用
  55. end
  56. #--------------------------------------------------------------------------
  57. # ● 己方单体用 (HP 0) 判定
  58. #--------------------------------------------------------------------------
  59. def for_one_friend_hp0? #同上
  60. # 种类为特技、效果范围是我方单体 (HP 0) 的情况
  61. if @kind == 1 and [5].include?($data_skills[@skill_id].scope)
  62. return true
  63. end
  64. # 种类为物品、效果范围是我方单体 (HP 0) 的情况
  65. if @kind == 2 and [5].include?($data_items[@item_id].scope)
  66. return true
  67. end
  68. return false
  69. end
  70. #--------------------------------------------------------------------------
  71. # ● 随机目标 (角色用)
  72. #--------------------------------------------------------------------------
  73. def decide_random_target_for_actor
  74. # 效果范围的分支
  75. if for_one_friend_hp0? #如果可以使用在hp0的己方角色身上
  76. battler = $game_party.random_target_actor_hp0 #你们还真是盘根错节...以下三个方法随机获得一个符合条件的对象
  77. elsif for_one_friend? #如果可以使用在己方角色身上
  78. battler = $game_party.random_target_actor
  79. else #其他情况
  80. battler = $game_troop.random_target_enemy
  81. end
  82. # 对像存在的话取得索引、
  83. # 对像不存在的场合下清除行动
  84. if battler != nil #如果返回的Game_Battler对象不为空
  85. @target_index = battler.index #此行动的光标指向它
  86. else
  87. clear #清除行动
  88. end
  89. end
  90. #--------------------------------------------------------------------------
  91. # ● 随机目标 (敌人用)
  92. #--------------------------------------------------------------------------
  93. def decide_random_target_for_enemy #同上
  94. # 效果范围的分支
  95. if for_one_friend_hp0?
  96. battler = $game_troop.random_target_enemy_hp0
  97. elsif for_one_friend?
  98. battler = $game_troop.random_target_enemy
  99. else
  100. battler = $game_party.random_target_actor
  101. end
  102. # 对像存在的话取得索引、
  103. # 对像不存在的场合下清除行动
  104. if battler != nil
  105. @target_index = battler.index
  106. else
  107. clear
  108. end
  109. end
  110. #--------------------------------------------------------------------------
  111. # ● 最后的目标 (角色用)
  112. #--------------------------------------------------------------------------
  113. def decide_last_target_for_actor #决定了光标之后,决定使用对象 #应该是玩家手动选择目标之后把值存在@target_index内,然后此方法取出battler
  114. # 效果范围是己方单体以及行动者以外的敌人
  115. if @target_index == -1 #当光标有意义时才继续
  116. battler = nil
  117. elsif for_one_friend? #如果这是对友军使用的行动
  118. battler = $game_party.actors[@target_index]
  119. else #对敌军时
  120. battler = $game_troop.enemies[@target_index]
  121. end
  122. # 对像不存在的场合下清除行动
  123. if battler == nil or not battler.exist? #如果index指向的battler为nil
  124. clear #清除此行动
  125. end
  126. end
  127. #--------------------------------------------------------------------------
  128. # ● 最后的目标 (敌人用)
  129. #--------------------------------------------------------------------------
  130. def decide_last_target_for_enemy #同上
  131. # 效果范围是己方单体以敌人以外的角色
  132. if @target_index == -1
  133. battler = nil
  134. elsif for_one_friend?
  135. battler = $game_troop.enemies[@target_index]
  136. else
  137. battler = $game_party.actors[@target_index]
  138. end
  139. # 对像不存在的场合下清除行动
  140. if battler == nil or not battler.exist?
  141. clear
  142. end
  143. end
  144. end

关于::Skill.scope的取值范围

效果范围(0:无,1:敌单体,2:敌全体,3:己方单体,4:己方全体,5:己方单体(HP 0),6:己方全体(HP 0),7:使用者)。

由此可得以下情况的效果范围取值:

-对敌方:[1,2]

-对己方:[3,5],没有6是因为6情况直接战斗失败。

关于本类的意义

作为供Game_Battler类内部使用的类,Game_BattleAction类的主要作用是记录战斗中的行动。RMXP(默认代码)制作出来的是回合制RPG,也就是各个角色轮流行动计算伤害的游戏,相比于ARPG,RMXP中没有关于碰撞的计算,但是对于行动的先后等有所要求。本类中虽然没有计算的部分,却展示了RMXP是如何存储战斗中所有角色的行为。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发