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

[SFML] Rysowanie sf::Text w zagnieżdżonej pętli.

Ostatnio zmodyfikowano 2014-02-09 22:47
Autor Wiadomość
Schulze13
Temat założony przez niniejszego użytkownika
[SFML] Rysowanie sf::Text w zagnieżdżonej pętli.
» 2014-02-09 22:19:04
Witam.
Ostatnio pracuję nad menu do mojej "gry", znanej niektórym jako MunLander. Otóż pojawił się dość ciekawy problem. Znajduje się on w "menu". Jako cel postanowiłem sobie wyświetlenie tekstowych przycisków. Problem pojawił się gdy chciałem je rysować na ekranie. Sytuacja wygląda tak, że podczas wykonywania głównej pętli, następuje uruchomienie zagnieżdżonej pętli menu. Wszytko w niej działa bez zarzutu, ekran się czyści, eventy są zbierane, oprócz wyświetlania sf::Text butText. Poniżej prezentuje kod.

main.cpp
C/C++
#include <SFML/Graphics.hpp>
//#include <SFML/System.hpp>
#include <iostream>
#include <Windows.h>
#include <vector>

#include "cLander.h"
#include "cSurf.h"
#include "cButton.h"

sf::RenderWindow window( sf::VideoMode( 800, 600 ), "Mun Lander! Alfa 0.1" );
sf::Font font;


enum MenuOption
{
    moWyjdz = 0,
    moNowaGra = 1,
    moKontynuuj = 2
   
};


