LinkedList() : Struktureintrag mit bestimmten Wert suchen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

LinkedList() : Struktureintrag mit bestimmten Wert suchen?

Beitrag 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?
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nimm doch einfach 'ne Array mit x und y oder
kommt da noch mehr dazu ?
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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...
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Antworten