Mozarek Temat założony przez niniejszego użytkownika |
[SFML] Crash okna przy użyciu metody draw() w programowaniu zorientowanym obiektowo » 2013-07-31 16:10:56 Witam. Zaczynam zabawę z SFML i postanowiłem zrobić prostą grę kółko i krzyżyk. Stwierdziłem, że będę programował zorientowanie obiektowo. I tu już po wgraniu tła i spróbowaniu kompilacji włącza mi się okno (a dokładniej sama ramka) na ułamek sekundy i znika. W logu kompilacji nic nie ma a debugger wskazuje na linijkę w pliku main.cpp wywołującą metodę Rysuj() przez wskaźnik, która jest odpowiedzialna za rysowanie sprite'ów. Fragmenty kodu: main.cpp #include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include "game.h"
int main() { sf::RenderWindow oknoApki; oknoApki.create( sf::VideoMode( 600, 600, 32 ), "Gra SFML" ); oknoApki.setFramerateLimit( 50 ); Cboard * targetBoard; while( oknoApki.isOpen() ) { sf::Event zdarzenie; while( oknoApki.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) oknoApki.close(); if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape ) oknoApki.close(); } oknoApki.clear( sf::Color::White ); targetBoard->Rysuj(); oknoApki.display(); } return 0; }
fragment pliku nagłówkowego class Cboard : protected Cgame { protected: enum FIELD { FLD_EMPTY, FLD_CROSS, FLD_CIRCLE }; sf::Sprite spr_Background; public: Cboard(); void Rysuj(); void update(); };
i implementacja metod w game.cpp: #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include "game.h"
sf::RenderWindow oknoApki;
Cboard::Cboard() { sf::Texture tlo; tlo.loadFromFile( "D:\\programy\\CodeBlocks\\teksturki\\tlo.png" ); spr_Background.setTexture( tlo ); spr_Background.setPosition( 0, 0 ); }
void Cboard::Rysuj() { oknoApki.draw( spr_Background ); }
|
|
DarkYoung |
» 2013-07-31 16:57:46 Czy klasa Cboard zawiera jakiś obiekt "oknoApki", że pozwoliłeś sobie wywołać "oknoApki.draw( spr_Background );"? Czy liczyłeś po prostu, że "oknoApki" w magiczny sposób z funkcji main znajdzie się w obiekcie targetBoard ;)? |
|
Mozarek Temat założony przez niniejszego użytkownika |
» 2013-07-31 17:39:31 Nie. Aczkolwiek w pliku nagłówkowym na początku zawarłem linijkę extern sf::RenderWindow oknoApki , a następnie w game.cpp i w main.cpp dodałem po linijce sf::RenderWindow oknoApki, problem pozostaje nierozwiązany :/ |
|
Monika90 |
» 2013-07-31 17:43:13 oknoApki w pliku game.cpp, to jest inny obiekt niż oknoApki, które tworzysz wewnątrz main. Poza tym, nie tworzysz nigdzie obiektu klasy Cboard, Cboard * targetBoard; to tylko niezainicjalizowany wskaźnik. |
|
Mozarek Temat założony przez niniejszego użytkownika |
» 2013-07-31 18:02:26 Ok. Wielkie dzięki. Naprawiłem błąd ze wskaźnikiem (wystarczyło dopisać = new Cboard ) już mi się program nie crashuje, lecz nadal nie wiem jak rozwiązać problem z obiektem oknoApki aby był doń dostęp w game.cpp. |
|
Monika90 |
» 2013-07-31 18:25:28 Rozwiązań jest bez liku, np. przekazanie okna do funkcji rysuj przez referencję void Cboard::Rysuj( sf::RenderWindow & okno );
targetBoard->Rysuj( oknoApki );
|
|
Mozarek Temat założony przez niniejszego użytkownika |
» 2013-07-31 18:57:06 Kolejny raz dzięki za odp ale wraz z rozwiązaniem jednego problemu rodzi się kolejny - a mianowicie nie wczytuje się teksturka (mam biały ekran) i z góry mówię, że sprawdziłem ścieżkę 3 razy i obecność pliku w danym folderze. O ile dobrze pamiętam konstruktor wywołuje się sam przy tworzeniu obiektu i nie byłem pewny co do wskaźników ale już to sprawdziłem tworząc obiekt - bez zmian. |
|
Monika90 |
» 2013-07-31 19:03:14 Przypuszczam, że problem jest tu: Cboard::Cboard() { sf::Texture tlo; tlo.loadFromFile( "D:\\programy\\CodeBlocks\\teksturki\\tlo.png" ); spr_Background.setTexture( tlo ); spr_Background.setPosition( 0, 0 ); }
tlo to automatyczna zmienna lokalna, więc przestaje istnieć, gdy następuje powrót z konstruktora. |
|
« 1 » 2 |