2013-08-23 92 views
3

我是Lua的新手,我想知道是否有一種方法可以讓許多類對象在我的情況下生成不同的項目,就像在C#或Java之類的OOP語言中一樣。我在說什麼的一個例子是一類像這樣在Lua ...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中做到這一點?

回答

1

Lua是面向對象的,但它不喜歡的Java/C++/C#/ Ruby的,等等,有沒有本地類,創建新的對象的唯一方法是複製現有的對象。這就是爲什麼它被稱爲prototype language(如JavaScript)。

閱讀Programming in Lua Chapter 16。你可以使用metatable來模擬正常的OOP。

+0

所以我能做出像匕首=武器Dagger.name =「匕首」 ...... – freemann098

+0

@ freemann098是的,你可以,Lua中提供了製造工具,你需要的工具一些工作,但。閱讀這本書,這是每個Lua程序員應該閱讀的書。 –

+0

我也會建議[MiddleClass](https://github.com/kikito/middleclass):它是一個爲Lua實現Object-Orientation的庫。 –

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 
0

由於您使用love2d標記了標籤,因此您可以查看middleclass。那裏有docs。還有更多的插件,如stateful,主要用於遊戲和love2d。

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類中定義了一個「new」方法,它返回一個帶有變量和函數的汽車實例。使用這種實現的一個例子:

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