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

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

1

28.01.2014, 19:03

SnakeGame Liste-mit Position fehlerhaft C++

Hallo liebes Forum,
bin gerade an einem kritischem Punkt meines Snake Games angekommen und zwar bei der Kollision mit einer Frucht soll die Schlange um eine Länge (Rechteck) zunehmen.
Dazu hab ich eine Liste erstellt die nach jeder Bewegung je ein neues Rect in die Liste aufnimmt, gibt es keine Kollision mit einer Frucht wirdauch das letzte Element in der Liste
herausgenommen und somit wächst die schlange nicht sondern sie bewegt sich, kommt es zur Kollision dann schrumpft die schlange nicht, somit sind dann 2 Rects in der Liste die dann in einer finalen Funktion alle per schleife gezeichnet werden.

Problem ist aber, dass mein HilfsRect welches einfach das Ende der schlange überzeichnet, mit der Hintergrundfarbe, bei einer Kollision bleibt der Iterator der Liste anscheinend sonst wie hängen und die Position des Hilfsrect bleibt konstant an einer Stelle und die Schlange wächst immer weiter.


Hier meine Funktionen:







Snake.h

C-/C++-Quelltext

1
2
protected:
        direction snakedirection;   SDL_Rect SnakeRect; SDL_Rect *NewRect;  SDL_Rect HelpRect;  SDL_Rect HelpRect2; bool movepause; bool collision; int speed; //zwischen 0 und 500;    int XPos,YPos;  int sr,sg,sb;   bool shrink;    GameField &GF;  Fruit &FR;  SDL_Event snake_event;





Snake.cpp

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
void Snake::ShrinkSnake(){
SnakeIterator=SnakeList.begin();HelpRect.x=((SnakeIterator->x)*GetWholeOneFieldSize())+GetDistance();HelpRect.y=((SnakeIterator->y)*GetWholeOneFieldSize())+GetDistance();
SnakeList.pop_back();

}


void Snake::ApplyGrowedSnake(){
for(SnakeIterator=SnakeList.begin();SnakeIterator!=SnakeList.end();SnakeIterator++)     {   SDL_FillRect(g_screen.GetScreen(),&SnakeRect,SDL_MapRGB(g_screen.GetScreen()->format,sr,sg,sb));        }}


void Snake::ApplyRect(){if (XPos>=GetLength())  XPos=0;if(XPos<0)   XPos=GetLength()-1;
if(YPos>=GetLength())   YPos=0;if(YPos<0)   YPos=GetLength()-1;
SetRectPos(SnakeRect,GetRectsX(),GetRectsY());


if(startvar){if(!collision) {   ShrinkSnake();      }
NormalGrowSnake();  
collision=false;    

}

void Snake::ShowSnake(){
ApplyGrowedSnake();FillRect(HelpRect,g_screen.GetScreen(),  200,  20, 50);SDL_Flip(g_screen.GetScreen());}






main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
GameField TestField;Fruit TestFruit(TestField);
TestField.CreateField();Snake TestSnake(TestField,TestFruit,100,200,50);while(run==1){

TestFruit.GenRandPos();TestFruit.ApplyFruit();

TestSnake.CheckInput();
TestSnake.MoveSnakePos();TestSnake.CheckCollision();TestSnake.ApplyRect();TestSnake.ShowSnake();




(Link)

[/url][/img]







Bitte wirklich nur wegen diesem Funktionsfehler den Code auseinandernehmen, ich weiß es ist vieles besser zu lösen nur ist es mein allererstes Spiel was annähernd "objektorientiert" programmiert ist.
Anscheinend liegt es wirklich an dem Listen Iterator.


PS:Es tut mir leid wegen der Formatierung des Codes kp ich komm immernochnicht dahinter warum er einfach meine Leerzeichen und Sprünge einfach so weglässt :/

und auch mit den Bildern also ich kann sie beim bearbeiten sehen, falls ihr sie nicht sehen könnt bitte nochmal hierdrauf antworten.




Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

28.01.2014, 19:37

Wenn man Probleme mit einer "Editorfunktion" hat, die automatisch Code generiert, sollte man versuchen den Code selbst zu schreiben. Dafür musst du nur beim Editieren eines Posts vom "Editor" Tab auf den "Quellcode" Tab wechseln. Damit funktioniert es sehr gut.
Wäre es nicht möglich eine kleine Warnung zu schreiben wenn man den Quellcodebutton im Editortab benutzt? Langsam geht mir das wirklich auf die Nerven.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?