C++ 在SFML中超过窗口边界时是否将光标发送到新行?

C++ 在SFML中超过窗口边界时是否将光标发送到新行?,c++,newline,sfml,C++,Newline,Sfml,我想知道,当我超出SFML中窗口宽度的边界时,是否有任何方法可以将我正在键入的文本行移动到下一行?我是SFML的新手,但我无法理解它。在过去的三个小时里,我试了大部分,但它换了一条新的线路,然后卡在了一条线路上,我什么也做不了。有什么想法吗?这是我的密码 #include <SFML/Graphics.hpp> #include <iostream> #include <string> int main(){ srand(time(0));

我想知道,当我超出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();
    }   
}
#包括
#包括
#包括
int main(){
srand(时间(0));
矢量2i屏幕尺寸(800600);
sf::RenderWindow窗口(sf::VideoMode(screenDimensions.x,screenDimensions.y),“我的第一个SFML游戏”);
sf::纹理和纹理;
精灵玩家形象;
如果(!pTexture.loadFromFile(“Player.png”))
setTitle(“无法加载播放器图像!”);
playerImage.setTexture(pTexture);
sf::字体;
如果(!font.loadFromFile(“Sitka.ttc”))
setTitle(“Oops!”);
sf::字符串;
sf::文本(字符串,字体,40);
setColor(sf::Color(44127255));
text.setStyle(sf::text::Bold | sf::text::下划线);
while(window.isOpen())
{
sf::事件;
while(window.pollEvent(事件)){
开关(事件类型)
{
案例sf::事件::已结束:
window.close();
打破
案例sf::事件::按键:
if(event.key.code==sf::Keyboard::Escape){
window.close();
打破
案例sf::事件::文本输入:
如果(event.text.unicode>=32&&event.text.unicode 0)
erase(string.getSize()-1,1);
text.setString(字符串);
如果(text.getLocalBounds().width>800){
如果(event.text.unicode>=32&&event.text.unicode 0)
erase(string.getSize()-1,1);
}
}
}
}
窗口。绘制(文本);
window.display();
window.clear();
}   
}
您的问题是“sf::String::clear()”会删除整个字符串。但您只想删除字符串的最后一个字符

为此,std::string(和sf::string)有一个成员函数“erase()”。
使用erase,您只需从字符串中删除一个字符。您想删除最后一个字符,它位于“string.getSize()-1”位置,所以只需将行“string.clear();”更改为“string.erase(string.getSize()-1)”,所有操作都会正常进行。

问题

调用字符串清除消息时,将删除所有字符串字符,从而删除您创建的新行。因此,在输入一行后,您实际上是在重复此过程。这就是为什么它似乎“卡在”同一条线上

解决方案

如果希望保持所需的效果(清除原始行并移动到下一行),只需跟踪行号并每次输入新行数即可

代码:

int行号(0);
//....

如果(event.text.unicode>=32&&event.text.unicode),这不是我要问的。我要问的是,当光标超出屏幕宽度的全局界限时,如何将光标移动到下一行。像这样;文本在感叹号处超出全局界限!到达感叹号后,新行从这里开始
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);
}