sfml - 等到不再按下键
sfml - wait until key no longer pressed
我试图在按下某个键时增加 var,
但有一个问题。
当我按住那把钥匙时,它会继续前进,增加我的号码(当然直到我释放钥匙)。
我不希望每次按下都只添加一个,即使我按住它也是如此。
这是我的代码:
#include <SFML/Graphics.hpp>
#include <string>
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "-\\-(Game)-//-");
sf::Style::Resize;
int Selected = 1;
std::string s = std::to_string(Selected);
window.setSize(sf::Vector2u(800, 600));
sf::Font font;
font.loadFromFile("DIMITRI_.TTF");
sf::Event event;
sf::Text Bplay("Play", font);
Bplay.setCharacterSize(60);
Bplay.setStyle(sf::Text::Underlined);
Bplay.setPosition(50, 300);
sf::Text Boption("Settings", font);
Boption.setCharacterSize(60);
Boption.setPosition(50, 400);
sf::Text Ttitle1(s, font);
Ttitle1.setCharacterSize(150);
Ttitle1.setPosition(250, 50);
sf::Text Ttitle2("Vault", font);
Ttitle2.setCharacterSize(160);
Ttitle2.setPosition(250, 200);
while (window.isOpen())
{
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
Selected++;
std::string s = std::to_string(Selected);
Ttitle1.setString(s);
}
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::Black);
window.draw(Bplay);
window.draw(Boption);
window.draw(Ttitle1);
window.draw(Ttitle2);
window.display();
}
return 0;
}
感谢所有帮助。
创建一个变量,如果用户按下或释放某个键,该变量将保持不变
bool onKeyHold = false;
所以算法是:
- 检测他是否按下了某个键。
- 如果是,检查
onKeyHold
是否为假(如果他拿着钥匙,你不想递增)
如果是这样,递增 Selected
然后使 onKeyHold
为真
检测他是否松开按键。如果是这样,使 onKeyHold
为假。
如果你把它们放在代码中,它将是:
bool onKeyHold = false; //create a variable that will hold if user press or release a key
while (window.pollEvent(event))
{
if ( event.type == sf::Event::KeyPressed ) check if user pressed a key
{ //if so
if ( !onKeyHold ) // check if onKeyHold is false
{ //if so
Selected++; // increment
}
onKeyHold = true; // make onKeyHold true
}
else if ( event.type == sf::Event::KeyReleased ) // check if user released a key
{ // if so
onKeyHold = false; // make onKeyHold false
}
}
编辑:
不要忘记检查密钥是否为 sf::Keyboard::Up
,否则这将适用于 SFML 中可用的每个密钥。
逻辑是:
只有当用户按下了你想要的键时,你才会递增。
如果用户按下一个键,你检查 onKeyHold
是否为假(用户没有按住任何键),如果那是假的,那意味着你只是按下了一个键而你没有按住它,因为如果你按住了一个键它将触发按键事件。因此,如果您不检查 onKeyHold
是否为假,那么每次触发按键时都会增加 Selected
。
我试图在按下某个键时增加 var, 但有一个问题。 当我按住那把钥匙时,它会继续前进,增加我的号码(当然直到我释放钥匙)。 我不希望每次按下都只添加一个,即使我按住它也是如此。
这是我的代码:
#include <SFML/Graphics.hpp>
#include <string>
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "-\\-(Game)-//-");
sf::Style::Resize;
int Selected = 1;
std::string s = std::to_string(Selected);
window.setSize(sf::Vector2u(800, 600));
sf::Font font;
font.loadFromFile("DIMITRI_.TTF");
sf::Event event;
sf::Text Bplay("Play", font);
Bplay.setCharacterSize(60);
Bplay.setStyle(sf::Text::Underlined);
Bplay.setPosition(50, 300);
sf::Text Boption("Settings", font);
Boption.setCharacterSize(60);
Boption.setPosition(50, 400);
sf::Text Ttitle1(s, font);
Ttitle1.setCharacterSize(150);
Ttitle1.setPosition(250, 50);
sf::Text Ttitle2("Vault", font);
Ttitle2.setCharacterSize(160);
Ttitle2.setPosition(250, 200);
while (window.isOpen())
{
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
Selected++;
std::string s = std::to_string(Selected);
Ttitle1.setString(s);
}
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::Black);
window.draw(Bplay);
window.draw(Boption);
window.draw(Ttitle1);
window.draw(Ttitle2);
window.display();
}
return 0;
}
感谢所有帮助。
创建一个变量,如果用户按下或释放某个键,该变量将保持不变
bool onKeyHold = false;
所以算法是:
- 检测他是否按下了某个键。
- 如果是,检查
onKeyHold
是否为假(如果他拿着钥匙,你不想递增) 如果是这样,递增
Selected
然后使onKeyHold
为真检测他是否松开按键。如果是这样,使
onKeyHold
为假。
如果你把它们放在代码中,它将是:
bool onKeyHold = false; //create a variable that will hold if user press or release a key
while (window.pollEvent(event))
{
if ( event.type == sf::Event::KeyPressed ) check if user pressed a key
{ //if so
if ( !onKeyHold ) // check if onKeyHold is false
{ //if so
Selected++; // increment
}
onKeyHold = true; // make onKeyHold true
}
else if ( event.type == sf::Event::KeyReleased ) // check if user released a key
{ // if so
onKeyHold = false; // make onKeyHold false
}
}
编辑:
不要忘记检查密钥是否为 sf::Keyboard::Up
,否则这将适用于 SFML 中可用的每个密钥。
逻辑是:
只有当用户按下了你想要的键时,你才会递增。
如果用户按下一个键,你检查 onKeyHold
是否为假(用户没有按住任何键),如果那是假的,那意味着你只是按下了一个键而你没有按住它,因为如果你按住了一个键它将触发按键事件。因此,如果您不检查 onKeyHold
是否为假,那么每次触发按键时都会增加 Selected
。