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