c++ - 在 SFML 中超出窗口边界时将光标发送到新行?

标签 c++ newline 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.getSize() - 1);” 一切正常。

关于c++ - 在 SFML 中超出窗口边界时将光标发送到新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29308057/

相关文章:

C++函数原型(prototype)?

c++ - 如何重载下标运算符以允许角色扮演角色数组?

c++ - 将对象引用转换为 STL 迭代器

c - 如何使用 fgets 在不包含换行符的情况下从输入中获取字符串?

php - 反转 PHP file() 函数

c++ - 在类(class)中如何访问类(class)成员指向的地址?

c++ - 为什么在 C++ 中的容器中存储引用(不是指针)不起作用?

c - snprintf() 只读到换行符?

c++ - SFML TCP 套接字发送导致滞后峰值

c++ - 一旦达到每个值就执行 C++