Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

1

25.06.2011, 01:10

[SFML && C++] Sprite Laufweg mit Tilemap festlegen?

Hallo Leute,

ich bin grade ein wenig am rum probieren, wie ich ein Sprite per Tilemap bewegen kann, aber ich komme nicht weiter. Habt ihr vielleicht Tipps für mich, wie man so etwas umsetzen kann?

Ich möchte einfach nur, dass die Figur ( das Sprite ) dem gelegten Pfad folgt. Ich hab mir schon ein wenig Gedanken gemacht. Vorgestellt habe ich mir das so, nur da komme ich nicht weiter:
1) Tilemap erstellen, Texturen laden
2) ???
3) per Schleifen die Map durchlaufen lassen. ( Ob eine "1" in der Umgebung ist [ der Pfad ] )
4) ???

Ich weiß nicht, ob ich da falsch ran gehe oder ob mir einfach nur ein Gedanke fehlt aber nun ja so weit bin ich. Wenn man nicht weiß, was ich meine:
Stellt euch einfach ein Tower Defense Spiel vor, wo die Figuren auch diesem "einen" Pfad folgen. Ich kann mir vorstellen, dass man das ca. so macht wie ich es vorhabe.

Hoffentlich könnt ihr mir helfen.


MfG Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

2

25.06.2011, 01:47

Wo genau ist denn dein Problem bei der Umsetzung? Hast du es schon probiert? Wenn ja, dann zeig mal deinen Quellcode.

Wenn du Objekte einem festgelegten Pfad folgen lassen willst, dann müssen das nicht umbedingt Felder von deiner Tilemap sein, an denen sich die Bewegung orientiert. Wie wäre es wenn du einfach einen Vector anlegst, in den du alle Wegpunkte (einfach die Koordinaten von den Punkten, an denen die Bewegung entlang verläuft) speicherst. Dann kannst du deine Objekte einfach von Punkt zu Punkt laufen lassen: Die Differenz aus dem nächsten Punkt im Vector und der momentanen Position ergibt den Richtungsvektor und mit dem kannst du dein Objekt bewegen.

Gruß
SaRu_

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

3

25.06.2011, 01:51

Die Überlegung stimmt schon, würde ich sagen. Du hast eine Map:
0 9 1 2 0
0 0 0 1 0
0 0 2 2 0
0 0 1 1 8

0 = normales Feld
9 = Start
1 = Pfad geradeaus
2 = Kurve
8 = Ende

Du suchst in der Map nach dem Feld '9' und setzt deinen Spieler hier hin. Jetzt bewegst du ihn in jedem Zug so weiter, dass er den '1' in eine Richtung folgt. Eine '2' könnte eine Drehung um +/- 90° sybolisieren - wenn man nur '1' verwenden würde, würde das zu Missverständnissen führen:
9 1 1
8 1 1
Kommt der Spieler am Ende eines Pfades an ('8'), so kannst du ihn wieder entfernen.

Die 2. Möglichkeit wäre, dass du bestimmten Tiles Richtungsvektoren zuordnest, die dein Spieler annimmt, wenn er die entsprechenden Tiles berührt.

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

4

25.06.2011, 03:00

Danke für die Antworten^^ Stimmt, Rotationspunkte brauch ich wirklich, damit es auch "realistischer" ist, aber das ist erst einmal Zukunftsmusik für mich.

Angenommen, ich habe jetzt eine Map wie diese:

0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 0
0 0 0 1 0 0 0 1 1
0 0 0 1 0 0 0 0 0
1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0

Dann muss ich ja immer wieder für jedes Level abfragen, wie weit das Sprite in X-Richtung fahren soll, dann wie weit in Y-Richtung dann wieder in X-Richtung und so weiter.

Was wäre denn besser für so ein "Problem" geeignet? Weil ich hatte mir das irgendwie einfacher vorgestellt^^ Gibt es nicht eine Möglichkeit, etwas zu programmieren, wo eine Map eingelesen wird ( zB. die oben gezeigte ) und sich das Sprite dann daran orientiert? Also ohne das ständige Abfragen von Koordinaten oder erstellen von Vektoren und so weiter. Oder ist das wirklich ein MUSS?
Dann wäre es einfacher, für jedes Level eine eigene Karte zu erstellen und der Code würde nicht ("unnötig"?^^) lang werden.

edit: Ich stell mir das so wie beim A* Pathfinding Algorithmus, bei dem jedes Tile überprüft wird, wie weit es noch vom ende entfernt ist und so weiter. Bei mir soll es nur so sein, dass überprüft wird, ob das Sprite auf einer 1 lang fährt.
Und hier weiß ich nicht, wie ich beides verbinden kann^^
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

5

25.06.2011, 10:48

Naja, du kannst natürlich zu Beginn des Spiels, wenn du die Map lädst, schon die Tilemap einmal durchgehen, die entsprechenden Tiles erkennen und deren Koordinaten in einen STL Vector speichern (so wie ich das oben bereits geschrieben habe). Dann kann jedes Objekt das dem Pfad folgen soll sich einfach immer zum nächsten Punkt bewegen. Du solltest halt nur sicherstellen, dass die Reihenfolge unmissverständlich ist, aber bei deinem Beispiel ist sie das ja.

Gruß
SaRu_

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

25.06.2011, 11:14

Kannst du nicht einfach immer die 8 Nachbarn des Feldes auf dem du grad stehst anschaun und zu dem weitergehen das 1 ist und von dem du nicht herkommst? Das sollte doch eigentlich trivial sein!?

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

7

25.06.2011, 13:23

@dot: so in etwa dachte ich mir das auch, nur das ich nicht acht sondern vier Felder überprüfen lasse( Oben unten rechts links ). Aber wenn ich das mache, dann weiß ich nicht, wie ich das Sprite danach bewegen soll.

@SaRu: Was ist denn so ein STL Vector?^^ Habe bisher wenn überhaupt die 2D Vector der SFML benutzt und der kann ja nur zwei Werte speichern.
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

25.06.2011, 13:54

http://www.cplusplus.com/reference/stl/vector/vector/
Eventuell solltest du dich mit den C++ Grundlagen sowie der STL nochmal gründlich beschäftigen?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

9

25.06.2011, 14:28

@dot: so in etwa dachte ich mir das auch, nur das ich nicht acht sondern vier Felder überprüfen lasse( Oben unten rechts links ). Aber wenn ich das mache, dann weiß ich nicht, wie ich das Sprite danach bewegen soll.

Ist doch ganz einfach eigentlich:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if(tilemap[player.x + 1][player.y] == 1)
   player.x += 1;
else if(tilemap[player.x - 1][player.y] == 1)
   player.x -= 1;
else if(tilemap[player.x][player.y + 1] == 1)
   player.y += 1;
else if(tilemap[player.x][player.y - 1] == 1)
   player.y -= 1;

Werbeanzeige

Ähnliche Themen