我试图在SFML 2中使用获得SFML 2中的键输入
while (App.GetEvent(Event))
{
if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; }
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在SFML 2中做到这一点.
小智 17
如果您不需要担心实时键盘输入,可以使用与您提供的SFML 1.6代码非常相似的方法.在应用程序的事件处理循环中,您可以执行以下操作:
sf::Event event;
while (mWindow.pollEvent(event))
{
if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::Escape)
{
// Do something when Escape is pressed...
}
if (event.key.code == sf::Keyboard::W)
{
// Do something when W is pressed...
}
// And so on.
}
}
Run Code Online (Sandbox Code Playgroud)
当用户按下键时必须保证应用程序具有焦点时,这种类型的输入处理很好,否则不会生成键事件.当有问题的键很少被按下时,它也很棒.您可以在SFML 2.0教程中查看一个示例,该教程位于标题为"KeyPressed和KeyReleased事件"的部分下:http://sfml-dev.org/tutorials/2.0/window-events.php
另一方面,您实际上可能需要访问实时键盘输入.为此,请使用SFML 2.0的Keyboard类,如下所示:
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
// 'W' is currently pressed, do something...
}
Run Code Online (Sandbox Code Playgroud)
通过实时输入,您可以在该特定时间点访问输入设备的状态.这很方便,因为您不必将所有密钥检查都放在事件处理循环中.这种方法的一个缺点是,由于SFML只是读取键盘的状态,如果应用程序没有焦点,最小化等,您的事件处理代码仍然可以执行.您可以找到所有实时输入的教程这里:http://sfml-dev.org/tutorials/2.0/window-inputs.php
选择事件处理与实时方法时要小心.对于游戏示例,请考虑当用户按住空格键时角色发射机枪的情况.如果在事件处理循环中处理空格键,机枪将像半自动一样错误地触发,因为sf::Event::KeyPressed同一键的事件之间存在延迟,即使用户按住键也是如此.如果通过检查实时键盘输入来处理空格键,则机枪将按预期重复触发.
| 归档时间: |
|
| 查看次数: |
9450 次 |
| 最近记录: |