Lua类对象?

时间:2013-08-23 06:26:16

标签: lua love2d

我是Lua的新手,我想知道是否有办法让很多类对象在我的情况下制作不同的项目,就像在C#或Java等OOP语言中一样。我所说的一个例子是Lua中的这类课程......

weapon = {}

function weapon.load()
{
    weapon.name = "CHASE'S BUG"
    weapon.damage = 1
    weapon.rare = "Diet Valley Cheez"
    weapon.hottexture = love.graphics.newImage("/ledata/invalid.png")
    weapong.playtexture = love.graphics.newImage("/ledata/invalid.png")
    weapon.dura = 1
    weapon.type = "swing"
}

但是在一个主类中你可以创建该类的新对象,就像C#

那样。
weapon Dagger = new weapon();
Dagger.name = "Dagger of Some Mountain"
...

Lua有没有办法做到这一点?

4 个答案:

答案 0 :(得分:3)

另一种方法是使用像这样的表(使用汽车的例子):

    Car = {}
    Car.new = function(miles,gas,health)
        local self = {}

        self.miles = miles or 0
        self.gas = gas or 0
        self.health = health or 100

        self.repair = function(amt)
            self.health = self.health + amt
            if self.health > 100 then self.health = 100 end
        end

        self.damage = function(amt)
            self.health = self.health - amt
            if self.health < 0 then self.health = 0 end
        end

        return self
    end

它创建一个名为'Car'的表,它相当于一个类,而不是一个实例,然后它在Car类中定义一个方法“new”,它返回一个带有变量和函数的汽车实例。使用此实现的示例:

    local myCar = Car.new()
    print(myCar.health)
    myCar.damage(148)
    print(myCar.health)
    myCar.repair(42)
    print(myCar.health)

答案 1 :(得分:2)

有很多方法。这很简单。没有太多的OOP,你没有继承和其他一些东西。但我认为这适用于你的情况。

function weaponFire ()
    print "BANG BANG"
end

function newWeapon (opts)
    local weaponInstance = {}

    weaponInstance.name = opts.name
    weaponInstance.damage = opts.damage

    weapon.fire = weaponFire

    return weaponInstance
end

答案 2 :(得分:1)

Lua是面向对象的,但它不像Java / C ++ / C#/ Ruby等,没有原生的,创建新对象的唯一方法是克隆现有对象。这就是为什么它被称为prototype language(如JavaScript)。

阅读Programming in Lua Chapter 16。您可以使用metatable模拟正常的OOP。

答案 3 :(得分:0)

因为您使用love2d进行了标记,所以您可以查看middleclass。那里有docs。而且它有像stateful这样的插件,主要用于游戏和love2d。