LUA - Variable Metatables
Übersicht

PhillipKBetreff: LUA - Variable Metatables |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heyho.
Ich habe mal eine frage, und ich weiß nicht so recht, wo ich mir die antworten holen soll. Darum frage ich einfach mal hier, weil es mir zu schwer fällt, aus seitenlangen FAQs und anleitungen für LUA (in englisch :/ ) die passenden antworten rauszufiltern.. ich habs aber versucht! ![]() Ich werkel momentan ein wenig mit LUA rum. LUA ist ja gut und schön, wunderbar ohne Compilen etc mal was testen. Eignet sich wunderbar für Objektscripte etc, deshalb arbeite ich mich dort nun ein. ![]() Ziel ist es, eine art Core Metatable zu erweitern, um variable anzahl an Objekten (hier meine ich zb Häuser) zu realisieren, die zwar auf die selben funktionen hören aber unterschiedliche sachen machen. Beispiel: Ich erstelle THouse:onClick(). Haus1 hat nun als code "print("Haus1")", Haus2 hat nun als code "print("Haus2")" Meine arbeitsweise bisher ist so: Code: [AUSKLAPPEN] THOUSE.LUA
-- grober Dummy für die THouse table. Hält leere funktionen. THouse = {list = {}, exists = {}} THouse_mt = Class(THouse) function THouse:new(name) local cl = setmetatable({name = name}, THouse_mt) THouse.list[name] = cl return cl end function THouse:init() end function THouse:onUpdate() end function THouse:onClick() end function THouse:onDisactivate() end Dazu noch ein Code, welcher mir einen Ordner durchsucht und in jedem unterordner versucht, eine main.lua zu finden. Diese Main.lua ist der "einstiegspunkt" für das neue THouse objekt. Laden der dateien: (For schleife, for i,str in pairs(tab)!) Code: [AUSKLAPPEN] --str ist der totale dateipfad zur main.lua datei! print("str", str) local file = loadfile (str) print("File:: ",file) local dir = string.sub(str,1, str:len()-8):gsub("/","\\") --filtert den ordnerpfad. local house = file(dir) -- ruft die mit loadfile geladene ?funktion? auf, mit dir als argument. Eine solche Hausdatei kann nun zb so aussehen: Code: [AUSKLAPPEN] local file = ...
local houseName = "Haus" local house = THouse:new(houseName) local gfx = "" house.file =file house.init = function(self) self.sizeX = 90 self.sizeY = 78 end house.build = function(self, x,y) local h = self:copy() THouse.exists[table.getn(THouse.exists)+1] =h return h end return house Ist alles etwas abgespeckt, weil viel unnötiger testkram drinsteht. So oder so, es funktioniert auf diese weise, wirkt aber ziemlich dreckig gelöst. Schon alleine, das ich für house.init etc neue funktionen anlegen muss, nervt. Gibt es schönere wege, sowas zu lösen, als die funktionspointer jeder table einzeln zu überschreiben? Viele sachen sind identisch, dh zb ein Fenster einrichten, image.png laden etc. Meist ändern sich nur koordinaten und der Name (house.name = "XYZ") - dafür muss ich aber jede funktion neu anlegen, weil ich keinen anderen weg finde ![]() Am liebsten wäre es mir, wenn ich, ähnlich wie in blitzmax (Type THouse_windmill extends THouse) einfach die benötigten funktionen neu schreiben könnte, in gewohnter form: Code: [AUSKLAPPEN] function house:build(...)
Vorschläge?^^ Gruß, PhillipK |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group