本教程介绍如何访问全局输入设备:键盘、鼠标和操纵杆。这不能与事件混淆。实时输入允许您随时查询键盘、鼠标和操纵杆的全局状态(“当前是否按下此按钮?”,“鼠标当前在哪里?”)当事件发生时通知您(“此按钮已按下”,“鼠标已移动”)。
提供对键盘状态访问的类是sf::keyboard。它只包含一个功能isKeyPressed,用于检查按键(按下或释放)的当前状态。它是一个静态函数,所以您不需要实例化sf::Keyboard来使用它。
此函数直接读取键盘状态,忽略窗口的焦点状态。这意味着即使您的窗口处于非活动状态,isKeyPressed也可能返回true。
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
// left key is pressed: move our character
character.move(1.f, 0.f);
}
键代码在sf::Keyboard::Key枚举中定义。
根据您的操作系统和键盘布局,某些键代码可能丢失或解释不正确。这将在SFML的未来版本中得到改进。
提供对鼠标状态的访问的类是sf::Mouse。与它的朋友sf::Keyboard一样, sf::Mouse只包含静态函数,不打算被实例化(SFML目前只处理一个鼠标)。
您可以检查按钮是否按下:
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
// left mouse button is pressed: shoot
gun.fire();
}
鼠标按钮代码在sf::Mouse::Button enum中定义。SFML最多支持5个按钮:左、右、中(轮子)和两个附加按钮。
您还可以获取并设置鼠标相对于桌面或窗口的当前位置:
sf::Vector2i globalPosition = sf::Mouse::getPosition();
// get the local mouse position (relative to a window)
sf::Vector2i localPosition = sf::Mouse::getPosition(window); // window is a sf::Window
// set the mouse position globally (relative to the desktop)
sf::Mouse::setPosition(sf::Vector2i(10, 50));
// set the mouse position locally (relative to a window)
sf::Mouse::setPosition(sf::Vector2i(10, 50), window); // window is a sf::Window
没有读取鼠标滚轮当前状态的功能。由于车轮只能相对移动,因此没有可查询的绝对状态。通过看一个键,你可以判断它是被按下还是被释放。通过观察鼠标光标,您可以知道它在屏幕上的位置。然而,看着鼠标滚轮并不能告诉你它在哪个“滴答”上。您只能在它移动时收到通知(MouseWheelScrolled事件)。
有关操作杆这里省略,需要请自查。