加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua metatables:类字段与实例字段

发布时间:2020-12-14 21:42:25 所属栏目:大数据 来源:网络整理
导读:我正在Corona / Lua做一个游戏,并实现一个名为“Item”的类,它代表游戏中的武器,盔甲,护身符等.我是面向对象Lua的新手. 在创建类的新实例之后,我发现设置对象的某些属性似乎将它们设置在类metatable中,而不是在对象本身中. 这是类和构造函数: local Item =
我正在Corona / Lua做一个游戏,并实现一个名为“Item”的类,它代表游戏中的武器,盔甲,护身符等.我是面向对象Lua的新手.

在创建类的新实例之后,我发现设置对象的某些属性似乎将它们设置在类metatable中,而不是在对象本身中.

这是类和构造函数:

local Item = {
    name = nil,itemType = nil,scarcity = "basic",baseDamage = 0,-- Bow only
    bonuses = {
        damageBonus = 0,speedBonus = 0,critBonus = 0,dropBonus = 0,rechargeBonus = 0,xpBonus = 0
    }
}

-- Creates a simple blank instance of the Item class.
function Item:new(o)
    local item = o or {}
    setmetatable(item,self)
    self.__index = self
    return item
end

现在假设我基于这个原型创建了两个对象:

local bow = Item:new()
bow.itemType = "bow"
starterBow.baseDamage = 5

local ring = Item:new()
ring.itemType = "ring"
ring.bonuses.damageBonus = 0.25

令我沮丧的是,“bonuses.damageBonus”属性似乎已经设置在metatable中,因此适用于每个项目(即弓也获得伤害加值,并与环堆叠).然而,这种行为似乎仅限于“奖金”属性.如果我设置“itemType”属性,它将按预期附加到对象而不是类.

我想看到的行为是,可以为单个项目设置“奖金”表的字段.知道我做错了什么吗?谢谢!

解决方法

当您尝试从表中“获取”不存在的字段时,会触发__index元字段.
ring.bonuses.damageBonus = 0.25试图从环中“获取”奖金,因为它不存在,转到metatable并返回你的奖金表,然后将其damageBonus索引设置为0.25.

理解只是在Item表中声明变量并不意味着您的Item实例会将它们作为实例变量继承.为此,您需要在Item:new()函数中声明/初始化它们:

function Item:new(o)
    local item = o or {}
    setmetatable(item,self)
    self.__index = self
    item.bonuses={} -- create instance bonuses table and give default values
    for k,v in pairs(self.bonuses) do 
        item.bonuses[k]=v
    end
    return item
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读