Du bist nicht angemeldet.
Habe die vom Thema abweichenden Beitraege in einen neuen Thread verpflanzt
BlitzMax - Gameloop und Objektupdates.
bye
Ron
hummm, na ich mache das jetzt gewiss wieder viel zu sehr spaghetti mäßig
aber ersteinmal überhaupt etwas hinbekommen und dann dazu lernen
Wenn ich das was ich gerade versuche, zum anschauen fertig habe, lade ich's mal hoch.
Hauptmenü und 1 Untermenü habe ich erstellt ....
nun muss ich mich ersteinmal um die Maussteuerung/Handling kümmern um das ganze dann auszuprobieren ob das so werden könnte wie ich es mir denke
gruß
~s~
Hab das zu einem eigenen Thread gemacht - und gleich ein neues Forum angelegt.
@Listen:
Du kannst dir das erste (First), das letzte (Last) und ein beliebiges (ValueAtIndex) Element zurueckgeben lassen.
Aus einem Array kannst Du natuerlich bequem per array[pos] abrufen.
Interessant ist aber auch eine TMap - das ist ein Baum in dem "Key" und "Value" wie "Listen" sind. die "Keys" sortieren sich dabei alphabetisch und sind "Strings.
Vergleichbar mit einer Hashmap.
Nuetzlich ist sowas, wenn man mit "GUIDs" arbeiten will - also keinen IDs die nur aus Zahlen bestehen sondern Dinge wie "menu_001".
local map:TMap = CreateMap()
map.insert("meinschluessel", objekt)
local obj:objekttyp = objekttyp(map.ValueForKey("meinschluessel"))
TMap kann aber keine "nicht objekte" als Objekt speichern: also "Zahlen" lassen sich nicht einfach so drin speichern, die muss man vorher mit "string(zahl)" in einen Text umwandeln - und dann beim Auslesen: "int( string(map.ValueForKey(key)) )" wieder in einen integer (oder float...) umwandeln.
Listen benutzt man, wenn man eh immer "alle" durchiteriert ... also bspweise bei GUIObjekten und nicht alle mit einem Namen kennen will . Will man das aktive "Menue" irgendwo hinterlegen, machst Du dir noch ein
global activeMenue:TMenue = null
und setzt dann einfach diese Variable entsprechend.
"Untermenues" koennte man so gestalten:
Type TMenue
Field children:TList = CreateList() 'verschiedene Untermenues
Field parent:TMenue = null
End Type
Allerdings schafft sowas eine sogenannte "zyklische Referenz" - heisst: Das eine Menue hat als Eigenschaft das andere Menue - was wiederum in seiner Liste das andere Menue gespeichert haette. Selbst ohne die "children"-Liste haette man eine Referenz die rein theoretisch problematisch waere.
MenueA hat als "parent" MenueB
Nun loeschst du MenueB aus der "Menueliste" - MenueB ist dann aber nicht aus der Welt geschafft - denn es lauert noch immer in MenueA. Wenn man nun MenueA loescht, wuerde - wenn nicht aufgepasst wird - MenueB noch ungeloescht bleiben. Darum sollte sich aber der "GarbageCollector" von BlitzMax kuemmern. Vermeiden sollte man aber zumindest "zyklische Referenzen".
Bei TVTower haben wir da einiges auf "Collections/Manager" umgestellt - bzw Referenzierung von Basistypen. Klingt wieder komplizierter als es ist.
Alternativ koennte man alles in einer TMap Speichern - und anhand des "Schluessels" sehen ob es ein Untermenue gibt. Man wuerde sozusagen die "Verschachtelung" aufloesen in dem man die Information in den Schluessel kodiert ("menuA_child1") - aber mach dir das nicht zu kompliziert, nimm das so wie ich oben beschrieb (mit parent und children). "TList" hat die zyklische Referenz ja auch (jedes Listenelement kennt "next" und "previous" ... bei 2 Elementen in einer Liste verlinkt A ja B aber B auch A).
bye
Ron
Danke für deine Erklärung, demnach kann man halt in einer liste nur etwas ändern wenn man immer die ganze liste durchgeht.?!
Das kann an manchen stellen gewiss praktisch sein, aber ich denke dann schaue ich mir aber trotzdem das ersteinmal mit den Arrays noch an
Bin ebend beim Spaziergang auf die Idee gekommen eventuell ein Zweidimensionales Array zu machen und dadurch ein Menü mit einer zweiten Ebene (Menü - Untermenü)
Mal sehen was bei raus kommt
Bis dene
~sushi~
ps. hummm, eigentlich hätte ich da ein eigenes thema schon wieder anlegen müssen, denn das past ja nicht wirklich in die Dig-Framework ecke
Es gibt Arrays, TList und TMap - alles hat Vor und Nachteile
bei Arrays und TList kannst Du sie so durchlaufen (und natuerlich gleich nur die Elemente daraus auslesen, die deinem Wunschtyp entsprechen)
Type TMenue
Field name:string
Global list:TList = CreateList()
Method Init:TMenue(name:string)
self.name = name
return self
End Method
End Type
For local i:int = 0 until 5
local m:TMenue = new TMenue
m.name = "bla 0"+i
m.list.AddLast(m)
Next
'alternative
For local i:int = 0 until 5
'folgendes geht, da "Init" ein Objekt TMenue zurueckgibt
local m:TMenue = new TMenue.Init("bla 1"+i)
TMenue.AddLast(m) 'auch so aufrufbar da ja "global"
Next
For local menu:TMenue = EachIn list
print "ich bin Menue ~q" + menu.name + "~q aus der Liste"
menu.name = "Ex-" + menu.name
print "von jetzt an heisse ich ~q" + menu.name + "~q."
Next
Wenn Du direkt "Element 5" abrufen willst, dann nimmst Du "ValueAtIndex". Allerdings liefert das ein "object" zurueck. Du musst also aufrufen:
local meinMenue:TMenue = TMenue(TMenue.ValueAtIndex(3))
if not meinMenue then print "an der Stelle war kein TMenue")
Wenn man mit Arrays arbeitet - nimmt man oft das "Slicing" um Arrays zu verlaengern. Was ich erst seit kuerzlich benutze (mal bei den "Communitytipps" gelesen):
local meineMenues:TMenue[] 'ein unbestimmt grosses Array
meineMenues :+ [new TMenue] 'einfach das anzuhaengende Element in "[ ]" packen
meineMenues = meineMenues + [new TMenue] 'Langform
bye
Ron
hummm,
scheinbar benutzt du ja hier und da auch TList um mit daten zu arbeiten, warum nicht gleich ein Array nehmen?
oder Anders gefragt, gibt's eine möglichkeit eine variable direkt zu beschreiben die in einer TList ist?
Beispiel:
Global MenuList:TList = CreateList()
Type TMenu
Field x:Int
Field y:Int
Field b:Int
Field h:Int
Field name:String
Field status:Int
Method DrawMenu()
SetColor(232, 222, 191)
DrawText(name, x, y)
End Method
End Type
For i = 0 To 5
Local NewMenu:TMenu
NewMenu = New TMenu
NewMenu.x = x
.
.
.
NewMenu.name = "leer"
NewMenu.status = 0
ListAddLast( MenuList, NewMenu )
Next
Nach der Schleife habe ich eine Tlist MenuListe in der lauter TMenu drin sind ... soweit dürfte klar sein?
Kann ich jetzt irgendwie direkt den TMenu.name beschreiben bei "objekt" 3 in der Liste?
Habe da gerade ein Knoten im kopf bzw. nichts gefunden ...
mit ValueAtIndex kann man vielleicht einen wert auslesen, aber das gegenstück dazu habe ich nicht gefunden
gruß
~s~