3

我是 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

4 回答 4

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
于 2013-08-23T06:34:50.757 回答
2

另一种方法是使用这样的表格(以汽车为例):

    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)
于 2013-09-15T05:50:42.943 回答
1

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

阅读Lua 编程第 16 章。您可以使用元表模拟正常的 OOP。

于 2013-08-23T06:36:46.287 回答
0

since you tagged with love2d, you may have a look at middleclass. It have docs there. And more it have addon like stateful which is mainly for game and love2d.

于 2013-08-25T11:29:39.473 回答