KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: [TUT, LUA] Tabellen und deren benutzung
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Um Tabellen richtig nutzen zu können, muss man erstmal wissen, wie diese funktionieren und wozu sie gut sind.

Mit Tabellen Kann man mehrere variablen in einer Speichern. Das funktioniert so, dass jede Variable in einer Tabelle eine art Adresse hat. Das kann eine Zahl, aber auch ein Wort oder nur ein Buchstabe sein. Eine Tabelle kann sogar Variablen von verschiedenen Typen gleichzeitig beinhalten.

Eine Tabelle muss im gegensatz zu anderen Variablen erstmal erstellt werden. Mann kann die tabelle direkt beim erstellen, aber auch nachher "füllen". der Code zum alleinigen erstellen einer tabelle sieht z.b. so aus:

Code:
a={}

Jetzt kennt das Programm eine Tabelle mit dem namen a, welche aber noch keinen Inhalt hat. Wenn ich die Tabelle direkt beim erstellen "befüllen" will, schreibe ich das z.b. so:

Code:
a={x=10, y=20, name="Franz", bild=Image.load("bg.jpg"), farbe=Color.new(255,255,255,255)}

Nun kennt die tabelle die Variablen x,y,name,bild und farbe. Um Jetzt eine der Variablen abzufragen schreibt man den namen der Tabelle, dann einen Punkt und dann den namen der abzufragenden Variable in der Tabelle. Wenn man jetzt z.b. den String (=den Text) der unter dem namen name in der tabelle a abgespeichert ist in der Farbe die unter dem namen farbe in der tabelle steht anzeigen will, dann macht man das so:

Code:
screen:print(10,10,a.name,a.farbe)
screen:flip()

Das würde dan auf dem Display (in weiss) erscheinen:

Code:
Franz

man kann auch variablen aus der tabelle in andere variablen speichern. z.b. so:

Code:
hintergrundbild=a.bild

Wenn man die Tabelle nach dem erstellen befüllen (oder ändern) möchte, geht das genau umgekehrt, z.b. so:

Code:
a.name="Heinz"


Jetzt kommen wir zur Dritten art der befüllung einer Tabelle und damit zum interesanntesten Teil. Wie am Anfang schon gesagt, kann die Adresse in einer Tabelle auch eine Zahl sein, nur dann funktioniert das "befüllen" und "abfragen" etwas anders. statt namen der Tabelle, dann einen Punkt und dann den namen schreibt man den Namen der Tabelle, den eine Eckige Klammer auf, dann die Zahl (die adresse) und dann eine eckige klammer zu. Wichtig ist, dass aucuh hier die Tabelle vorher erstellt werden muss, undzwar in diesem fall mit a={}

Code:
a={}
a[1]=42
a[2]=17
a[3]=56
a[4]="Test-Text"
a[5]=Color.new(0,0,0,255)

So hätte ma die Adressen 1-5 gefüllt. Wenn man jetzt z.b. den inhalt der Adresse 3 mit der Farbe, welche in der Adresse 5 abgespeichert ist aneigen will, macht man das so:

Code:
screen:print(10,10,a[3],a[5])
screen.flip()

Das würde dan auf dem Display (in schwarz) erscheinen:

Code:
56


Wenn man nun z.b. die Zahlen 1 bis 50 in eine Tabelle schreiben will, könnte man das z.b. so:

Code:
a={}
i=1
while i<=50 do
a[i]=i
i=i+1
end

und wenn man sowas auf dem Display untereinander anzeigen lassen wollte, kann man das z.b. so:

Code:
a={}
i=1
while i<=50 do
a[i]=i
i=i+1
end
-------nun ist die tabelle gefüllt und wird jetzt auf ähnliche weise wieder ausgegeben.
weiss=Color.new(255,255,255,255)
i=1
while i<=50 do
screen:print(10,i*10,a[i],weiss)
i=i+1
end



So, Jetzt wisst ihr wie man tabellen erstellt, befüllt und abfragt. Hier kommt jetzt noch eine Zusammenfassung und eine Liste der wichtigsten Befehle, die mit Tabellen zu tun haben.

Zusammenfassung:
Tabelle erstellen: a={}
Tabelle befüllen: a={x=1, y=50}
oder a.x=1
oder a[1]=1
Tabelle abfragen variable=a.x
oder variable=a[1]


