Du bist nicht angemeldet.

#1 05.04.2014 15:36

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Blitzmax - Listen/Arrays

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 tongue

gruß
~s~


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#2 05.04.2014 15:53

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.709
Webseite

Re: Blitzmax - Listen/Arrays

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


sigimg2.php?id=1

Offline

#3 05.04.2014 16:46

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: Blitzmax - Listen/Arrays

Danke für deine Erklärung, demnach kann man halt in einer liste nur etwas ändern wenn man immer die ganze liste durchgeht.?! smile

Das kann an manchen stellen gewiss praktisch sein, aber ich denke dann schaue ich mir aber trotzdem das ersteinmal mit den Arrays noch an smile

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 smile
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 smile


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#4 05.04.2014 17:49

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.709
Webseite

Re: Blitzmax - Listen/Arrays

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 biggrin. 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


sigimg2.php?id=1

Offline

#5 05.04.2014 18:00

sushiTV
Mitglied
Ort: Leipzig
Registriert: 10.03.2014
Beiträge: 496

Re: Blitzmax - Listen/Arrays

hummm, na ich mache das jetzt gewiss wieder viel zu sehr spaghetti mäßig smile
aber ersteinmal überhaupt etwas hinbekommen und dann dazu lernen gw_smiley_zwinkern

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 smile

gruß
~s~

Beitrag geändert von sushiTV (05.04.2014 18:02)


das Leben ist ein scheiß Spiel, hat aber ne geile Grafik

Offline

#6 06.04.2014 09:55

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.709
Webseite

Re: Blitzmax - Listen/Arrays

Habe die vom Thema abweichenden Beitraege in einen neuen Thread verpflanzt

BlitzMax - Gameloop und Objektupdates.


bye
Ron


sigimg2.php?id=1

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Bist Du ein Mensch oder ein Roboter ?

Verifizierung, dass diese Aktion durch eine reale Person vorgenommen wird und nicht von einem Programm.