Project1

标题: 关于"类"的一点疑问? [打印本页]

作者: 邱小谦    时间: 2015-4-28 22:23
标题: 关于"类"的一点疑问?
游戏默认脚本里面已经有class Game_Actors了。而且里面也定义了武器和装备可以穿的场合的方法。然后我在一款游戏里面的脚本看见在别处也同样定义了这个类,而且同样也定义了一样的方法,就连使用的类名和方法名都相同。那么我想请问一下,这样不冲突么。如果我想修改脚本,让装备和武器有等级限制。到底实在默认脚本里面修改呢?还是在别人重新定义的那个类里面修改呢?
作者: 芯☆淡茹水    时间: 2015-4-28 22:32
最靠近 main 的那个类里修改。
作者: kuerlulu    时间: 2015-4-28 22:34
类中:
  方法的重定义:
    def a; 1; end
    def a; '一'; end
    p a #=> '一'
所以说这种"再写一遍"的姿势是正确的
作者: 邱小谦    时间: 2015-4-28 22:45
kuerlulu 发表于 2015-4-28 22:34
类中:
  方法的重定义:
    def a; 1; end

那这个类不在同一个目录里面写,也是一样的效果么?
比如我先写一个
class A
  def b
   p 1
end
end
然后我再写一个
  class A
   def b
    p 2
end
end
他是会按照第二个来显示,就是p 2对吧。也和上面那位说的,靠近main的有效。
作者: 邱小谦    时间: 2015-4-28 22:53
芯☆淡茹水 发表于 2015-4-28 22:32
最靠近 main 的那个类里修改。

刚才我实验了一下。发现脚本还是按照从上往下的顺序来执行呢。如果我是在靠近main那个类修改,是两个都要修改,还是只需要修改一个呢
作者: 汪汪    时间: 2015-4-29 21:29
后面的方法覆盖前面的方法
作者: 邱小谦    时间: 2015-4-29 23:09
汪汪 发表于 2015-4-29 21:29
后面的方法覆盖前面的方法

懂了。靠近Main也就是后面的方法确实覆盖了前面定义的方法。那么我要是把后面定义的方法删掉,直接在前面定义的方法里面写,是不是一样的?还有,后面方法的类前面定义了module。我要是删掉本类的方法,在之前的地方写,会不会有影响?
作者: wolves    时间: 2015-4-30 01:33
不建议你直接在前面改,首先不符合rm编程规范,其次是遇到问题回复困难。要养成重定义的习惯。类的重定义能让修改的部分变得更直观。
类的重定义只是类方法的增修。
作者: 邱小谦    时间: 2015-5-1 23:13
芯☆淡茹水 发表于 2015-4-28 22:32
最靠近 main 的那个类里修改。

def equipable?(item)
   # 武器的情况
   if item.is_a?(RPG::Weapon)
     # 包含当前的职业可以装备武器的场合
     if $data_classes[@class_id].weapon_set.include?(item.id) and item.level.to_i<=@level
       if item.str.to_i<= str and item.dex.to_i<= dex and item.agi.to_i<= agi and item.int.to_i<= int
       return true
       end
     end
   end
我想问一下,这一块的item参数是属于临时参数对吧。那么它在后面的if语句里面有个item.id的调用。但是这个item没有id这个方法啊?求解
作者: 芯☆淡茹水    时间: 2015-5-2 00:42
邱小谦 发表于 2015-5-1 23:13
def equipable?(item)
   # 武器的情况
   if item.is_a?(RPG::Weapon)

既然第一个判断已经通过,这句: if $data_classes[@class_id].weapon_set.include?(item.id)
应该是默认脚本原语句。
在 Game_Actor 里有没有 item 的方法定义?
或者你把报错内容说下。
作者: 汪汪    时间: 2015-5-2 00:58
邱小谦 发表于 2015-5-1 23:13
def equipable?(item)
   # 武器的情况
   if item.is_a?(RPG::Weapon)

item是一个临时的参数,这个参数传过来的是一个对象?。 if item.is_a?(RPG::Weapon) 这一个判断就是判断item是不是一个武器对象?,而武器的对象?(类)中是有id这个方法的,见rpgmakerxp的帮助的
RPG::Weapon
武器的数据类。

父类Object
属性id
ID。

name
名称。

icon_name
图标图像的文件名。

description
说明。

animation1_id
攻击方的动画 ID。

animation2_id
对象方的动画 ID。

price
价格。

atk
攻击力。

pdef
物理防御。

mdef
魔法防御。

str_plus
力量+。

dex_plus
灵巧+。

agi_plus
速度+。

int_plus
魔力+。

element_set
属性。为属性 ID 的数组。

plus_state_set
附加状态。为状态 ID 的数组。

minus_state_set
解除状态。为状态 ID 的数组。

定义module RPG
  class Weapon
    def initialize
      @id = 0
      @name = ""
      @icon_name = ""
      @description = ""
      @animation1_id = 0
      @animation2_id = 0
      @price = 0
      @atk = 0
      @pdef = 0
      @mdef = 0
      @str_plus = 0
      @dex_plus = 0
      @agi_plus = 0
      @int_plus = 0
      @element_set = []
      @plus_state_set = []
      @minus_state_set = []
    end
    attr_accessor :id
    attr_accessor :name
    attr_accessor :icon_name
    attr_accessor :description
    attr_accessor :animation1_id
    attr_accessor :animation2_id
    attr_accessor :price
    attr_accessor :atk
    attr_accessor :pdef
    attr_accessor :mdef
    attr_accessor :str_plus
    attr_accessor :dex_plus
    attr_accessor :agi_plus
    attr_accessor :int_plus
    attr_accessor :element_set
    attr_accessor :plus_state_set
    attr_accessor :minus_state_set
  end
end

作者: 邱小谦    时间: 2015-5-2 20:04
芯☆淡茹水 发表于 2015-5-2 00:42
既然第一个判断已经通过,这句: if $data_classes[@class_id].weapon_set.include?(item.id)
应该是默 ...

Ggme_Actor里面没有item的方法。而且其他地方也没有看到。只是作为临时参数在调用。而且此处不报错,只是武器可以添加了,但是防具照样还是不能添加进来
作者: 芯☆淡茹水    时间: 2015-5-2 20:30
本帖最后由 芯☆淡茹水 于 2015-5-2 20:43 编辑
  1.   class Game_Actor < Game_Battler
  2.   #--------------------------------------------------------------------------
  3.   alias old_equippable? equippable?
  4.   def equippable?(item)
  5.     # 如果武器和防具都有等级和属性限制,可以全部写在一起判断。
  6.     # 如果通过就返回默认的职业装备判断。
  7.     if item.level.to_i<=@level and item.str.to_i<= str and
  8.      item.dex.to_i<= dex and item.agi.to_i<= agi and item.int.to_i<= int
  9.       return old_equipable?(item)
  10.     end
  11.     return false
  12.   end
  13.   #--------------------------------------------------------------------------
  14. end
复制代码
PS: 觉得角色的属性判断最好用基本属性,比如力量,用 base_str
      因为角色最终属性可以用状态提升上去。当状态增强角色属性后勉强装备
   上,状态消失后,角色属性下降到装备条件以下,但此时装备还是穿在身上。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1