mar3 Temat założony przez niniejszego użytkownika |
[SFML] Biały prostokąt zamiast obrazka » 2011-06-02 20:13:20 Tworzę grę Memory na PC na I gracza w SFML. Mam problem sprajt tworzony w klasie się nie wyświetla tylko biały prostokąt. To mój kod:
- plik main.cpp: #if _DEBUG #pragma comment(lib,"sfml-system-s-d.lib") #pragma comment(lib,"sfml-main-d.lib") #pragma comment(lib,"sfml-window-s-d.lib") #pragma comment(lib,"sfml-graphics-s-d.lib") #else #pragma comment(lib,"sfml-system-s.lib") #pragma comment(lib,"sfml-main.lib") #pragma comment(lib,"sfml-window-s.lib") #pragma comment(lib,"sfml-graphics-s.lib") #endif
#include <SFML/Graphics.hpp> #include "gra.h"
int main() { sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Gra Memory" ); sf::Image obrazek; obrazek.LoadFromFile( "gfx/1.png" ); sf::Sprite naszSprajt; naszSprajt.SetImage( obrazek ); naszSprajt.SetPosition( 400, 300 ); gra game; while( oknoAplikacji.IsOpened() ) { sf::Event zdarzenie; while( oknoAplikacji.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == sf::Event::Closed ) oknoAplikacji.Close(); if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape ) oknoAplikacji.Close(); if( zdarzenie.Type == sf::Event::MouseButtonPressed && zdarzenie.MouseButton.Button == sf::Mouse::Middle ) oknoAplikacji.Close(); } oknoAplikacji.Clear( sf::Color( 255, 0, 0 ) ); oknoAplikacji.Draw( naszSprajt ); game.rysuj( & oknoAplikacji ); oknoAplikacji.Display(); } return 0; }
- plik gra.h: #ifndef GRA_H #define GRA_H
#include <SFML/Graphics.hpp> #include <Windows.h> #include <vector> #include <sstream> #include "karta.h" #include "definicje.h"
using namespace sf;
class gra { std::vector < karta > karty; public: gra(); ~gra(); void rysuj( RenderWindow * ); };
#endif
-plik gra.cpp: #include "gra.h"
gra::gra() { srand( time( NULL ) ); int * balls = new int[ ILOSC_OBRAZOW ]; for( int i = 0; i < ILOSC_OBRAZOW; i++ ) { balls[ i ] = rand() % ILOSC_OBRAZOW + 1; for( int j = 0; j < i + 1; j++ ) { if( balls[ i ] == balls[ j ] && i != j ) { i--; break; } else if( j == i ) { std::stringstream ss; std::string tempStr; ss << balls[ i ]; ss >> tempStr; karty.push_back( karta( tempStr ) ); } } } }
gra::~gra() { }
void gra::rysuj( RenderWindow * window ) { karty[ 0 ].rysuj( window ); }
-plik karta.h: #ifndef KARTA_H #define KARTA_H
#include <SFML/Graphics.hpp> #include <string> #include <Windows.h>
class karta { sf::Image karta_img; sf::Sprite kartaSprajt; public: karta( std::string ); ~karta(); void rysuj( sf::RenderWindow * ); };
#endif
-plik karta.cpp: #include "karta.h"
karta::karta( std::string nazwaPliku ) { if( !karta_img.LoadFromFile( "gfx/1.png" ) ) MessageBox( NULL, LPCWSTR( "error" ), LPCWSTR( "error" ), MB_OK ); kartaSprajt.SetImage( karta_img ); kartaSprajt.SetPosition( 10, 10 ); }
karta::~karta() { }
void karta::rysuj( sf::RenderWindow * window ) { window->Draw( kartaSprajt ); }
-plik definicje.h:
|
|
malan |
» 2011-06-02 20:23:06 Jesteś pewny, że karty nie jest pusty? |
|
mar3 Temat założony przez niniejszego użytkownika |
» 2011-06-02 20:47:00 Jestem pewien. Nawet teraz dodałem: karta karta_temp( "test" ); karty.push_back( karta_temp ); na samym początku konstruktora klasy gra i dalej wyświetla się biały prostokąt zamiast obrazka. |
|
malan |
» 2011-06-02 22:15:05 Wrzuć cały projekt na jakiś serwer. Łatwiej jest wyłapać błąd we własnym środowisku niż w przeglądarce. |
|
mar3 Temat założony przez niniejszego użytkownika |
» 2011-06-03 08:49:54 gra_memory.rar - spakowany do rara pełen folder projektu Visual C++ 2010 EE. |
|
DejaVu |
» 2011-06-03 11:36:26 |
|
mar3 Temat założony przez niniejszego użytkownika |
» 2011-06-03 12:22:12 Korzystam z karty: nVidia GeForce 9500 GT i SFML 1.6. A zresztą obraz ładowany w mainie się wyświetla tylko ten tworzony w klasie nie (napisałem to w komentarzu w kodzie w pierwszej wypowiedzi w tym temacie). To są te same obrazki (oba obiekty sf::Image i oba sf::Sprite prowadzą do pliku 1.png). To, że prowadzą do tego samego pliku jest spowodowane tylko dla testu (czy to nie wina obrazku). |
|
malan |
» 2011-06-03 14:01:33 Trochę zbiłeś, bo kod, który jest w paczce różni się od tego, który wkleiłeś na forum. W kodzie z paczki masz błąd w konstruktorze klasy gra . Tworzysz tam obiekt automatyczny i dodajesz go do vectora: karta karta_temp( "test" ); karty.push_back( temp );
...wszystko fajnie, ale ten obiekt ginie po wyjściu z konstruktora, a wraz z nim obiekty sf::Image i sf::Sprite . W metodzie gra::rysuj obwołujesz się właśnie do pierwszego elementu tablicy, którego (jak już wspomniałem) dawno nie ma. void gra::rysuj( RenderWindow * window ) { karty[ 0 ].rysuj( window ); } Stąd ten biały obrazek. Kod z forum... Tiaaa... karty.push_back( karta( tempStr ) );
karta( tempStr ) - to też jest obiekt tymczasowy, który ginie zanim zdążysz wymówić C++. Zmień sposób wczytywania obrazków. Po co je wczytujesz aż 8 razy? Wczytaj obrazek raz. Pomyśl sam jak to przerobić. |
|
« 1 » 2 |