Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Gra Snake - Dziwnie ukazujący się błąd

Ostatnio zmodyfikowano 2013-02-25 20:34
Autor Wiadomość
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
C/C++
#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 // SNAKE_H_INCLUDED
main.cpp (też definicje z pliku snake.h)
C/C++
#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;
           
        }
        /*
                mySnake.UpdatePart();
                */
        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 )
{
    //Initialize template part
    SnakePart tmp( img );
   
    //Head part
    tmp.mType = SPT_Head;
    tmp.mDir = SPD_Up;
    AddPart( tmp );
    SetHeadPosition( 5 * 40, 5 * 40 );
   
    //Middle part
    tmp.mType = SPT_Middle;
    AddPart( tmp );
   
    //Tail part
    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 :)
P-76914
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:
C/C++
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).
P-76915
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ę :)
P-76990
pekfos
» 2013-02-25 20:34:39
C/C++
mParts.back();
mParts[ mParts.size() - 1 ];
//itd..
P-76992
« 1 »
  Strona 1 z 1