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