MenuOption fMenu( bool gameOn, sf::Event & eventG )
{
   
    menu::cButton butKontynuuj( font );
    menu::cButton butNowaGra( sf::String( "Nowa Gra" ), font );
   
    //akt desperacji
    sf::ConvexShape sAktDesperacji;
    sAktDesperacji.setPosition( 300, 300 );
    sAktDesperacji.setPointCount( 4 );
    {
        sAktDesperacji.setPoint( 0, sf::Vector2f( - 25, - 23 ) );
        sAktDesperacji.setPoint( 1, sf::Vector2f( 25, - 23 ) );
        sAktDesperacji.setPoint( 2, sf::Vector2f( 20, 0 ) );
        sAktDesperacji.setPoint( 3, sf::Vector2f( - 20, 0 ) );
    }
   
    window.setView( window.getDefaultView() );
   
    while( window.isOpen() )
    {
       
        while( window.pollEvent( eventG ) )
        {
            if( eventG.type == sf::Event::Closed )
            {
                window.close();
            }
            if( eventG.type == sf::Event::KeyPressed && eventG.key.code == sf::Keyboard::Escape )
            {
                return moWyjdz;
            }
        }
       
       
       
        window.clear( sf::Color( 00, 20, 20 ) );
       
       
        //rysowanie aktu desperacji dającego nadzieje, że coś się jednak rysuje
        window.draw( sAktDesperacji );
       
        window.draw( butKontynuuj.drawButton() );
        window.draw( butNowaGra.drawButton() );
       
       
        window.display();
    }
   
   
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

void graj( sf::RenderWindow & window )
{
   
    return;
}


int main()
{
    /// inicjalizacja okna gry
    FreeConsole();
   
   
    window.setFramerateLimit( 80 );
    sf::View defaultCam( window.getDefaultView() );
    sf::View landerCam;
   
    ///Coś
    sf::FloatRect rectCam( 100, 100, 400, 300 );
    landerCam.reset( rectCam );
    landerCam.setViewport( sf::FloatRect( 0.f, 0.f, 1.f, 1.f ) );
    /// ekran ładowania
   
    /// inicjalizacja zmiennych i obiektów gry
   
   
    sf::Font font;
    font.loadFromFile( "Volter.ttf" );
   
    sf::Event eventG;
   
    sf::Clock zegFiz;
    sf::Time czasFiz;
    sf::Clock zegPkt;
    sf::Time czasPkt;
   
    srand( time( NULL ) );
   
   
    //////////////////////////////////////////////////////////////////////////////
    /// test
   
    menu::cButton aktDesperacji2( sf::String( "*TU SIE DZIEJE GRA*\nekspozje, kratery i inne ladowniki" ), font );
   
   
   
   
   
   
   
    /// główna pętla gry
   
    while( window.isOpen() )
    {
        /// obsługa klawiatury i myszy
       
       
        while( window.pollEvent( eventG ) )
        {
            if( eventG.type == sf::Event::Closed )
            {
                window.close();
               
            }
           
           
            if( eventG.type == sf::Event::MouseWheelMoved && eventG.mouseWheel.delta > 0 )
            {
                landerCam.zoom( 1.1f );
                defaultCam.zoom( 1.1f );
            }
            if( eventG.type == sf::Event::MouseWheelMoved && eventG.mouseWheel.delta < 0 )
            {
                landerCam.zoom( 0.9f );
                defaultCam.zoom( 0.9f );
            }
            if( eventG.type == sf::Event::KeyPressed && eventG.key.code == sf::Keyboard::Escape )
            {
                fMenu( true, eventG );
                zegFiz.restart();
            }
           
           
        }
       
        //sterowanie natychmiast :O
       
       
        /// liczenie fizyki itp.
        czasFiz = zegFiz.getElapsedTime();
        zegFiz.restart();
       
        /// ustawianie obiektów
       
       
        /// czyszczenie ekranu
        window.clear();
        /// rysowanie obiektów
       
        //window.draw(mun);
       
        window.setView( window.getDefaultView() );
       
        window.draw( aktDesperacji2.drawButton() );
       
       
        /// wyświetlanie
        window.display();
    }
   
    return 0;
}
dwie zmienne globalne (mimo, że mnie przestrzegano), są tak często adresowane (&), że uważam to za wymagane

cButton.h
C/C++
#pragma once
#include <SFML/Graphics.hpp>
namespace menu
{
   
    class cButton
    {
        sf::String butString;
        sf::Text butText;
       
       
       
    public:
        cButton( sf::Font & );
        cButton( sf::String, sf::Font & );
        ~cButton( void );
        sf::Text const & drawButton();
        sf::Vector2f const getPosition();
       
    };
   
} //namespace

cButton.cpp
C/C++
#include "cButton.h"


namespace menu
{
   
    cButton::cButton( sf::Font & font )
    {
        butString = "Przycisk numer N";
        butText.setString( butString );
        butText.setPosition( 200, 200 );
        butText.setCharacterSize( 30 );
        butText.setScale( 1, 1 );
        butText.setFont( font );
    }
   
    cButton::cButton( sf::String str, sf::Font & font )
    {
        butString = str;
        butText.setString( butString );
        butText.setPosition( 200, 200 );
        butText.setCharacterSize( 30 );
        butText.setScale( 1, 1 );
        butText.setFont( font );
    }
   
   
    cButton::~cButton( void )
    {
    }
   
    sf::Text const & cButton::drawButton()
    {
        return butText;
    }
   
    sf::Vector2f const cButton::getPosition()
    {
        return butText.getPosition();
    }
   
} //namespace menu

Akt desperacji pojawia się na ekranie. Potwierdza to, że problem tkwi w sf::Text. Siedzę nad tym drugi dzień, a rozwiązanie nadal do mnie nie zawitało.


//edit: usuniętą zbędny kod tak aby się skompilował z tymi źródłami co są dostępne.
czcionka jest dostępna na daFont. Równie dobrze możecie użyć Arial.
P-104347
MrPoxipol
» 2014-02-09 22:22:00
Nie ustalasz wielkości tekstu.
P-104349
Schulze13
Temat założony przez niniejszego użytkownika
» 2014-02-09 22:24:49
Domyślna wielkość to 30. W poprzednim kodzie stosowałem 13. Tak jak we wszystkich częściach kodu. Mimo to nie działa
P-104350
MrPoxipol
» 2014-02-09 22:40:42
Hm, nie widzę, żebyś gdzieś ustawiał czcionkę dla przycisku (przy tworzeniu obiektu).
P-104354
Schulze13
Temat założony przez niniejszego użytkownika
» 2014-02-09 22:47:49
Nawet z nią się nie wyświetla. 
//edit 9.2.14
Postanowiłem rysować zawartość klasy cButton poza zagnieżdżoną pętlą menu... wyświetla się.
Uaktualniłem kod, dodałem te size i font. Problem nadal występuje.

//edit 14.2.14 Problem nadal występuje. Przyślijcie prowiant
P-104356
« 1 »
  Strona 1 z 1