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

[SFML, C++] Segmentation fault podczas odbierania zdarzeń okna

Ostatnio zmodyfikowano 2011-08-06 22:30
Autor Wiadomość
imralav
Temat założony przez niniejszego użytkownika
[SFML, C++] Segmentation fault podczas odbierania zdarzeń okna
» 2011-08-06 15:11:43
Cześć!
Mam problem. Zacząłem pisać kółko i krzyżyk, tym razem w sfml, żeby trochę ładniej to wyglądało.
Oto kod:

Plik "main.cpp"
C/C++
#include "gra.hpp"

int main()
{
    RenderWindow g_okno( VideoMode( 800, 600, 32 ), "3Ticacoe", Style::None );
    g_okno.SetFramerateLimit( 60 );
    Event zdarzenia;
    const Input & input = g_okno.GetInput();
   
    etap stan_gry = pocz;
   
    CPlansza plansza;
   
    while( g_okno.IsOpened() )
    {
       
        while( g_okno.GetEvent( zdarzenia ) )
        {
            if( zdarzenia.Type == Event::KeyPressed && zdarzenia.Key.Code == Key::Escape )
            {
                g_okno.Close();
            }
            else if( stan_gry == pocz && zdarzenia.Type == Event::MouseButtonPressed &&
            zdarzenia.MouseButton.Button == Mouse::Left )
            {
                stan_gry = rozw;
            };
        };
        g_okno.Clear( Color( 0, 0, 0 ) );
       
        g_okno.Display();
    };
    return 0;
}

Plik "gra.hpp"
C/C++
#ifndef gra_hpp
#define gra_hpp
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <cmath>
#include <cstdlib>
using namespace sf;
enum gracz { g_kolko, g_krzyzyk };
enum pole { p_puste, p_kolko, p_krzyzyk };
enum etap { pocz, rozw, wyg_o, wyg_x, remis };

class CPole
{
private:
    Image ipuste, ikolko, ikrzyzyk;
    Sprite spuste, skolko, skrzyzyk;
    Vector2f pozycja;
    pole POLE;
public:
    CPole( float x, float y );
    void rysuj_pole( RenderWindow * okno );
    bool czy_zaznaczone( RenderWindow * okno, etap stan );
};

class CPlansza
{
private:
    Image itlo, istatus_o, istatus_x, irozp;
    Sprite stlo, status_o, status_x, srozp, srozp_kolko, srozp_krzyzyk;
    CPole * pole[][ 3 ];
public:
    gracz aktywny_gracz;
    CPlansza();
    ~CPlansza();
    void rysuj_plansze( RenderWindow * okno );
    void rozpoczecie( RenderWindow * okno, etap stan );
};
#endif

Plik "gra.cpp"
C/C++
#include "gra.hpp"
//funkcje klasy CPlansza
CPlansza::CPlansza()
{
    for( int i = 0; i < 3; i++ )
    {
        for( int j = 0; j < 3; j++ )
        {
            pole[ i ][ j ] = new CPole( 250 + i * 150, 100 + j * 150 );
        };
    };
    srand( time( NULL ) );
    aktywny_gracz = rand() % 2 == 0 ? g_kolko
        : g_krzyzyk;
   
    itlo.LoadFromFile( "tlo_3T.png" );
    stlo.SetImage( itlo );
    stlo.SetPosition( 0, 0 );
   
    istatus_o.LoadFromFile( "p_kolko.png" );
    status_o.SetImage( istatus_o );
    status_o.SetPosition( 50, 250 );
   
    istatus_x.LoadFromFile( "p_krzyzyk.png" );
    status_x.SetImage( istatus_x );
    status_x.SetPosition( 50, 250 );
   
    irozp.LoadFromFile( "rozp.png" );
    srozp.SetCenter( 300, 200 );
    srozp.SetPosition( 400, 300 );
   
    srozp_kolko.SetImage( istatus_o );
    srozp_kolko.SetCenter( 50, 50 );
    srozp_kolko.Scale( 2, 2 );
    srozp_kolko.SetPosition( 400, 300 );
   
    srozp_krzyzyk.SetImage( istatus_x );
    srozp_krzyzyk.SetCenter( 50, 50 );
    srozp_krzyzyk.Scale( 2, 2 );
    srozp_krzyzyk.SetPosition( 400, 300 );
   
   
};
CPlansza::~CPlansza()
{
    for( int i = 0; i < 3; i++ )
    {
        delete[] pole[ i ];
    };
};
void CPlansza::rysuj_plansze( RenderWindow * okno )
{
    okno->Draw( stlo );
    for( int i = 0; i < 3; i++ )
    {
        for( int j = 0; j < 3; j++ )
        {
            this->pole[ i ][ j ]->rysuj_pole( okno );
        }
    }
}
void CPlansza::rozpoczecie( RenderWindow * okno, etap stan )
{
    okno->Draw( srozp );
    if( stan == pocz && aktywny_gracz == g_kolko )
    {
        okno->Draw( srozp_kolko );
    }
    else if( stan == pocz && aktywny_gracz == g_krzyzyk )
    {
        okno->Draw( srozp_krzyzyk );
    };
};
//funkcje klasy CPole
CPole::CPole( float x, float y )
{
    pozycja.x = x;
    pozycja.y = y;
   
    ipuste.LoadFromFile( "p_puste.png" );
    spuste.SetImage( ipuste );
    spuste.SetPosition( pozycja );
   
    ikolko.LoadFromFile( "p_kolko.png" );
    skolko.SetImage( ikolko );
    skolko.SetPosition( pozycja );
   
    ikrzyzyk.LoadFromFile( "p_krzyzyk.png" );
    skrzyzyk.SetImage( ikrzyzyk );
    skrzyzyk.SetPosition( pozycja );
   
    POLE = p_puste;
};
void CPole::rysuj_pole( RenderWindow * okno )
{
    if( POLE == p_kolko )
    {
        okno->Draw( skolko );
    }
    else if( POLE == p_krzyzyk )
    {
        okno->Draw( skrzyzyk );
    }
    else
    {
        okno->Draw( spuste );
    };
};
bool CPole::czy_zaznaczone( RenderWindow * okno, etap stan )
{
    if( stan == rozw && okno->GetInput().GetMouseX() >= pozycja.x - 50 && okno->GetInput().GetMouseX() <= pozycja.x + 50 &&
    okno->GetInput().GetMouseY() >= pozycja.y - 50 && okno->GetInput().GetMouseY() <= pozycja.y - 50 )
    {
        return true;
    }
    else
    {
        return false;
    };
};

