RMXP脚本解析(九):Game_BattleAction

目录

Game_BattleAction类代码解析

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

关于本类的意义


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

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

具体定义

Game_BattleAction类代码解析

#==============================================================================

# ■ Game_BattleAction

#------------------------------------------------------------------------------

#  处理行动 (战斗中的行动) 的类。这个类在 Game_Battler 类

# 的内部使用。 #可以理解为这个类专门为Game_Battler设计

#==============================================================================

class Game_BattleAction #这个类的对象们是一个个行为

    #--------------------------------------------------------------------------

    # ● 定义实例变量

    #--------------------------------------------------------------------------

    attr_accessor :speed                    # 速度

    attr_accessor :kind                     # 种类 (基本 / 特技 / 物品) #此行为的种类

    attr_accessor :basic                    # 基本 (攻击 / 防御 / 逃跑) #此行为的类别

    attr_accessor :skill_id                 # 特技 ID #此行为使用的特技的ID

    attr_accessor :item_id                  # 物品 ID #此行为使用的物品的ID

    attr_accessor :target_index             # 对像索引 #此行为指向的对象 也就是目标的索引光标

    attr_accessor :forcing                  # 强制标志

    #--------------------------------------------------------------------------

    # ● 初始化对像

    #--------------------------------------------------------------------------

    def initialize

      clear #Ruby中有个clear方法用于清空数组,但此类中指的是同名的类方法

    end

    #--------------------------------------------------------------------------

    # ● 清除

    #--------------------------------------------------------------------------

    def clear #说是清除,其实也就是恢复初始化 #当然,这个类的定义就注定了初始化的对象是无效的

      @speed = 0

      @kind = 0

      @basic = 3

      @skill_id = 0

      @item_id = 0

      @target_index = -1

      @forcing = false

    end

    #--------------------------------------------------------------------------

    # ● 有效判定

    #--------------------------------------------------------------------------

    def valid?

      return (not (@kind == 0 and @basic == 3)) #除了基本逃跑其他都有效,因为基本动作只有攻击和防御

    end

    #--------------------------------------------------------------------------

    # ● 己方单体使用判定

    #--------------------------------------------------------------------------

    def for_one_friend? #判断是否可以使用

      # 种类为特技、效果范围是我方单体 (包含 HP 0) 的情况

      if @kind == 1 and [3, 5].include?($data_skills[@skill_id].scope) #RPG::Skill.scope 表明技能的使用对象范围

        return true 

      end

      # 种类为物品、效果范围是我方单体 (包含 HP 0) 的情况

      if @kind == 2 and [3, 5].include?($data_items[@item_id].scope)

        return true

      end

      return false #其他情况不可使用

    end

    #--------------------------------------------------------------------------

    # ● 己方单体用 (HP 0) 判定

    #--------------------------------------------------------------------------

    def for_one_friend_hp0? #同上

      # 种类为特技、效果范围是我方单体 (HP 0) 的情况

      if @kind == 1 and [5].include?($data_skills[@skill_id].scope)

        return true

      end

      # 种类为物品、效果范围是我方单体 (HP 0) 的情况

      if @kind == 2 and [5].include?($data_items[@item_id].scope)

        return true

      end

      return false 

    end

    #--------------------------------------------------------------------------

    # ● 随机目标 (角色用)

    #--------------------------------------------------------------------------

    def decide_random_target_for_actor

      # 效果范围的分支

      if for_one_friend_hp0? #如果可以使用在hp0的己方角色身上

        battler = $game_party.random_target_actor_hp0 #你们还真是盘根错节...以下三个方法随机获得一个符合条件的对象

      elsif for_one_friend? #如果可以使用在己方角色身上

        battler = $game_party.random_target_actor

      else #其他情况

        battler = $game_troop.random_target_enemy

      end

      # 对像存在的话取得索引、

      # 对像不存在的场合下清除行动

      if battler != nil #如果返回的Game_Battler对象不为空

        @target_index = battler.index #此行动的光标指向它

      else

        clear #清除行动

      end

    end

    #--------------------------------------------------------------------------

    # ● 随机目标 (敌人用)

    #--------------------------------------------------------------------------

    def decide_random_target_for_enemy #同上

      # 效果范围的分支

      if for_one_friend_hp0?

        battler = $game_troop.random_target_enemy_hp0

      elsif for_one_friend?

        battler = $game_troop.random_target_enemy

      else

        battler = $game_party.random_target_actor

      end

      # 对像存在的话取得索引、

      # 对像不存在的场合下清除行动

      if battler != nil

        @target_index = battler.index

      else

        clear

      end

    end

    #--------------------------------------------------------------------------

    # ● 最后的目标 (角色用)

    #--------------------------------------------------------------------------

    def decide_last_target_for_actor #决定了光标之后,决定使用对象 #应该是玩家手动选择目标之后把值存在@target_index内,然后此方法取出battler

      # 效果范围是己方单体以及行动者以外的敌人

      if @target_index == -1 #当光标有意义时才继续

        battler = nil

      elsif for_one_friend? #如果这是对友军使用的行动

        battler = $game_party.actors[@target_index]

      else #对敌军时

        battler = $game_troop.enemies[@target_index]

      end

      # 对像不存在的场合下清除行动

      if battler == nil or not battler.exist? #如果index指向的battler为nil

        clear #清除此行动

      end

    end

    #--------------------------------------------------------------------------

    # ● 最后的目标 (敌人用)

    #--------------------------------------------------------------------------

    def decide_last_target_for_enemy #同上

      # 效果范围是己方单体以敌人以外的角色

      if @target_index == -1

        battler = nil

      elsif for_one_friend?

        battler = $game_troop.enemies[@target_index]

      else

        battler = $game_party.actors[@target_index]

      end

      # 对像不存在的场合下清除行动

      if battler == nil or not battler.exist?

        clear

      end

    end

  end

