Types speichern, Problem sowohl mit Array als auch mit Tlist
Übersicht

GravediggerBetreff: Types speichern, Problem sowohl mit Array als auch mit Tlist |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen
Ich versuche eine Hexfeld-Engine zu programmieren, auf die Einheiten plaziert werden sollen. Das ganze ist objektorientiert und ich möchte sowohl Hexfelder als auch die Einheiten als Objekte verwalten. das Problem beim Speichern der Objekte in Arrays: Blitzmax unterstützt scheinbar keine automatische vergabe von Array-Indizes. Ich kann also nicht einfach ein neues Element an das Array anhängen, indem ich die ID weglasse, zb. units[] = new einheit Auch das Ermitteln einer freien ID erweist sich als schwierig. Wenn ich die Größe des Array ermittele, habe ich immer noch keine Garantie, dass die ID frei ist, wenn zwischenzeitlich einzelne Elemente gelöscht wurden. Das Problem beim Speichern der Objekte in Listen : Habe noch nicht rausgefunden, ob und wie man den Elementen des Listenobjektes Id's zuweisen kann. Jedes Mal, wenn ich ein Objekt in der Liste suche, muß ich alle Elemente durchlaufen um nach bestimmten Eigenschaften zu suchen. Ansich müßte dieses Problem ja häufig bei Projekten auftreten, die mit Maps und Einheiten zutun haben. Perfekt wäre übrigens eine Möglichkeit zu sagen: Hole mir Objekt x aus Liste y in dem eigenschaft z1 = 1 und z2 = 4 ist (ja, ich bin neu bei Blitzmax und habe beruflich mit SQL zutun ![]() aber auch für jede andere Lösung wäre ich äußerst dankbar... ![]() |
||
Weisheit ist nicht, zu behaupten jedem etwas beibringen zu können - sondern Weisheit ist die Fähigkeit von jedem etwas lernen zu können. |
![]() |
mahe |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klingt als möchtest Du Maps verwenden.
Funktioniert ziemlich genau so wie das was Du mit den Arrays anstellen wolltest. |
||
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ, |
GravediggerBetreff: Ja, eine Map will ich erstellen... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
...aber was sind denn nun Maps in Blitzmax? Ist das eine weitere Art Listenobjekt oder ein auf diesen Einsatzzweck optimierter Datentyp?
Ich habe in der Hilfe nichts derartiges gefunden, von daher bringt mich das leider nicht weiter... ![]() |
||
Weisheit ist nicht, zu behaupten jedem etwas beibringen zu können - sondern Weisheit ist die Fähigkeit von jedem etwas lernen zu können. |
![]() |
mahe |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt eine Map-Klasse die einen auf diesen Einsatzzweck optimierten Datentyp darstellt ... oder so ähnlich.
Ich glaube, intern sind es irgendwelche Bäume. Kann Dir aber erstmal egal sein. Auf jeden Fall solltest Du die Dokumentation lesen. Das geht schneller als jedes Detail zu erfragen! |
||
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ, |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine Hex-Map kannst du doch einfach auf ein 2D-Array projizieren. Da brauchts dann keine kompliierten Listen oder gar Hashmaps. | ||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Neues Element anfügen (ist sogar erstaunlich schnell):
Code: [AUSKLAPPEN] array = array[..array.Length + 1]
array[array.Length - 1] = new Einheit Freien Platz finden: Code: [AUSKLAPPEN] For Local i:Int = 0 to array.Length - 1
If array[i] = Null Then array[i] = new Einheit Exit EndIf Next Das löschen ist etwas umständlicher, aber auch nicht unmöglich ![]() TMap: Code: [AUSKLAPPEN] Local map:TMap = new TMap
map.Insert("my_id", new Einheit); Local e:Einheit = Einheit(map.ValueForKey("my_id")) |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Arrays sind statisch. Jedes verändern der größe hat eine komplette kopie des Kompletten Arrays zur folge.
Dafür sind arrays sehr schnell, wenn es um zugriff per index geht. Linkedlists sind dafür sehr schnell was das ändern der größe angeht, da sie komplett dynamisch sind. Auch das einfügen und entfernen von nodes in der mitte ist kein Problem. Nur per Index zugriff ist sehr lahm, weil dafür immer die komplette liste durchgegangen werden muss. |
||
GravediggerBetreff: @Jolinah - das ist genau was ich wissen wollte |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Hinzufügen von Einheiten habe ich auch genauso gelöst wie in deinem Vorschlag, der Knackpunkt war nur, daß ich nicht wusste, dass man TLists auch eine ID zuweisen kann. Programmiere normalerweise in PHP wo es nur Arrays gibt, diese aber wesentlich flexibler gehandhabt werden können.
Die Map speichere ich nun in einem Array, allerdings eindimensional. Das in dem jeweiligen Element gespeicherte Hexfeld-Objekt weiß selber wo es hingehört. Damit kann ich die Felder bei Bedarf auch ohne verschachtelte eachin-Schleifen durchlaufen. Types machen hier tatsächlich keinen Sinn, da sich das Spielfeld während einer Partie in der Regel nicht verändert... ![]() Die Methode der Map-Klasse zum Zeichnen der kompletten Map beschränkt sich dann auf Folgendes Code: [AUSKLAPPEN] Method draw() For eh:hexfeld = EachIn fieldlist eh.draw() Next For ee:einheit = EachIn unitlist ee.draw() Next EndMethod Mir ist bewusst, dass die dadurch entstehenden vielen Methodenaufrufe die Sache nicht gerade schneller machen, aber Übersicht ist mir dann doch wichtiger als Performance, zumal sich die Mapgröße und Einheitenanzahl bei Historyline in überschaubaren Grenzen hält... |
||
Weisheit ist nicht, zu behaupten jedem etwas beibringen zu können - sondern Weisheit ist die Fähigkeit von jedem etwas lernen zu können. |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube du brauchst dynamische arrays.
Ich mach das so: Code: [AUSKLAPPEN] global myarray:int[] myarray = new int[0] und dann: Code: [AUSKLAPPEN] for i=0 to 10 myarray[i] = i myarray = myarray[..len(myarray)+1] next Hoffe das ist was du suchst... |
||
WIP: Vorx.Engine |
![]() |
mahe |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Array jedesmal um 1 zu vergrößern ist keine besonders kluge Idee. Da wäre es z.B. besser die Größe jedesmal zu verdoppeln wenn es voll ist und wieder zu verkleinern wenn eine bestimmte Auslastung unterschritten ist (wenn es wirklich so dynamisch und ein Array sein muss). Da wird dann zwar immer etwas Speicher verschwendet (bzw. reserviert) es ist aber weitaus schneller (weniger Arbeit).
Ideal wäre es natürlich die Größe von Anfang an zu kennen. |
||
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ, |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum so umständlich? Die map-größe ist von anfang an klar. Und jedesmal per Eachin alles durchzugehen ist PErformance-Killer schlecht hin. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group