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 #include <SFML/Graphics.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 ); 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 ) ); window.draw( sAktDesperacji ); window.draw( butKontynuuj.drawButton() ); window.draw( butNowaGra.drawButton() ); window.display(); } }
void graj( sf::RenderWindow & window ) { return; }
int main() { FreeConsole(); window.setFramerateLimit( 80 ); sf::View defaultCam( window.getDefaultView() ); sf::View landerCam; sf::FloatRect rectCam( 100, 100, 400, 300 ); landerCam.reset( rectCam ); landerCam.setViewport( sf::FloatRect( 0.f, 0.f, 1.f, 1.f ) ); 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 ) ); menu::cButton aktDesperacji2( sf::String( "*TU SIE DZIEJE GRA*\nekspozje, kratery i inne ladowniki" ), font ); while( window.isOpen() ) { 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(); } } czasFiz = zegFiz.getElapsedTime(); zegFiz.restart(); window.clear(); window.setView( window.getDefaultView() ); window.draw( aktDesperacji2.drawButton() ); window.display(); } return 0; }
dwie zmienne globalne (mimo, że mnie przestrzegano), są tak często adresowane (&), że uważam to za wymagane cButton.h #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(); }; }
cButton.cpp #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(); } }
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. |
|
MrPoxipol |
» 2014-02-09 22:22:00 Nie ustalasz wielkości tekstu. |
|
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 |
|
MrPoxipol |
» 2014-02-09 22:40:42 Hm, nie widzę, żebyś gdzieś ustawiał czcionkę dla przycisku (przy tworzeniu obiektu). |
|
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 |
|
« 1 » |