blojayble Temat założony przez niniejszego użytkownika |
[SFML] Problem z wyświetlaniem sprite'a. » 2011-10-06 19:35:58 Witam ponownie. Otóż mam problem z wyświetleniem sprite'a. Tzn, mam zaczątek klasy odpowiadającej za przyciski oraz klasę menu. O ile z wyświetlaniem wprost z klasy nie ma problemu, to gdy chcę wyświetlić używając klasy menu(chcę tak zrobić dla wygody oraz elastyczności) wyświetla mi się puste pole, o rozmiarach danego sprite'a (ścieżka jak i zmienne są takie same jak w działającej metodzie) jednak jest biała. Oto cały kod. Wiem, jest ubogi, dlatego, że dopiero zacząłem go pisać.
#ifndef _MENU_H #define _MENU_H
#include <iostream> #include <SFML\Graphics.hpp>
extern sf::RenderWindow App; extern sf::Event Event;
enum Mode { M_MENU, M_GAME, M_SETTINGS, M_INFO }; enum Buttons { B_MENU, B_GAME, B_SETTINGS, B_INFO };
class cButton { short x, y; sf::Image i_gfx; sf::Sprite gfx; public: cButton(); cButton( short x, short y, Mode dest, const std::string & adres ); void DrawButton(); };
class cMenu { std::vector < cButton > tab; public: void AddButton( short x, short y, Mode dest, const std::string & adres ); void DrawMenu(); cMenu(); };
#endif
#include "menu.h"
extern Mode GameMode;
cButton::cButton( short x, short y, Mode dest, const std::string & adres ) { if( dest == GameMode ) { i_gfx.LoadFromFile( adres ); gfx.SetImage( i_gfx ); gfx.SetPosition( x, y ); } }
cMenu::cMenu() { std::vector < cButton > tab; }
void cMenu::AddButton( short x, short y, Mode dest, const std::string & adres ) { tab.push_back( cButton( x, y, dest, adres ) ); }
void cMenu::DrawMenu() { tab[ 0 ].DrawButton(); }
void cButton::DrawButton() { App.Draw( gfx ); }
#include <SFML\Graphics.hpp> #include "menu.h"
sf::RenderWindow App( sf::VideoMode( 640, 480, 32 ), "Junk Warz", sf::Style::Close ); sf::Event Event; Mode GameMode = M_MENU;
void main() { App.SetFramerateLimit( 60 ); cMenu( Menu ); cButton Button( 100, 100, M_MENU, "Resources/Menu/gfxGame.PNG" ); Menu.AddButton( 100, 199, M_MENU, "Resources/Menu/gfxGame.PNG" ); while( App.IsOpened() ) { App.Clear( sf::Color( 255, 255, 2 ) ); while( App.GetEvent( Event ) ) { if( Event.Type == sf::Event::Closed ) App.Close(); } Button.DrawButton(); Menu.DrawMenu(); App.Display(); } }
Podałem cały kod, ponieważ nie wiadomo gdzie błąd czyha. Generalnie na początku chodziło mi o 2 funkcje: Button.DrawButton(); (Ta funkcja działa bdb) oraz Menu.DrawMenu(); (Ta wyświetla białe pole) W obu chodzi o to samo, tyle że z klasy cMenu do funkcji DrawButton odwołuję się poprzez wektor. Jeśli macie dodatkowo jakieś zastrzeżenia co do moich rozwiązań, lub ogólnie nieczytelności/bezsensowności kodu, to piszcie. Z góry dziękuję za odpowiedź i pozdrawiam. (Jak się wkleja na tym skrypcie kod tak, aby była kolorowana składnia?) |
|
m4tx |
» 2011-10-06 20:00:04 (Jak się wkleja na tym skrypcie kod tak, aby była kolorowana składnia?) |
O, tak: [cpp]// Tutaj kod[/cpp] To Ci się może przydać: Kurs STC |
|
DejaVu |
» 2011-10-06 22:33:22 Sprawdziłeś czy zachodzi warunek: if( dest == GameMode ) ? |
|
blojayble Temat założony przez niniejszego użytkownika |
» 2011-10-07 16:05:35 Sprawdziłem (chwilowo usunąłem tego if'a, bo jak na razie nie miał większego znaczenia), niestety nie pomogło.
Myślę, że problem może leżeć w odwołaniu z wektora, ale nie rozumiem, dlaczego się tak dzieje. |
|
DejaVu |
» 2011-10-07 19:01:28 tab.push_back( cButton( x, y, dest, adres ) );
Nie jestem pewien czy tu przypadkiem nie leży błąd. Ty bowiem tworzysz obiekt, a następnie jest on kopiowany za pomocą konstruktora kopiującego do vectora, po czym obiekt przekazany przez argument jest niszczony - może SFML coś sprząta nadgorliwie przy kopiowaniu obrazka... spróbuj najpierw utworzyć obiekt do kontenera, a następnie ustawić jego atrybuty. |
|
blojayble Temat założony przez niniejszego użytkownika |
» 2011-10-07 20:10:27 Dzięki, nasze przypuszczenia co do winowajcy były trafne, ale już go unieszkodliwiłem.
Był to niecodzienny problem, ale został rozwikłany.
I jak się okazuje: jak biblioteka robi za dużo za nas, to też nie dobrze. We wszystkim potrzebny jest umiar. :) |
|
DejaVu |
» 2011-10-07 20:34:36 Najwyraźniej konstruktor kopiujący mają nie do końca poprawnie napisany:
Image::Image( const Image & Copy ) : Resource < Image >( Copy ) , myWidth( Copy.myWidth ) , myHeight( Copy.myHeight ) , myTextureWidth( Copy.myTextureWidth ) , myTextureHeight( Copy.myTextureHeight ) , myTexture( 0 ) , myIsSmooth( Copy.myIsSmooth ) , myPixels( Copy.myPixels ) , myNeedTextureUpdate( false ) , myNeedArrayUpdate( false ) { CreateTexture(); }
template < typename T > Resource < T >::Resource( const Resource < T >& ) { }
Być może w SFML 2.0 tego problemu już nie będzie, jednak zapewne jeszcze z pół roku minie zanim będzie nam dane korzystać z oficjalnej wersji 2.0 :)
/edit:
Z testów wynikło, że z sf::Image jest wszystko OK. |
|
Elaine |
» 2011-10-07 21:41:01 Z konstruktorem kopiującym sf::Image jest wszystko ok, błąd wynika z niezrozumienia tego, jak działa sf::Sprite. |
|
« 1 » 2 3 |