[Sammelthema] Objektorientierte Programmierung (OOP)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • LUA-Quellcode

      1. dxButton = {}
      2. function dxButton:createButton(x,y,w,h,text,callfunc)
      3. local o = setmetatable({},{__index = self})
      4. self.x = x
      5. self.y = y
      6. self.w = w
      7. self.h = h
      8. self.text = text
      9. self.callfunc = callfunc
      10. self.visibility = true
      11. return o
      12. end
      13. function dxButton:getText()
      14. return self.text
      15. end
      16. local instanz1 = dxButton:createButton(1,1,1,1,"Hallo",func)
      17. local instanz2 = dxButton:createButton(1,1,1,1,"text",func)
      18. addCommandHandler("text",function()
      19. local text = instanz1:getText()
      20. outputChatBox(text)
      21. end)
      Alles anzeigen


      Kommt immernoch "text" raus anstatt "Hallo"
      Mfg
    • Du hast oben "o" definiert. Willst aber in self die Sachen setzen..

      LUA-Quellcode

      1. function dxButton:createButton(x,y,w,h,text,callfunc)
      2. local o = setmetatable({},{__index = self})
      3. o.x = x
      4. o.y = y
      5. o.w = w
      6. o.h = h
      7. o.text = text
      8. o.callfunc = callfunc
      9. o.visibility = true
      10. return o
      11. end
      Alles anzeigen


      Unten kannste dann self verwenden.
    • Ich hab garnicht gewusst, das es auch ein OOP-Sammelthema gibt - also schiebe ich meine Frage aus dem Sammelthema einfach hierher. Es geht um folgendes: Ich möchte gerne die Position eines Fahrzeugs auslesen und speichern, es kommt aber immer ein 'userdata' error, mit dem ich nichts anfangen kann. Als Codeschnipsel sieht das dann so aus:

      LUA-Quellcode

      1. function sVehicle:savePosition()
      2. local x,y,z = self:getPosition()
      3. local rx,ry,rz = self:getRotation()
      4. -- hier ein Datenbankeintrag, nicht relevantend

      laut dem Beispiel von createVehicle schätze ich, das ich mit Vector3() arbeiten muss, aber mangels Wiki-Einträgen weiß ich nicht wie man das benutzt.


      LUA-Quellcode

      1. --Wiki-Eintrag
      2. infernus = Vehicle(411, Vector3(0, 0, 3))-- man sieht den Vektor als Positionsangabe


      Ich kann den Fehler auch reproduzieren:

      LUA-Quellcode

      1. --das geht
      2. outputChatBox(Player("MasterM"):getHealth())
      3. -- das geht nicht
      4. local x,y,z = Player("MasterM"):getPosition()
      5. outputChatBox(x..","..y..","..z)


      Kurz gefasst weiß ich nicht wie ich aus einer Methode mehrere Rückgabewerte bekomme. Ich hoffe mal das mir die Frage ein schlauer Kopf beantworten kann. PS: Ich habe den OOP-Tag in der Meta auf true gesetzt
    • MTA OOP unterstützt leider keine Attribute auf Objekte. Du kannst jedoch per debug.setmetatable eine eigene Metatable setzen. Nachteil daran ist jedoch erstmal, dass das MTA OOP dann nicht mehr funktioniert. Abhilfe schafft an dieser Stelle die Verwendung der Classlib: github.com/sbx320/lua_utils/blob/master/classlib.lua


      Shape schrieb:

      Nytech ist ein scheiß Ami, der darf rassistische Witze machen!

      Wer einige meiner Kommentare ernst nimnt ist selbst dran schuld
    • @MasterM:
      Die OOP Funktionen geben, wie du schon bemerkt hast, Vektoren zurück.

      Um aus einem Vektor wieder die einzelnen Koordinaten zu erhalten kannst du einfach folgendermaßen vorgehen:

      LUA-Quellcode

      1. local pos = Player("MasterM"):getPosition()
      2. outputChatBox(pos.x..","..pos.y..","..pos.z)
      Mich per PN bezüglich Freischaltungen zu nerven ist der beste Weg eine Freischaltung zu verhindern.

      neon-gaming.de
    • LUA-Quellcode

      1. Dog = {}
      2. Dog.__index = Dog
      3. function Dog:new(name,color,breed)
      4. local init = {}
      5. setmetatable(init,self)
      6. init.__index = self
      7. init.name = name
      8. init.color = color
      9. init.breed = breed
      10. init.age = 0
      11. init.thirsty = false
      12. init.hungry = false
      13. return init
      14. end
      15. function Dog:setName(name)
      16. self.name = name
      17. end
      18. function Dog:feed()
      19. self.thirsty = false
      20. self.hungry = false
      21. end
      22. local Dog = Dog:new("Rex", "brown","Scout")
      Alles anzeigen


      Würde das so stimmen?
    • Hidin schrieb:

      LUA-Quellcode

      1. Dog = {}
      2. Dog.__index = Dog
      3. function Dog:new(name,color,breed)
      4. local init = {}
      5. init.name = name
      6. init.color = color
      7. init.breed = breed
      8. init.age = 0
      9. init.thirsty = false
      10. init.hungry = false
      11. setmetatable(init,self)
      12. return init
      13. end
      14. function Dog:setName(name)
      15. self.name = name
      16. end
      17. function Dog:feed()
      18. self.thirsty = false
      19. self.hungry = false
      20. end
      21. local Dog = Dog:new("Rex", "brown","Scout")
      Alles anzeigen


      Würde das so stimmen?

      Habs verbessert
    • setmetatable wie der Befehl schon heisst wandelt eine Table in eine metatable um. Wenn du mehr über metatables wissen willst dann geh auf die seite LUA GTS Stolberg dort kannst du mehr darüber lesen.
      Mfg Iven

      Deine Erklaerung ist genauso miserabel wie die Erklaerung auf GTS Stolberg. Das ist alles sehr fachsprachlich geschrieben, ich hatte es da auch nicht verstanden.
      Lua-Tutorials
      (http://bit.ly/lua-rookietutorials)
    • Iven schrieb:

      setmetatable wie der Befehl schon heisst wandelt eine Table in eine metatable um.

      So formuliert ist es falsch. Eine Metatable ist einfach eine Table, in der Zusatzinformationen zu der ursprünglichen Table mit u.a. spezieller Bedeutung gespeichert werden.

      So lassen sich Metatables z.B. nutzen, um Werte zu setzen, die nicht bei der Iteration mit einer for-Schleife eingeschlossen werden:

      LUA-Quellcode

      1. local myTable = {a = 1, b = 2, c = 3}
      2. setmetatable(myTable, {d = 4})
      3. for k, v in pairs(myTable) do
      4. print(k, v) -- Ausgabe der Felder a bis c
      5. end
      6. -- Ausgabe von d
      7. print(getmetatable(myTable).d)

      Ob es sinnvoll ist, Metatables dafür zu nutzen, ist jedoch eine andere Sache (im Regelfall sollte das aus Übersichtsgründen eher vermieden werden).

      Der eigentliche Anwendungszweck von Metatables besteht darin festzulegen, wie eine Table sich bei bestimmten Operationen verhält. Diese Operationen werden Metamethoden genannt.
      So gibt es z.B. die Metamethode __add, die aufgerufen wird, wenn jemand versucht 2 Tables zu addieren:

      LUA-Quellcode

      1. local t = {1}
      2. setmetatable(t, {__add = function(operand1, operand2) return operand1[1] + operand2 end})
      3. local var = t + 2 -- var = 3

      Wenn jetzt in Zeile 4 versucht wird eine Table + Zahl zu addieren, wird die Metamethode __add aufgerufen, die das erste Feld von t (t[1] == operand[1]) und den 2. Operanden (in diesem Fall also 2) addiert. Das Ergebnis ist dementsprechend 3.

      Eine Übersicht mit allen Metamethoden ist hier zu finden: lua-users.org/wiki/MetatableEvents
    • Moin,
      ich hab mal wieder ein Problem. Ich hab zwei Klassen, die ich miteinander kommunizieren lassen möchte. Zum einen eine Spielerklasse und zum anderen die Spielklasse an sich. Wenn ich jetzt eine Methode der jeweils anderen Klasse aufrufen will, funktioniert das nur zu der jeweils höheren in der Meta. Jetzt möchte ich aber Daten hin- und herschicken. Wie kann ich das am Besten lösen?
    • Ich hab gerade mal den gesamten Startprozess auseinandergeschnitten, um zu sehen, woher der Error kommt. Jetzt ist er komischerweise weg. Ich glaube ich muss nochmal neu anfangen zu schreiben, da sich irgendwo ein Bug eingeschlichen hat -,- Beim testen ist mir folgendes aufgefallen:

      LUA-Quellcode

      1. triggerClientEvent(self,"RCB_newGame",self)



      Wenn ich triggerClientEvent so verwende, bekomme ich einen Game-Crash. Ich trigger es aber nur aus der Spielerklasse und kann auch mit self:getName() usw. alles vom Spieler abfragen, also liegt es schonmal nicht am self. Oder doch? Ist self denn ein Element oder nur eine Instanz? Kann ich das mit der Classlib beheben? Und warum kann ich normale Events von Instanzen triggern, eigens erstellte aber nicht?
    • Self ist eine Instanz, dies macht aber normal nichts da beim Triggern der "status" als Metatabelle verloren geht.
      Ich werde es nach mal testen, dann kann ich dir sagen ob dies bei mir auch so ist.

      Ist self denn ein Element oder nur eine Instanz? Kann ich das mit der Classlib beheben

      Die Classlib nutzt dir hierbei nichts, da enew das gleiche wie die MTA macht.

      - StivIK