在SFML 2.4中使用字体精灵表作为字体

时间:2017-04-19 11:35:43

标签: c++ sfml

在SFML中是否可以拍摄带有字体的图像,例如

  

enter image description here

我拍摄此图片并以某种方式将其表示为文字并在sf::Textsf::Font中使用。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

No.

SFML字体处理仅涉及普通字体文件。不过,可以使用sf::Sprite轻松实现精灵表字体。

答案 1 :(得分:1)

虽然它没有直接实现(但是),你可以这样做 - 正如Bartek所提到的 - 使用sf::Sprite来做这件事,但我建议sf::VertexArray。< / p>

首先,您需要一些功能将任何角色转换为精灵表内的坐标。有几种方法可以做到这一点。但是现在我只想做一个简单的映射:

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

请注意,我没有测量上面的字符表。我刚用24像素进行演示。当然,当你加载&#34; font&#34;。

时,你可以动态地构建这样的映射

使用sf :: Sprite绘图时,您可以执行以下操作:

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;
}

sf :: VertexArray的方法类似,但你只是按字形构造字形,而不是一遍又一遍地重绘它们。

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);

请注意,所有这些代码都是未经测试的,并且来自内存,因此请注意此处或那里的错误,但它应该让您大致了解如何执行此操作。