Gra Snake - Dziwnie ukazujący się błąd
Ostatnio zmodyfikowano 2013-02-25 20:34
RazzorFlame Temat założony przez niniejszego użytkownika |
Gra Snake - Dziwnie ukazujący się błąd » 2013-02-24 20:50:35 To tak. Napisałem sobie gre snake, to znaczy na razie ma tylko przemieszczać się w taki sposób jak snake :P. Nie obyło się oczywiście bez problemów. Otóż tak: Kiedy uruchamiam program z poziomu Code::Blocks, wszystko pozornie jest ok, ale nie wczytuje obrazka, i nie zostaje wyświetlony Wężyk. Kiedy jednak uruchomie z poziomu explorera to dostaje taki komunikat: This application has requested the Runtime to terminate it in an unusual way. (tutaj prosze sie skontaktować z supportem aplikacji Oto kod Snake'ya :P snake.h #ifndef SNAKE_H_INCLUDED #define SNAKE_H_INCLUDED
#include <SFML/Graphics.hpp> #include <iostream> #include <fstream>
enum SnakePartType { SPT_Head, SPT_Middle, SPT_Tail }; enum { SPD_Right = 0, SPD_Down = 90, SPD_Left = 180, SPD_Up = 270 }; enum { I_Snack, I_Bomb };
class SnakePart { public: sf::Sprite mSpr; SnakePartType mType; int mDir; int x, y; SnakePart( sf::Image & ); }; class Snake { public: std::vector < SnakePart > mParts; void AddPart( SnakePart ); void UpdatePart(); void DeletePart(); void SetHeadPosition( int x, int y ); Snake( sf::Image & img ); sf::Clock mTimer; }; class Item { public: int mType; Item(); };
#endif
main.cpp (też definicje z pliku snake.h) #include "snake.h"
using namespace std;
int main() { sf::RenderWindow app( sf::VideoMode( 800, 600, 32 ), "SnakeBandit by RazzorFlame" ); sf::Event ev; sf::Image imgSnake; imgSnake.LoadFromFile( "Grafy/snake.bmp" ); imgSnake.SetSmooth( false ); imgSnake.CreateMaskFromColor( sf::Color( 255, 0, 255 ) ); Snake mySnake( imgSnake ); SnakePart tmp( imgSnake ); tmp.mType = SPT_Middle; while( app.IsOpened() ) { while( app.GetEvent( ev ) ) { if( ev.Type == sf::Event::Closed ) app.Close(); } const sf::Input & in = app.GetInput(); if( mySnake.mParts.size() > 0 ) { if( in.IsKeyDown( sf::Key::Up ) ) mySnake.mParts[ 0 ].mDir = SPD_Up; else if( in.IsKeyDown( sf::Key::Down ) ) mySnake.mParts[ 0 ].mDir = SPD_Down; else if( in.IsKeyDown( sf::Key::Left ) ) mySnake.mParts[ 0 ].mDir = SPD_Left; else if( in.IsKeyDown( sf::Key::Right ) ) mySnake.mParts[ 0 ].mDir = SPD_Right; } for( int i = 0; i > mySnake.mParts.size() - 1; i++ ) { app.Draw( mySnake.mParts[ i ].mSpr ); } app.Display(); } return 0; }
SnakePart::SnakePart( sf::Image & img ) { mType = SPT_Head; mDir = SPD_Up; mSpr.SetImage( img ); } Snake::Snake( sf::Image & img ) { SnakePart tmp( img ); tmp.mType = SPT_Head; tmp.mDir = SPD_Up; AddPart( tmp ); SetHeadPosition( 5 * 40, 5 * 40 ); tmp.mType = SPT_Middle; AddPart( tmp ); tmp.mType = SPT_Tail; AddPart( tmp ); UpdatePart(); } void Snake::AddPart( SnakePart tmp ) { for( int i = 0; i > mParts.size(); i++ ) { if( mParts[ i ].mType == SPT_Head ) mParts[ i ].mSpr.SetSubRect( sf::IntRect( 0, 0, 40, 40 ) ); else if( mParts[ i ].mType == SPT_Middle ) mParts[ i ].mSpr.SetSubRect( sf::IntRect( 40, 0, 40, 40 ) ); else if( mParts[ i ].mType == SPT_Tail ) mParts[ i ].mSpr.SetSubRect( sf::IntRect( 80, 0, 40, 40 ) ); } if( tmp.mType != SPT_Head && mParts.size() > 0 ) { tmp.mDir =( mParts.end() + 1 )->mDir; if(( mParts.end() + 1 )->mDir == SPD_Left ) { tmp.x =( mParts.end() + 1 )->x + 40; tmp.y =( mParts.end() + 1 )->y; mParts.insert( mParts.end() + 1, tmp ); } else if(( mParts.end() + 1 )->mDir == SPD_Right ) { tmp.x =( mParts.end() + 1 )->x - 40; tmp.y =( mParts.end() + 1 )->y; mParts.insert( mParts.end() + 1, tmp ); } else if(( mParts.end() + 1 )->mDir == SPD_Down ) { tmp.x =( mParts.end() + 1 )->x; tmp.y =( mParts.end() + 1 )->y - 40; mParts.insert( mParts.end() + 1, tmp ); } else if(( mParts.end() + 1 )->mDir == SPD_Up ) { tmp.x =( mParts.end() + 1 )->x; tmp.y =( mParts.end() + 1 )->y + 40; mParts.insert( mParts.end() + 1, tmp ); } } else mParts.push_back( tmp ); } void Snake::SetHeadPosition( int x, int y ) { if( mParts.size() > 0 ) { mParts[ 0 ].x = x; mParts[ 0 ].y = y; } } void Snake::UpdatePart() { if( mTimer.GetElapsedTime() > 0.5 && mParts.size() > 0 ) { switch( mParts[ 0 ].mDir ) { case SPD_Left: mParts[ 0 ].x -= 40; break; case SPD_Right: mParts[ 0 ].x += 40; break; case SPD_Up: mParts[ 0 ].y -= 40; break; case SPD_Down: mParts[ 0 ].y += 40; break; } if( mParts.size() > 0 ) { mParts[ 0 ].mSpr.SetRotation( mParts[ 0 ].mDir ); mParts[ 0 ].mSpr.SetPosition( mParts[ 0 ].x, mParts[ 0 ].y ); for( int i = mParts.size() - 1; i > 0; i-- ) { mParts[ i ].x = mParts[ i + 1 ].x; mParts[ i ].y = mParts[ i + 1 ].y; mParts[ i ].mDir = mParts[ i + 1 ].mDir; mParts[ i ].mSpr.SetRotation( mParts[ i ].mDir ); mParts[ i ].mSpr.SetPosition( mParts[ i ].x, mParts[ i ].y ); } } } } void Snake::DeletePart() { if( mParts.size() > 3 ) { mParts.erase( mParts.end() + 1 ); ( mParts.end() )->x =( mParts.end() + 1 )->x; ( mParts.end() )->y =( mParts.end() + 1 )->y; } }
Z góry wielkie dzięki :) |
|
pekfos |
» 2013-02-24 20:54:13 Taki tekst wywołuje funkcja abort(), wywoływana w std::terminate(), itd.. Masz niezłapany wyjątek. Jeden rzut oka i widać to: mParts.erase( mParts.end() + 1 ); ( mParts.end() )->x =( mParts.end() + 1 )->x; ( mParts.end() )->y =( mParts.end() + 1 )->y;
end() nie zwraca iteratora na ostatni element (a nawet jeśli, to dodawanie do niego 1 było by bez sensu). |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-02-25 20:30:16 Hmm dzięki, jak proponujesz zwracać się do tego elementu. Może mParts.at(mParts.end()+1) czy coś? Jakoś nie umiem sobie tego wyobrazić Edit: Właśnie sobie uświadomiłem że powino chyba być std::vector::back zamiast end. Jeśli źle to mnie poprawcię :) |
|
pekfos |
» 2013-02-25 20:34:39 mParts.back(); mParts[ mParts.size() - 1 ];
|
|
« 1 » |