Od czasu do czasu gdy piszę kompiluję program by sprawdzić, czy są jakieś błędy. Było ok do momentu utworzenia obiektu 'plansza' klasy 'CPlansza' w pliku "main.cpp". Gdy go dodaje dostaję błąd windowsa, o tym, że aplikacja napotkała problem i zostanie zamknięta z zapytaniem, czy wysyłać błędy.

Totalnie nie mam pojęcia w czym może być błąd.
Jakiś pomysł?

Pozdrawiam,
imralav.

@edit:
Jeśli ktoś chce u siebie skompilować - oto paczka obrazków: http://www.speedyshare.com/files/29740982/3T_obrazki.rar
P-38242
m4tx
» 2011-08-06 15:25:58
Debugger.
P-38243
imralav
Temat założony przez niniejszego użytkownika
» 2011-08-06 15:37:37
Dostaje Segmentation Fault w 16 linijce pliku "main.cpp" czyli pętla "while" obsługująca zdarzenie. Zawsze to tak robiłem, nie widzę tu błędu..
P-38244
m4tx
» 2011-08-06 16:04:49
Hmmm... Średniki po klamrach podaje się tylko i wyłącznie w przypadku struktur i klas.
P-38248
imralav
Temat założony przez niniejszego użytkownika
» 2011-08-06 16:17:36
Z enumów pokasowałem średniki, program już nie crashuje, ale teraz dostaję coś takiego:

 zadanka\SFMLowe\3T\gra.hpp|23|error: multiple types in one declaration|
 zadanka\SFMLowe\3T\main.cpp||In function 'int main()':|
 zadanka\SFMLowe\3T\main.cpp|8|warning: unused variable 'input'|
||=== Build finished: 1 errors, 1 warnings ===|
Doczytałem, że to może chodzić o brakujący średnik, ale żadnego nie brakuje..

P-38250
m4tx
» 2011-08-06 16:20:08
A, kurde. W enumach też się daje. Chodziło mi o to, żebyś pokasował średniki z
while
 i
if
.
P-38251
imralav
Temat założony przez niniejszego użytkownika
» 2011-08-06 16:27:00
No właśnie poszukałem trochę w sieci i o tych enumach mi nie pasowało. Tak czy siak, po poprawieniu i tak debugger pokazuje to samo. Swoją drogą o ile mnie pamięć nie myli te średniki zawsze w ten sposób umieszczałem i nigdy nie było problemu.
P-38252
waxx
» 2011-08-06 16:32:42
Ale ty masz ustawiac breakpointa linijka po linijce i zobaczyc na czym sie wywali dokladnie. Tak sie debuguje.
P-38253
« 1 » 2
  Strona 1 z 2 Następna strona