Die Wichtigsten Befehle:
table.concat (tabelle , zwischentext , ab wann , bis wo)
--verbindet die Werte einer tabelle.
table.foreach (tabelle, funktion)
--geht alle Felder einer table durch und übergibt sie ggf an eine Funktion.
table.getn (tabelle)
--gibt die Anzhal der Felder einer Tabelle zurück
table.sort (tabelle , funktion)
--sortiert eine table. Ist keine Funktion gegeben wird nach groesser/kleiner Prinzip sortiert.
table.insert (tabelle, position, wert)
--fügt ein Feld in eine vorhandene table ein.
table.remove (tabelle , position)
--loescht ein Feld einer table
table.setn (tabelle, felderanzahl)
--gibt die Anzahl der Felder einer Tabelle vor.


Wo man Tabellen verwenden kann:

Tabellen kann man z.b. bei der darstellung eines menüs gebrauchen. anstatt jeden menüpunkt eineln zu programmieren, muss man nur noch die Tabelle füllen und abfragen. Aber auch Textdateien kann man z.b. Zeile für Zeile in eine Tabelle Speichern und dann ausgeben. Für die die zufällig mein Homebrew AX kennen, bei allen Downloadlisten, bei den Newslisten, der darstellung von Textdateien und dem anzeigen von News hab ich Tabellen benutzt. Ohne sie wäre der quelltext mindestens 10 mal so lang.

1.KOPIEREN NICHT ERLAUBT
2.FRAGEN ABER GERNE

Grandioses Tutorial, ein must read für Anfänger. Weiter so, kriegst ein Danke.
Ich muss Lett1 zustimmen echt gutes TUTthumb
update: hatte einen kleinen fehler gefunden. hatte bei den code-beispielen, bei denen hohgezählt wird die zeile i=i+1 vergessen. das ist nun behoben.
Sind das die selben Befehle, wie bei PGE?
ja, mir fällt so auf anhieb bei den Tabellen kein unterschied zwischen PGE und HM Lua ein.
Es gibt keinen Unterschied im Syntax zwischen HM und PGE, nur die Funktionen heißen anders.
Ich würde sagen das sind tables und keine Tabellen!
Würdes du noch ein CodeBeispiel für die SaveGame funktion machen? sonst würde ich das tun xD
Table ist doch nur das englische Wort für Tabelle -.-
Oder Tisch siesta

Was ist jetzt genau der Unterschied bei den Funktionen?
Danke dir fürs Tutorial will Lua umbedinkt lernen damit ich paar Homebrews entwickeln kann...Werde mir mal das Wochenende dafür nehmen und mal gucken ob ich nur ein bisschen damit klar komme Big Grin

Danke
Hi Leute,
ich benötige dringend eure Hilfe
ich habe eine Tabelle
local table = {1, 2, 3, 4, 5, 6.....} zum Beispiel
und will aber nicht alle werten der Tabelle ausgeben sondern nur einen Teil (zum Beispiel ab dem 3. oder 5. ausgeben)
wie kriege ich das mit Lua hin
danke im Voraus

Dark_Monkey :
Würdes du noch ein CodeBeispiel für die SaveGame funktion machen? sonst würde ich das tun xD


Ich habe bei meinem Homebrew Dragonball Black auch eine Save-Funktion, die aber wahrscheinlich viel zu umständlich ist. Funktioniert dennoch:

Spielstand.lua:

Code:
spielstand = 1


Du brauchst dann noch im Hauptcode folgende Funktionen:

Script.lua:
1.) spielstand.lua laden.

Code:
dofile("spielstand.lua")


2.) Beispiel fürs speichern, wenn der Spieler "speichern" drückt.

Code:
if pad:cross() and oldpad:cross() ~= pad:cross() and current == 3 then
if spielstand == 1 then
datei = io.open("spielstand.lua","w")
datei:write("spielstand = 1")
datei:close()
elseif spielstand == 2 then
datei = io.open("spielstand.lua","w")
datei:write("spielstand = 2")
datei:close()
elseif spielstand == 3 then
datei = io.open("spielstand.lua","w")
datei:write("spielstand = 3")
datei:close()
end
end

current == 3 steht nur dafür, dass bei meinem Menü die 3.te Option "Speichern" ist und beim drücken von "X" wird dann die Funktion ausgeführt.
wenn der Spielstand = 2 ist, dann überschreibt man natürlich die spielstand.lua in.

Code:
spielstand = 2

die oben gegebene Funktion tut dies von selbst!

3.) eine Funktion, die checkt welcher Spielstand ist und dem entsprechend eine Funktion/en oder Level laden soll:

Code:
if spielstand == 1 then

-~-HIER DEINEN CODE EINFÜGEN-~-

end


bei Fragen und Problemen kann man mir auch eine PN schreiben oder einfach hier im Thread Wink

Seiten: 1 2
Referenz-URLs