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

[SFML] Crash okna przy użyciu metody draw() w programowaniu zorientowanym obiektowo

Ostatnio zmodyfikowano 2013-07-31 19:22
Autor Wiadomość
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
C/C++
#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
C/C++
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:
C/C++
#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 );
}
P-89114
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 ;)?
P-89115
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 :/
P-89119
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.
P-89120
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.
P-89122
Monika90
» 2013-07-31 18:25:28
Rozwiązań jest bez liku, np. przekazanie okna do funkcji rysuj przez referencję
C/C++
void Cboard::Rysuj( sf::RenderWindow & okno );

C/C++
targetBoard->Rysuj( oknoApki );
P-89124
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.
P-89130
Monika90
» 2013-07-31 19:03:14
Przypuszczam, że problem jest tu:
C/C++
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.
P-89131
« 1 » 2
  Strona 1 z 2 Następna strona