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

[SFML] Problem z wczytaniem czcionki.

Ostatnio zmodyfikowano 2014-12-01 19:21
Autor Wiadomość
marc_xxx
Temat założony przez niniejszego użytkownika
[SFML] Problem z wczytaniem czcionki.
» 2014-11-25 20:50:52
Witam.
Zacząłem pisać swoją pierwszą grę - kółko i krzyżyk. Przy, pozornie prostej, grze już na samym początku napotkałem problem. Grę piszę całkowicie spontanicznie, nie planując nic wcześniej - nie ustalam hierarchii klas itp. wiem, że to źle ale niby to prosty projekt. Dobra - wracając do tematu - na początku zacząłem tworzyć menu. W związku z tym stworzyłem klasę przycisku. Gdy ładuję czcionkę, jaka ma być wyświetlana na przycisku to jest napisane "Unable to create font face" w konsoli - program uruchamia się normalnie ale nic się nie wyświetla.
Oto definicja mojej klasy Button - wiem, że tu jest chaos, ale zabrałem się za pisanie gry zupełnie spontanicznie:
C/C++
#ifndef BUTTON_H
#define BUTTON_H

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <string>
#include <iostream>

namespace ttt
{
    class Button
    {
    public:
        Button( std::string title, unsigned int positionX, unsigned int positionY );
        ~Button();
        bool isPointerOnButton();
        sf::Text & draw();
        void setText( std::string fontFilename, sf::Color color, unsigned short textSize );
       
    private:
        sf::Font font;
        sf::Text text;
        unsigned short sizeX;
        unsigned short sizeY;
        unsigned int positionX;
        unsigned int positionY;
        std::string title;
    };
}

#endif

Definicje funkcji:
C/C++
#include "button.h"

ttt::Button::Button( std::string fontFilename, unsigned int positionX, unsigned int positionY )
{
    title = title;
    this->positionX = positionX;
    this->positionY = positionY;
    if( !this->font.loadFromFile( fontFilename ) )
    {
        std::cout << "Error loading font .. " << std::endl;
    }
}

ttt::Button::~Button()
{
}

void ttt::Button::setText( std::string title, sf::Color color, unsigned short textSize )
{
    this->title = title;
   
    this->text.setFont( font );
    this->text.setString( title );
    this->text.setCharacterSize( textSize );
    this->text.setPosition( this->positionX, this->positionY );
    this->text.setColor( color );
}

sf::Text & ttt::Button::draw()
{
    return this->text;
}
P-121404
unkn9wn
» 2014-11-25 22:32:12
rzeczywiście chaos.

Nazwy argumentow przy definicji metody setText i  konstruktorze roznia sie od tych przy deklaracjach
P-121415
NopeDotAvi
» 2014-11-26 07:16:25
spróbuj
fontFilename.c_str()
 podczas wczytywania czcionki
P-121425
kubawal
» 2014-12-01 19:21:33
Taka jeszcze mała uwaga optymalizacyjna - lepiej użyć jakiegoś ResourceMenager'a, albo najlepiej Thor Resources (http://www.bromeon.ch​/libraries/thor/v2.0​/tutorial-resources.html
Szybszym sposobem jest użycie statycznego pointera do czcionki i ładowanie jej za wyłącznie pierwszym uzyciem.
C/C++
class Button
{
    //...
    static void cleanUp() { if( font ) delete font; }
   
    Button( /*...*/ )
    {
        if( !font )
        {
            font = new sf::Font;
            font.loadFromFile( "myFont.ttf" );
        }
        //...
    }
   
private:
    static sf::Font * font = nullptr;
    //...
}
Niestety minus tego jest taki, że nie ma za bardzo jak zastosować tu RAII. Tak więc, jak mówiłem, lepiej użyć Thor'a.
P-121862
« 1 »
  Strona 1 z 1