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

[SFML] Problem z wyświetlaniem sprite'a.

Ostatnio zmodyfikowano 2011-10-08 15:49
Autor Wiadomość
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ć.

C/C++
//menu.h

#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
{
    //private
   
    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
{
    //private
   
    std::vector < cButton > tab;
   
   
public:
   
    void AddButton( short x, short y, Mode dest, const std::string & adres );
    void DrawMenu();
   
    //konstruktor
    cMenu();
   
   
};


#endif








//menu.cpp

#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();
   
    //for(int i=tab.size()-1; i>0; i--)
    //    {
    // tab[i].DrawButton();
    //    }                        
    //  chwilowo wyłączyłem rysowanie wszystkich przycisków, aby sprawdzić czy to czasem nie wina pętli
   
}

void cButton::DrawButton()
{
   
    App.Draw( gfx );
   
}







///////////////////////////////////
//                               //
//           Project :)          //
//                               //
//                               //
//         By blojayble          //
//                               //
//           main.cpp            //
//                               //
///////////////////////////////////

#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?)
P-41792
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ć:
» KursyKurs STC kurs
P-41794
DejaVu
» 2011-10-06 22:33:22
Sprawdziłeś czy zachodzi warunek:
if( dest == GameMode )
?
P-41800
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.
P-41807
DejaVu
» 2011-10-07 19:01:28
C/C++
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.
P-41814
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. :)
P-41817
DejaVu
» 2011-10-07 20:34:36
Najwyraźniej konstruktor kopiujący mają nie do końca poprawnie napisany:
C/C++
Image::Image( const Image & Copy )
    : Resource < Image >( Copy )
    , //To zapewne bruździ :) 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 >& )
{
    // Nothing to do, we don't want to copy observers
}

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.
P-41819
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.
P-41820
« 1 » 2 3
  Strona 1 z 3 Następna strona