在SFML中超过窗口边界时,将光标发送到新行
Sending the cursor to a new line when window boundaries are exceeded in SFML?
我想知道当我超过SFML中的窗口宽度边界时,是否有任何方法可以将我键入的文本行移动到下一行?我是SFML的新手,但我无法理解它。在过去的三个小时里,我尝试了很大一部分,但它移到了一条新的线上,然后卡在了一条线上,我对此无能为力。有什么想法吗?这是我的密码。
#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>
int main(){
srand(time(0));
sf::Vector2i screenDimensions(800, 600);
sf::RenderWindow window(sf::VideoMode(screenDimensions.x, screenDimensions.y), "My First SFML Game");
sf::Texture pTexture;
sf::Sprite playerImage;
if (!pTexture.loadFromFile("Player.png"))
window.setTitle("Couldn't load player image!");
playerImage.setTexture(pTexture);
sf::Font font;
if (!font.loadFromFile("Sitka.ttc"))
window.setTitle("Oops!");
sf::String string;
sf::Text text(string, font, 40);
text.setColor(sf::Color(44, 127, 255));
text.setStyle(sf::Text::Bold | sf::Text::Underlined);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event)){
switch (event.type)
{
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
if (event.key.code == sf::Keyboard::Escape){
window.close();
break;
case sf::Event::TextEntered:
if (event.text.unicode >= 32 && event.text.unicode <= 126) {
string += event.text.unicode;
}
else if (event.text.unicode == 8 && string.getSize() > 0)
string.erase(string.getSize() - 1, 1);
text.setString(string);
if (text.getLocalBounds().width > 800) {
if (event.text.unicode >= 32 && event.text.unicode <= 126) {
string.clear();
string += "n";
string += event.text.unicode;
text.setString(string);
}
else if (event.text.unicode == 8 && string.getSize() > 0)
string.erase(string.getSize() - 1, 1);
}
}
}
}
window.draw(text);
window.display();
window.clear();
}
}
您的问题是"sf::String::clear()"删除整个字符串。但您只想删除字符串的最后一个字符。
为此,std::string(和sf::string)有一个成员函数"erase()"。使用擦除,您可以简单地从字符串中删除一个字符。您想删除最后一个字符,它位于位置"string.getSize()-1",所以只需将您的行"string.clear();"更改为(string.erase(string.get-Size()-1);"
问题
当您调用字符串清除消息时,它会导致删除所有字符串字符,从而删除您创建的新行。因此,在输入一行之后,您有效地重复了这个过程。这就是为什么它似乎被"卡在"同一条线上。
解决方案
如果你想保持想要的效果(清除原来的行,然后移到下一行),你可以简单地跟踪行号,每次输入一定数量的换行符。
代码:
int lineNumber(0);
//....
if (event.text.unicode >= 32 && event.text.unicode <= 126) {
++lineNumber; // move onto the next line
string.clear();
for (int i(0); i < lineNumber; ++i)
string += "n";
string += event.text.unicode;
text.setString(string);
}
相关文章:
- 使用新行和不使用新行读取文件
- 遇到新行时,有没有办法停止istream_iterator
- PangoLayout 中忽略的新行
- 使用 clang 格式时,当行很大时,如何将右括号分成新行?
- 如何检测将文本文件读入 int 数组的新行
- 当 getline 直到新行才读取时会发生什么?
- 添加新行时工作代码引发异常.调试技巧?
- QTree查看新行,没有布局就不可见已更改
- 新行上的 clang 格式右括号
- C++流:保存到新行而不是覆盖旧行
- (C++) 使用诅咒打印从文件中读入的新行
- 按升序输出整数时,将最后一个整数放在新行上
- 用C++计算输入文本的新行数
- 为什么我的代码在终端中没有输出任何内容.开始新行没有错误
- WriteConsoleOutputCharacterW - 我的新行在哪里?
- 为什么当测试用例数为 1 时,我的程序不输入而是打印新行?
- 如何运行 while 循环直到到达新行?
- 在SFML中超过窗口边界时,将光标发送到新行
- 将文本光标移动到新行
- 在没有将光标移动到新行之前,在gotoxy(80,25)位置上写入字符