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

[SFML 2.0] Nie wyświetla obrazka, biały ekran

Ostatnio zmodyfikowano 2012-11-13 22:09
Autor Wiadomość
bingo009
Temat założony przez niniejszego użytkownika
[SFML 2.0] Nie wyświetla obrazka, biały ekran
» 2012-11-12 20:26:43
Witam was serdecznie, otóż piszę sobie tę grę, aby nauczyć się programować obiektowo, więc staram się aby ta gra była napisana obiektowo. Mianowicie, mam klasę Game, która dziedziczy od klasy RenderWindow. Teraz za pomocą klasy Object, która dziedziczy klasę Sprite próbuję narysować coś na ekranie. Tutaj metoda klasy Object:
C/C++
void Object::Draw()
{
    Game::returnInstance().draw( * this );
}

Tutaj kod metody returnInstance()
C/C++
Game & Game::returnInstance()
{
    static Game instance;
    return instance;
}
Prototyp metody:
C/C++
static Game & returnInstance();

Z obiektu klasy Game próbuję wywołać to w ten sposób:
C/C++
void Game::Test()
{
    //tworzenie obiektu test klasy Object
    test.Draw();
}
pomijam ładowanie zasobów, gdyż to wszystko jest w klasie Object i to nie to, bo sprawdzałem i ładuje się prawidłowo wszystko. Ale mimo wszystko w odpowiedzi dostaje pusty ekran, lecz komputer zaczyna głośniej chodzić, co jest znakiem, że coś się dzieje. Dopiero się uczę tych rzeczy związanych z klasami, kodu w 100% sam nie piszę, tylko sprawdzam jak to jest zrobione w innych takich grach i robię podobnie(nie tak samo) u siebie, więc pewnie popełniłem gdzieś błąd.
P-69064
DejaVu
» 2012-11-12 20:40:40
W jakimś miejscu tworzysz nieświadomie kopię obiektu przechowującego teksturę, która jest niszczona i dlatego masz biały obraz.

http://cpp0x.pl/forum/temat/?id=8398
P-69066
bingo009
Temat założony przez niniejszego użytkownika
» 2012-11-12 20:57:50
Dodam, że jak z klasy Game bezpośrednio próbuję narysować obiekt klasy Object, to wszystko jest wporządku. Dodam, że wcześniej miałem tak, że w klasie Object był zawarty Sprite, a sama klasa dziedziczyła po klasie RenderWindow i problem był ten sam. Rysowanie wyglądało tak samo, tylko, że zamiast this podstawiałem normalny Sprite. Jestem prawie pewny, że to coś z rysowaniem się psuje.

Zrobiłem mały test. Utworzyłem testową klasę:
C/C++
class Test
    : public sf::Sprite
{
private:
    sf::Texture tex;
public:
    Test( const char * tex2 );
    void drawTest();
};

tutaj jej konstruktor i metoda:
C/C++
Test::Test( const char * tex2 )
{
    tex.loadFromFile( tex2 );
    setTexture( tex );
}

void Test::drawTest()
{
    Game::returnInstance().draw( * this );
}

ta klasa pokazuje w dużym uproszczeniu co jest w tej większej, w ten sposób właśnie robię. I efekt: to samo. Obrazek odrazu mówię, że napewno istnieje. Coś mi się zdaję, że chyba jest coś nie tak z tą instancją.
P-69071
DejaVu
» 2012-11-12 21:10:43
Założę się, że trzymasz obiekty w kontenerze std::vector :)
P-69075
bingo009
Temat założony przez niniejszego użytkownika
» 2012-11-12 21:13:55
Nie bardzo, tworzę obiekt klasy Game, a potem on zajmuje się grą, w nim jest tworzony obiekt klasy Test i próba wyświetlenia go.
P-69076
DejaVu
» 2012-11-12 21:21:40
C/C++
Game::draw(...)
jak wygląda pełna deklaracja tej metody?
P-69078
bingo009
Temat założony przez niniejszego użytkownika
» 2012-11-12 21:34:02
Ta metoda jest dziedziczona z klasy sf::RenderWindow.
P-69081
DejaVu
» 2012-11-12 21:40:53
Lepiej pokaż cały kod od momentu utworzenia obiektu 'Test' do momentu jego wyświetlenia. Gdzieś na bank musi być tworzona kopia obiektu Test jeżeli twierdzisz, że teksturę udało się poprawnie wczytać.
P-69083
« 1 » 2
  Strona 1 z 2 Następna strona