Seite 1 von 1

LinkedList() : Struktureintrag mit bestimmten Wert suchen?

Verfasst: 20.12.2006 20:49
von Vermilion
Hallöle,
ich wechsele ziemlich oft zwischen den Projekten die ich mache. Jetzt bin ich wieder bei der Programmierung einer Tile Engine. Naja, ok, meine Frage steht nicht direkt mit der Tile Engine in Verbindung, ist jedoch zusammenhängend:

Kann ich einen Listeneintrag (der Typ der Liste ist eine Struktur) suchen, indem ich die Werte der Liste durchsuche?

Genaueres zum Umfeld der Angelenheit:

Strukturaufbau:

Code: Alles auswählen

Structure
  Sprite.l
  X.l
  Y.l
EndStructure
Durch MouseButton(#PB_MouseButton_Left) erhalte ich die Werte für die X- und Y-Position des Sprites (Sprite ist ja jetzt nicht von Bedeutung).
Nun will ich die erhaltenen Werte mit denen in der Liste für die Objektdarstellung vorhandenen vergleichen, um zu überprüfen, ob an der Position schon ein Objekt vorhanden ist.
Und da kommt halt die Sache, dass ich einfach einen Listeneintrag suche, der die gleichen Werte hat. Ansonsten müsste ich alle Listeneinträge einzeln mit dem neuen vergleichen, oder?

Verfasst: 20.12.2006 20:54
von edel
Nimm doch einfach 'ne Array mit x und y oder
kommt da noch mehr dazu ?

Verfasst: 20.12.2006 21:09
von Vermilion
Naja, 3 Werte, X, Y, SpriteID. Die SpriteID sagt, welches Sprite an der Koordinate angezeigt werden soll, also sozusagen, Haus1 oder Haus2 oder so.

:!: Die Sprites sind auch nicht immer nur so groß wie 1 Tile der Map, die Größe kann variieren.

Das macht es nicht so Sinnvoll, so sehe ich das, falls es anders ist, dann bitte sagen, ein Array zu verwenden.

Verfasst: 20.12.2006 21:21
von Kaeru Gaman
du kannst einen zusatzeintrag in deinem Tile-Array vornehmen.

im Tile-Array kannst du einen zweiten Layer vorsehen.
dort hinein schreibst du einen platzhalter, wenn das tile von einem haus überdeckt wird,
und eine hausnummer, wenn es das Basistile des hauses ist.
wenn du deine tilemap von oben nach unten und von links nach rechts zeichnest,
ist dieses basistile die untere rechte ecke des hauses.
direkt nach diesem tile zeichnest du das haus direkt in der tile-engine,
damit überdeckt es alle anderen boden-tiles, die unter ihm liegen.
die platzhalter sind dafür da, dass du nicht ein haus über einem anderen plazieren kannst.

deine liste mit koordinaten wäre eine recht umständliche lösung,
da du nicht nur die komplette objektliste durchsuchen müsstest,
du müsstest ja auch prüfen, dass sich häuser nicht überschneiden.
wenn du also ein haus an x/y hast, und das haus ist 64x64 groß,
dann kannst du an x+47/y+53 auch kein haus setzen.

die objekte im zweiten Layer der tilemap mitzuführen ist praktischer.

Verfasst: 20.12.2006 21:37
von Vermilion
Das musste ich mir jetzt mehrmals durchlesen, habe es aber nicht ganz verstanden. :|
2. layer in einem Array? Ich dachte schon an verschiedene Layer, aber das jeder Layer ein eigenes Array ist...
Was mich wunder ist, dass das Basistile die rechte untere Ecke sein soll. Ich hätte jetzt eigentlich die obere linke genommen. Wieso das?

Ich habe mir gerade schon noch selber die Hilfe reingezogen... also einem Array Eintrag weise ich so einen Wert zu, oder?( : )

Code: Alles auswählen

Dim MapObjects.l(Mapwidth, MapHeight)
MapObjects(ActiveTyleX, ActiveTyleX) = 1
Wenn ja, dann weiß ich, glaube ich, schon weiter... :D Nur ist dann halt nur noch die Frage, ob das jetzt groß etwas ausmacht, ob ich jetzt 2 Arrays oder eines mit 2 Layern nehme.

Verfasst: 20.12.2006 21:54
von Kaeru Gaman
wenn du ein einziges array hast, kannst du den zweiten layer unmittelbar
nach dem ersten zeichnen, also im selben schleifendurchlauf.
du brauchst dann keine extra-doppelschleife für jeden layer.

dadurch wird auch klar, warum die untere rechte ecke:
du zeichnest das haus unmittelbar nach der tile auf der es sitzt,
im selben schleifendurchlauf.
also zeichnest du die weiteren bodentiles später, nämlich in den folgenden schleifendurchläufen.
wenn du jetzt das haus zeichnen würdest, wenn du dich an seiner oberen linken ecke befindest,
würden die nachfolgenden bodentiles über das haus gezeichnet werden.

mehrere layer in einem array löst man z.b. mit einer structure:

Code: Alles auswählen

Structure Tile
  Layer1.b
  Layer2.b
EndStructure

Dim Map.Tile(255,255)

Verfasst: 20.12.2006 22:03
von Vermilion
/:-> Das mit den Layern ist mal wieder eine der genialen Sachen, auf die man irgendwie nicht von alleine kommt, obwohl sie doch so einfach sind.

OK, danke, du warst mal wieder eine große Hilfe Kaeru! :mrgreen: Ich werde mich dann mal da ran setzen...

Übrigens: eine aus meiner Klasse, Sarah Fingerhut, die wohnte auch mal in Korbach...