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

11

05.04.2012, 22:06

Zitat

Dazu gehst du in jedem Frame ein Stückchen weiter auf den aktuellsten, sprich obersten, Knotenpunkt zu.


Ok, aber wie hol ich mir den obersten Knotenpunkt(ohne for-schleife mit dazugehörigem Iterator) denn wenn ich versuche quasi "direkt" darauf zuzugreifen:

C-/C++-Quelltext

1
ClosedList.end()->x


Bekomme ich immer eine Error dazugeliefert:

list iterator not dereferencable



MfG Dastan

Pathfinding is a bitch!

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

12

05.04.2012, 22:22

Mit dem Index Operator (closedList[0]) oder wenn Stack dann halt mit peek bzw. wenn der Knotenpunkt erreicht ist pop.

http://de.wikipedia.org/wiki/Stapelspeic…Implementierung
http://www.cplusplus.com/reference/stl/stack/

"peek" ist das holen des ersten Elements (wie pop) nur das es nicht gelöscht wird.
Anderer Name dafür wäre bspw. "top" was eventuell eindeutiger ist. Aber wie gesagt, mit dem Index Operator geht das auch wunderbar.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

13

05.04.2012, 22:26

end() gibt dir den Iterator, der hinter das letzte Element zeigt. Benutze stattdessen ClosedList.back().x. back() gibt dir eine Referenz (keinen Iterator) auf das letzte Element zurück. Prüfe vorher mit empty() ob überhaupt noch Elemente in der Liste sind.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

05.04.2012, 22:30

Braucht er ja nicht so umständlich machen, wenn er einen Stack benutzt.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

15

05.04.2012, 22:34

Naja, ob es jetzt top() oder back() heißt ist auch egal. Auf empty() muss man auch immer achten.

16

06.04.2012, 00:50

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void CGame::followPath()
{
     ElapsedTime = g_pTimer->Get_Elapsed();

if (Walkstat == 0)
    {
if(ClosedList.front().x == static_cast<int>(Enemy.pSprite->GetPosition().x/32) +1)
{
    Walkstat = 1;

}
else if(ClosedList.front().x == static_cast<int>(Enemy.pSprite->GetPosition().x/32) -1)
{

    Walkstat = 2;

}
else if(ClosedList.front().y == static_cast<int>(Enemy.pSprite->GetPosition().y/32) +1)
{

    Walkstat = 3;

}
else if(ClosedList.front().y == static_cast<int>(Enemy.pSprite->GetPosition().y/32) -1)
{
    
    Walkstat = 4;
 }

}else if(Walkstat == 1)
    {
        Enemy.pSprite->Move(50*ElapsedTime,0);
    }
    else if(Walkstat == 2)
    {
        Enemy.pSprite->Move(-50*ElapsedTime,0);
    }
    else if(Walkstat == 3)
    {
        Enemy.pSprite->Move(0,50*ElapsedTime);
    }
    else if(Walkstat == 4)
    {
        Enemy.pSprite->Move(0,-50*ElapsedTime);
    }

if(ClosedList.front().x == static_cast<int>(Enemy.pSprite->GetPosition().x/32) 
    && ClosedList.front().y == static_cast<int>(Enemy.pSprite->GetPosition().y/32))
        {
            ClosedList.pop_front();
            Walkstst = 0;
        }

}


Ok , soweit klappt es. *atmet erleichtert und gleichzeitig erschöpft aus*
Das Prüfen ob die Liste leer ist usw. ist noch nicht dabei, wird aber gerade hinzugefügt.

@Architekt:
Danke für die Links, ich hab den Stack nicht ganz verstanden.
Ehrlich gesagt kapier ich erst jetzt, dass damit etwas anderes gemeint ist als der "interne" Stack. (Thema: Speicherverwaltung) :wacko:
Ich versteh noch nicht so ganz wie ich ihn in diesem Fall verwenden und implementieren sollte aber ich werde versuchen mich etwas in dieses Thema zu vertiefen.

MfG Dastan

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

06.04.2012, 11:20

Ein Stack ist nur eine andere Datenstruktur. Stack ist der englische Begriff für Stapel. Du kannst dir das ganze wie einen Kartenstapel vorstellen. Du kannst eine Karte oben auf den Stapel legen oder du kannst die oberste Karte vom Stapel runter nehmen. Es ist nicht wie bei einer Liste, bei der du normalerweise Zugriff auf jedes Element hast. Eine weitere wichtige Datenstruktur wäre außerdem noch die Queue oder auch Warteschlange. Guck vielleicht einfach mal nach einem Tutorial über die STL Container. Wenn du sie kennst kannst du dir damit oft viel Arbeit ersparen und schwer zu benutzen oder zu verstehen sind sie auch nicht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige