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

[SFML] Biały prostokąt zamiast obrazka

Ostatnio zmodyfikowano 2011-06-03 21:09
Autor Wiadomość
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:
C/C++
#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 ); //wyświetla się prawidłowo
        game.rysuj( & oknoAplikacji ); //
        oknoAplikacji.Display();
    }
    return 0;
}
- plik gra.h:
C/C++
#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:
C/C++
#include "gra.h"

gra::gra()
{
    srand( time( NULL ) );
   
    int * balls = new int[ ILOSC_OBRAZOW ];
   
    for( int i = 0; i < ILOSC_OBRAZOW; i++ ) // i = 1;
    {
        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 )
            {
                //karta
                std::stringstream ss;
                std::string tempStr;
                ss << balls[ i ];
                ss >> tempStr;
                karty.push_back( karta( tempStr ) );
                //MessageBox(NULL, LPCWSTR("Error loading headsprite"), LPCWSTR("Error loading sprite part: head, located in 'sprites/head.png'."), MB_OK);
            }
           
        }
    }
}

gra::~gra()
{
}

void gra::rysuj( RenderWindow * window )
{
    /*for(int i = 0; i < karty.size(); i++)
    {
    karty[i].rysuj(window);
    }*/
    karty[ 0 ].rysuj( window );
}
-plik karta.h:
C/C++
#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:
C/C++
#include "karta.h"

karta::karta( std::string nazwaPliku )
{
    //karta_img.LoadFromFile(nazwaPliku+".png");
    if( !karta_img.LoadFromFile( "gfx/1.png" ) )
         MessageBox( NULL, LPCWSTR( "error" ), LPCWSTR( "error" ), MB_OK );
   
    kartaSprajt.SetImage( karta_img );
    //static int pos = 10;
    kartaSprajt.SetPosition( 10, 10 );
}

karta::~karta()
{
}

void karta::rysuj( sf::RenderWindow * window )
{
    //window->Draw(sprite);
    window->Draw( kartaSprajt );
}
-plik definicje.h:
C/C++
#define ILOSC_OBRAZOW 8 //1-8.png
P-33781
malan
» 2011-06-02 20:23:06
Jesteś pewny, że
karty
 nie jest pusty?
P-33783
mar3
Temat założony przez niniejszego użytkownika
» 2011-06-02 20:47:00
Jestem pewien. Nawet teraz dodałem:
C/C++
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.
P-33786
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.
P-33787
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.
P-33791
DejaVu
» 2011-06-03 11:36:26
Jaką masz kartę graficzną i jakiej wersji SFML-a używasz? :) Ponoć SFML 1.6 ma buga i nie działają karty graficzne z chipsetem ATI (czytaj: Radeony) i w wersji 2.0 został ten bug usunięty. Jeżeli wyświetla się prostokąt obrazka o jego wymiarach i jest on biały to prawdopodobnie właśnie mówimy o tym błędzie biblioteki SFML w wersji 1.6.

/edit:
http://www.facepunch.com/threads/770470-Image-turning-up-white-SFML

/edit2:
A sprawdzałeś przykład z kursu?
http://cpp0x.pl/kursy/Kurs-SFML-C++ /Tworzenie-i-wyswietlanie-sprajtow/333
P-33793
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).
P-33795
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:
C/C++
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.
C/C++
void gra::rysuj( RenderWindow * window )
{
    //window->Draw(sprite);
    /*for(int i = 0; i < karty.size(); i++)
    {
    karty[i].rysuj(window);
    }*/
    karty[ 0 ].rysuj( window );
}
Stąd ten biały obrazek.

Kod z forum... Tiaaa...
C/C++
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ć.
P-33796
« 1 » 2
  Strona 1 z 2 Następna strona