关于RPG::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是如何存储战斗中所有角色的行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01·容错脚本 BY 轮回者 本脚本基于星大叔的容错脚本第2版,建立两个txt文件(log_bitmap.txt log_audio.txt),对系统缺失的文件进行补救,也就是缺失文件照样可以玩游戏。 02·角色加入提示(开关2) 角色加入、离开提示。 03·分开距离自动跟随(开关4) 传说中的“开火车”。 04·加强窗口(选项动态加强)作者:carol3 05·读书读报系统(开关50) by 柳柳 参考注释打开开关,则进入读书系统,系统会连续不停地读取“显示文章”的内容显示在一个窗口中,直到碰到其他事件。 06·天气系统 by ScriptKitty and Mr.DJ 共包含16个天气,(具体看脚本里的长篇说明)。 07·按键加速 08·光标循环移动 菜单可以循环选择 09·升级加点系统 本脚本不会取代默认的升级,但可以用这个功能手动追加点数。 如果你想纯粹使用手动加点(而升级不提升能力),只要把数据库中角色升级能力,1-99级全部等于一个相同数值就行了(具体看脚本里的长篇说明)。 10·升级提示 (开关5) By 叶子 原作者:桜雅 在土 11·防卡机 作者:“用我的视野范围去限制刷新的事件,因此一个有300多个事件的大地图仍然可以运行在40的帧速率。这可能不是最后一个版本,我还在考虑更多的方法减少事件的拖慢” 12·半透明菜单 13·截图 14·按键调用 By: Cybersa 15·文字投影效果 16·全屏幕(API) 17·游戏版权(游戏开始时显示LOGO) 18·杀敌随机金钱 by.我要食叉包 19·商店显示 优化了商店 20·价格变动 翻译:柳柳 21·菜单显示血条 22·物品分类 可以自定义设置物品分类,利用物品描述,每个描述后面添加@物品分类即可。 23·任务和菜单 by 柳柳 24·完美输入法(具体看脚本里的长篇说明) 25·显示敌人生命百分比 作者:carol3_柳柳 26·显示地图名 by 桜雅 在土 27·截图存取档(具体看脚本里的长篇说明) 28·真实商店(具体看脚本里的长篇说明) 29·即时消息脚本(仿网游,甚者可以外接成为聊天框) 30·贵重物品特殊颜色 31·等级突破 32·显示每个事件的名字 作者:柳柳 加强:叶子 33·事件的储存读取进度 34·偷盗系统 By 绿发的Eclair 35·完整鼠标系统 By whbm 36·繁体字 (把简体字转换为繁体字?) 37·直接用地图做战斗背景 脚本作者:bluefool 38·显示ARPG by 刻宮 39·fuki v6 (具体看脚本里的长篇说明) 40·得失提示 作者:KKME,联系QQ:6690474 41·套装系统 By 凌冰 42·价格变动 by 和希成纳 、桜雅在土 43·坐标显示 44·四方向寻路 By whbm 45·防卡机2 (应该是放挂机才对) 46·小地图 by ピニョン clum-sea 游戏中,按下shift键可以开关地图, 47·更新加密游戏(暂时用不着)(具体看脚本里的长篇说明) 48·银行系统(开关12)(具体看脚本里的长篇说明) 49·魔物图鉴(具体看脚本里的长篇说明) 50·自动更新(暂无效)BY 亿万星辰(具体看脚本里的长篇说明) ---2.01测试---- 1.RM计算机by 七夕小雨 2.解决RM的10s 3.打造 4.鼠标脚本控制窗口滚动 5.光标位置记录 6.移动的公告 by bbaugle 7.特技升级 by Claimh 8.彩虹神剑 by 柳柳 修改 by 叶子 9.远景自动移动 by ぷのくー 10.全键盘检测 11.多重状态 by Claimh 12.技能连击追加 by Claimh 13.显示敌人列表 Scene_Battle 14.回合表示 15.转到输入下一个角色的命令 16.魔法商店 17.视角跟随NPC 18.颜色随血量变化 19.组合键连续特技系统 By 绿发的Eclair 20.游戏版权LOGO(结束游戏时)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值