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" #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" #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" #include "gra.hpp"
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 ); }; };
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 |
|
m4tx |
» 2011-08-06 15:25:58 Debugger. |
|
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.. |
|
m4tx |
» 2011-08-06 16:04:49 Hmmm... Średniki po klamrach podaje się tylko i wyłącznie w przypadku struktur i klas. |
|
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.. |
|
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 . |
|
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. |
|
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. |
|
« 1 » 2 |