2017-04-19 2 views

Répondre

1

No.

gestion des polices SFML ne concerne que les fichiers de police normale. Les polices de feuille de sprite peuvent être facilement implémentées avec sf::Sprite, cependant.

+0

Comment ferais-je cela alors? – Lucky38i

+0

@ Lucky38i: vous l'implémentez vous-même ou utilisez une bibliothèque existante. Voici ma mise en œuvre: https://github.com/SuperV1234/SSVStart/tree/master/include/SSVStart/BitmapText –

1

Bien qu'il ne soit pas encore implémenté (pour l'instant), vous pouvez le faire - comme mentionné par Bartek - utilisez sf::Sprite pour cela, mais je recommanderais un sf::VertexArray.

D'abord, vous aurez besoin d'une fonction pour traduire n'importe quel caractère en coordonnées à l'intérieur de votre feuille de sprite. Il y a plusieurs moyens de le faire. Mais pour l'instant je vous contentez de faire une cartographie simple:

std::map<wchar_t, sf::IntRect> glyphs; 

glyphs[L' '] = sf::IntRect(0, 0, 24, 24); 
glyphs[L'!'] = sf::IntRect(24, 0, 24, 24); 
// etc. define everything in your font 

Notez que je n'ai pas mesuré votre feuille de personnage ci-dessus. Je viens d'utiliser 24 pixels pour la démonstration. Bien sûr, vous pouvez créer un mapping dynamique de cette manière lorsque vous chargez la "police".

Lorsque dessin à l'aide que vous pourriez alors d'un sf Sprite juste faire quelque chose comme ceci:

sf::Sprite character(myFontTexture); 

int x = 0; 
for(auto &c : text) { 
    auto &glyph = glyphs.find(c); 

    // Unknown character not in our mapping? 
    if(glyph == glyps.end()) 
     continue; // skip it! 

    // Update the sprite 
    character.setTextureRect(glyph); 
    character.setPosition(x, 0); 

    // Draw it 
    window.draw(character); 

    // Update the position for the next glyph 
    x += glyph.width; 
} 

L'approche d'une sf :: VertexArray est similaire, mais vous venait de le construire glyphe par glyphe plutôt que de les redessiner encore et encore.

int x = 0; 
for(auto &c : text) { 
    auto &glyph = glyphs.find(c); 

    // Unknown character not in our mapping? 
    if(glyph == glyps.end()) 
     continue; // skip it! 

    // Specific vertex layout etc. depends on the actual sf::VertexArray 
    myVertexArray.append(sf::Vertex2f(sf::Vector2f(x, 0), sf::Vertex2f(glyph.left, glyph.top)); 
    myVertexArray.append(sf::Vertex2f(sf::Vector2f(x + glyph.width, 0), sf::Vertex2f(glyph.left + glyph.width, glyph.top)); 
    myVertexArray.append(sf::Vertex2f(sf::Vector2f(x + glyph.width, glyph.height), sf::Vertex2f(glyph.left + glyph.width, glyph.top + glyph.height)); 
    myVertexArray.append(sf::Vertex2f(sf::Vector2f(x, glyph.height), sf::Vertex2f(glyph.left, glyph.top + glyph.height)); 
} 

// Draw the text 
window.draw(myVertexArray); 

Notez que tout ce code est non testé et de la mémoire, alors attendez-vous des bugs ici ou là, mais il devrait vous donner une idée générale sur la façon dont vous pourriez le faire.