RMXP脚本解析(十):Game_Battler(分割定义一)

这个类实在是过于冗长,以至于RMXP将其分为三个部分书写。本节我们解析其第一部分,并在解析其整个类之后分析出它是如何使用Game_BattleAction的。

Game_Battle(分割定义一)代码解析

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

# ■ Game_Battler (分割定义 1)

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

#  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的

# 超级类来使用。

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

class Game_Battler

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

    # ● 定义实例变量

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

    attr_reader   :battler_name             # 战斗者 文件名

    attr_reader   :battler_hue              # 战斗者 色相

    attr_reader   :hp                       # HP

    attr_reader   :sp                       # SP

    attr_reader   :states                   # 状态

    attr_accessor :hidden                   # 隐藏标志

    attr_accessor :immortal                 # 不死身标志

    attr_accessor :damage_pop               # 显示伤害标志

    attr_accessor :damage                   # 伤害值

    attr_accessor :critical                 # 会心一击标志

    attr_accessor :animation_id             # 动画 ID

    attr_accessor :animation_hit            # 动画 击中标志

    attr_accessor :white_flash              # 白色屏幕闪烁标志

    attr_accessor :blink                    # 闪烁标志

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

    # ● 初始化对像

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

    def initialize

      @battler_name = ""

      @battler_hue = 0

      @hp = 0

      @sp = 0

      @states = []

      @states_turn = {} #角色状态的维持回合数的集合

      @maxhp_plus = 0 #以下几个都是基础属性的增加量

      @maxsp_plus = 0 #

      @str_plus = 0 #

      @dex_plus = 0 #

      @agi_plus = 0 #

      @int_plus = 0 #

      @hidden = false

      @immortal = false

      @damage_pop = false

      @damage = nil

      @critical = false

      @animation_id = 0

      @animation_hit = false

      @white_flash = false

      @blink = false

      @current_action = Game_BattleAction.new #战斗中正在发生的行为对象

    end

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

    # ● 获取 MaxHP

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

    def maxhp #暂且不知道base_maxhp是什么,推测是修改前的基础maxhp,应该是从存档文件里读取的 #后来我知道这个是一个方法

      n = [[base_maxhp + @maxhp_plus, 1].max, 999999].min #让角色hp不超上下限[1,999999]

      for i in @states #之前我们说过状态是可以叠加的

        n *= $data_states[i].maxhp_rate / 100.0 #有些状态会对角色的最大hp造成影响(RM本体没有预设这样的状态)

      end

      n = [[Integer(n), 1].max, 999999].min #让角色hp不超限

      return n

    end

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

    # ● 获取 MaxSP

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

    def maxsp #同上,下面都一样

      n = [[base_maxsp + @maxsp_plus, 0].max, 9999].min

      for i in @states

        n *= $data_states[i].maxsp_rate / 100.0

      end

      n = [[Integer(n), 0].max, 9999].min

      return n

    end

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

    # ● 获取力量

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

    def str #力量等属性值的范围为[1,999]

      n = [[base_str + @str_plus, 1].max, 999].min

      for i in @states

        n *= $data_states[i].str_rate / 100.0

      end

      n = [[Integer(n), 1].max, 999].min

      return n

    end

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

    # ● 获取灵巧

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

    def dex

      n = [[base_dex + @dex_plus, 1].max, 999].min

      for i in @states

        n *= $data_states[i].dex_rate / 100.0

      end

      n = [[Integer(n), 1].max, 999].min

      return n

    end

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

    # ● 获取速度

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

    def agi

      n = [[base_agi + @agi_plus, 1].max, 999].min

      for i in @states

        n *= $data_states[i].agi_rate / 100.0

      end

      n = [[Integer(n), 1].max, 999].min

      return n

    end

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

    # ● 获取魔力

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

    def int

      n = [[base_int + @int_plus, 1].max, 999].min

      for i in @states

        n *= $data_states[i].int_rate / 100.0

      end

      n = [[Integer(n), 1].max, 999].min

      return n

    end

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

    # ● 设置 MaxHP

    #     maxhp : 新的 MaxHP

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

    def maxhp=(maxhp) #从这里就能明显的看出了,角色基础的属性和后期游戏内设置的属性值是分开存放的

      @maxhp_plus += maxhp - self.maxhp #求出新值和基础值的差,然后赋给@maxhp_plus,这系列变量应为在基础值上的变化值

      @maxhp_plus = [[@maxhp_plus, -9999].max, 9999].min #hp与sp的增减能力值范围为[-9999,9999]

      @hp = [@hp, self.maxhp].min

    end

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

    # ● 设置 MaxSP

    #     maxsp : 新的 MaxSP

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

    def maxsp=(maxsp) #同上,以下也是

      @maxsp_plus += maxsp - self.maxsp

      @maxsp_plus = [[@maxsp_plus, -9999].max, 9999].min

      @sp = [@sp, self.maxsp].min

    end

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

    # ● 设置力量

    #     str : 新的力量

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

    def str=(str) 

      @str_plus += str - self.str 

      @str_plus = [[@str_plus, -999].max, 999].min #力量等属性的增减能力值范围为[-999,999]

    end

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

    # ● 设置灵巧

    #     dex : 新的灵巧

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

    def dex=(dex) 

      @dex_plus += dex - self.dex

      @dex_plus = [[@dex_plus, -999].max, 999].min

    end

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

    # ● 设置速度

    #     agi : 新的速度

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

    def agi=(agi)

      @agi_plus += agi - self.agi

      @agi_plus = [[@agi_plus, -999].max, 999].min

    end

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

    # ● 设置魔力

    #     int : 新的魔力

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

    def int=(int)

      @int_plus += int - self.int

      @int_plus = [[@int_plus, -999].max, 999].min

    end

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

    # ● 获取命中率

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

    def hit

      n = 100 #状态正常的状况下命中率为100%

      for i in @states

        n *= $data_states[i].hit_rate / 100.0 #根据状态增减命中率

      end

      return Integer(n) #百分制取整

    end

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

    # ● 获取攻击力

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

    def atk #原理跟命中率差不多,下同

      n = base_atk

      for i in @states

        n *= $data_states[i].atk_rate / 100.0

      end

      return Integer(n)

    end

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

    # ● 获取物理防御

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

    def pdef

      n = base_pdef

      for i in @states

        n *= $data_states[i].pdef_rate / 100.0

      end

      return Integer(n)

    end

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

    # ● 获取魔法防御

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

    def mdef

      n = base_mdef

      for i in @states

        n *= $data_states[i].mdef_rate / 100.0

      end

      return Integer(n)

    end

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

    # ● 获取回避修正

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

    def eva #回避修正是只增减的

      n = base_eva

      for i in @states

        n += $data_states[i].eva

      end

      return n

    end

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

    # ● 更改 HP

    #     hp : 新的 HP

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

    def hp=(hp)

      @hp = [[hp, maxhp].min, 0].max #限定取值然后赋值

      # 解除附加的战斗不能状态

      for i in 1...$data_states.size #也就是遍历所有状态

        if $data_states[i].zero_hp #RPG::State.zero_hp,本方法在调用对象中有“当作hp为0”的设定时返回True

          if self.dead? #如果改后的hp是hp为0的情况

            add_state(i) #增加这个状态

          else

            remove_state(i) #移出这个状态

          end

        end

      end

    end #既然如此,理论上最好只定义一个“当作hp为0”的战斗不能状态,如果有特殊情况也要把特殊状态放在战斗不能状态的后面

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

    # ● 更改 SP

    #     sp : 新的 SP

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

    def sp=(sp) #同上,但是移除状态判定和修改

      @sp = [[sp, maxsp].min, 0].max

    end

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

    # ● 全回复

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

    def recover_all

      @hp = maxhp #我想了半天这个变量从哪里来,原来是上面定义的方法

      @sp = maxsp

      for i in @states.clone #object.clone,此方法返回此对象的克隆对象(浅拷贝)

        remove_state(i) #移除所有状态

      end

    end

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

    # ● 获取当前的动作

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

    def current_action

      return @current_action

    end

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

    # ● 确定动作速度

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

    def make_action_speed #可以看出每一次行动的速度是有随机性的

      @current_action.speed = agi + rand(10 + agi / 4) 

    end

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

    # ● 战斗不能判定

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

    def dead?

      return (@hp == 0 and not @immortal) #没有不死身标记而且hp=0

    end

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

    # ● 存在判定

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

    def exist? #之前测试了battler调用的频率,感觉角色死亡之后是不是@hidden置True了,待验证

      return (not @hidden and (@hp > 0 or @immortal))

    end

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

    # ● HP 0 判定

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

    def hp0? #被@hidden的对象不参与计算,真好

      return (not @hidden and @hp == 0)

    end

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

    # ● 可以输入命令判定

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

    def inputable? #强制普攻敌人和强制普攻队友、不行动时不能输入命令(也就是选择行动)

      return (not @hidden and restriction <= 1) #Game_Battler 2.restriction方法,返回状态的限制

    end

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

    # ● 可以行动判定

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

    def movable? #除了不行动状态都可以行动

      return (not @hidden and restriction < 4)

    end

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

    # ● 防御中判定

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

    def guarding? #参考Game_BattleAction可知这是行为0基本1,也就是防御

      return (@current_action.kind == 0 and @current_action.basic == 1)

    end

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

    # ● 休止中判定

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

    def resting? #目前不知道什么情况下basic会置3

      return (@current_action.kind == 0 and @current_action.basic == 3)

    end

  end

思考

我之前曾经说过Ruby的方法隐藏括号调用很有歧义不该提倡,但是今天我在思考,定义函数和定义变量都是定义,这样明明更加符合Ruby一切皆对象的思想,倒是反而衬托出我思想的僵化了。

不过说真的,我想了老半天那个maxhp是啥变量了……人傻起来真就没药医- -。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值