在SFML中超过窗口边界时,将光标发送到新行

Sending the cursor to a new line when window boundaries are exceeded in SFML?

本文关键字:光标 新行 中超 SFML 窗口 边界      更新时间:2023-10-16

我想知道当我超过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);
}