从文本文件中打印sfml中的2d数组

时间:2018-01-18 18:22:57

标签: c++ visual-studio sfml

我尝试使用window.draw()函数将一个来自文本文件的二维数组字符打印到一个渲染窗口中。然而,一切似乎都完美无缺,除了打印时只跳过一个字符。 例如,如果我有一个15个字符的行,它只会打印8,但是当我在终端上打印它时它打印得非常好,我根本就不知道为什么它的表现如此,尝试了一些改变文本文件本身的东西,或改变大小。似乎没有什么对我有用。任何想法或帮助都非常感激。

这是代码的一部分:

ResponseUri

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题,但最明显的问题是您始终只绘制一个字符,然后显示结果(将翻转缓冲区)。

由于这个原因,你基本上在两个缓冲区之间交替出现字符(因为SFML是双缓冲)。

此外,您不断阅读文件,重新创建字符/文本元素等,这些效果不是很有效,一旦到达文件末尾就会失败。

对于某些实际的游戏或程序,您应该优化绘图(一次绘制10个字符,因为一个sf::Text比绘制10个单独的sf::Text个对象更快)。我现在暂时不理解这一点。

以下是一个快速(未经测试)的示例,向您展示基本想法。

// First I'd use some container to store our `sf::Text` objects
// This will just create all the objects
std::vector<sf::Text> chars(rows * cols);

// Now let's read the characters and add to our vector
for (std::size_t y = 0; y < rows; ++y) {
    for (std::size_t x = 0; x < cols; ++x) {
        // Just an alias to simplify the following lines
        sf::Text &text = chars[y * cols + x];

        // Now just set up everything
        text.setFont(my_font);
        text.setFillColor(sf::Color::White);
        text.setCharacterSize(30);
        text.setPosition(30 * x, 30 * y);
        text.setString(my_file.get());
    }
}

while (window.isOpen()) {
    sf::Event event;
    while (window.pollEvent(event)) {
        // Just your usual event handling
    }

    window.clear();
    // Iterate over all elements and draw them
    for (const auto &text : chars)
        window.draw(text);
    window.display();
}

如果您正在尝试创建某种图形控制台,则应将所有字符放入某些sf::VertexArray或使用着色器渲染它们。