2016-10-13 2 views
2

Während eine sehr einfache Klassenvererbung erstellen versuchen, alle Objekte, die die gleichen Werte teilenLua-Objekte nicht eindeutig zuzuordnen

Dies ist eine Vereinfachung meines Codes zu sein scheinen:

--Generic class 
Object = {} 

function Object:new (type,id,name) 
    o = {} 
    self.type = type or "none" 
    self.id = id or 0 
    self.name = name or "noname" 
    self.direction = "down" 
    self.animations = {} 
    self.animations.stack = {} 
    self.animations.idle = {} 
    self.animations.idle[self.direction] = {} 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

function Object:draw(x,y) 
    local img = self.animations.idle["down"][0] 
    print("drawing " ..self.name.." as "..img) 
end 

function Object:setimg(img) 
    self.animations.idle["down"][0] = img 
end 

Player = Object:new() 

-- Player class 
function Player:new(id,name) 
    local o = self 

    o.id = id or 0 
    o.name = name or "noname" 

    o.collision = {} 
    o.collision.type = "player" 

    return o 
end 

function Player:move(x,y) 
    print("moving to ",x,y) 
end 

-- Testing 
blockimg = "block.png" 
grassimg = "grass.png" 
plyrimg = "player.png" 

block = Object:new("solid",1,"block") 
block:setimg(blockimg) 

grass = Object:new("floor",3,"grass") 
grass:setimg(grassimg) 

player = Player:new(1, "plyr1") 
player:setimg(plyrimg) 

block:draw() -- >drawing grass as player.png 
grass:draw() -- >drawing grass as player.png 
player:draw()-- >drawing plyr1 as player.png 

Da Spieler: setimg war Die zuletzt genannten, alle "Objekte" wurden mit dem Befehl "plyrimg" abgeschlossen, so dass sie nicht eindeutig sind.

Antwort

2

Diese Funktion erstellt oder überschreibt jedes Mal, wenn eine neue Objektinstanz erstellt wird, Eigenschaften in der Tabelle gemeinsam genutzter Objekte.

function Object:new (type,id,name) 
    o = {} 
    self.type = type or "none" 
    self.id = id or 0 
    self.name = name or "noname" 
    self.direction = "down" 
    self.animations = {} 
    self.animations.stack = {} 
    self.animations.idle = {} 
    self.animations.idle[self.direction] = {} 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

Sie müssen diese Eigenschaften für jede neue Instanz erstellen, wenn sie eindeutig sein sollen. Andernfalls sucht Object:setimg in der Indexkette nach animations und platziert das Bild in die gemeinsame Eigenschaft.

+0

Verdammt habe ich wirklich nicht verstanden, ist es also sinnlos, Tabellen im Konstruktor zu initiieren? – Mojimi

+0

Es ist nicht sinnlos! Sie müssen nur auf _wich_ Tabelle achten, die Sie im 'Konstruktor' zuweisen - denken Sie daran, dass in 'neu' 'self' auf die _class_ nicht die _instance_ verweist, wenn sie als' Player: new' oder 'Object: new' aufgerufen wird . – Oka

+0

AAAAAAAAAAAAHHHHHHHHHH Ich sehe, jetzt verstehe ich danke – Mojimi

0

Sie können viele Probleme vermeiden, wenn Sie kein Selbst an den Konstruktor übergeben. Ich sehe in der Regel Klassen wie folgt aus:

local class={x=0,y=0} 
local _class={__index=Class} 
-- I like prefixing metatables with _, but that's just a personal thing 
class.new(x, y) 
    return setmetatable({x=x, y=y}, _class) 
end 
class:print() print(self.x, self.y) end 
class.sub(sub) return getmetatable(sub)==_class end 

Dies ist die Klasse, unter der Annahme, entweder in einer eigenen Datei oder in einem do Block die lokalen Variablen zu etwas versteckt zu halten, aber die Klasse und ihre Verschlüsse.

Sie können mehr darüber in der Lua-Dokumentation hier auf Github lesen.

Verwandte Themen