跳转至内容

跨平台游戏编程与gameplay3d/获取输入

来自维基教科书,开放世界中的开放书籍

在你的gameplay3d游戏中处理输入很容易 - gameplay::Game 类,你的游戏从中继承,包含多个virtual方法,这些方法在每次有输入需要处理时被调用,所以你所需要做的就是在你的游戏中重写这些方法。

当发生鼠标事件时,Game::mouseEvent()被调用。mouseEvent()方法的函数签名如下:

virtual bool mouseEvent(Mouse::MouseEvent evt, int x, int y, int wheelDelta);

其中

  • evt代表发生的鼠标事件,是Mouse.h中定义的以下enum值之一:
    • MOUSE_PRESS_LEFT_BUTTON
    • MOUSE_RELEASE_LEFT_BUTTON
    • MOUSE_PRESS_MIDDLE_BUTTON
    • MOUSE_RELEASE_MIDDLE_BUTTON
    • MOUSE_PRESS_RIGHT_BUTTON
    • MOUSE_RELEASE_RIGHT_BUTTON
    • MOUSE_MOVE
    • MOUSE_WHEEL
  • x是鼠标在像素中的x位置。 (左边缘为零。)
  • y是鼠标在像素中的y位置。 (上边缘为零。)
  • wheelDelta是鼠标滚轮刻度的数量。 (正数为向上/向前,负数为向下/向后。)

未被消耗的鼠标事件将被解释为触摸事件。你可以通过重写Game::mouseEvent()并返回true来消耗鼠标事件。这让你可以选择从触摸事件中唯一地处理鼠标事件。Game::mouseEvent()默认返回false。

请注意,一些移动设备可以使用蓝牙鼠标。

你可以使用Game::setMouseCaptured()方法启用或禁用“鼠标捕获”,该方法接受布尔值作为参数。在支持鼠标的平台上,当启用鼠标捕获时,平台光标将被隐藏,鼠标将被扭曲到屏幕中心。在启用鼠标捕获期间,所有鼠标移动事件将被作为增量而不是绝对位置传递。

Game::setCursorVisible(),也接受布尔值,可以用来显示(true)或隐藏(false)鼠标光标。

当发生键盘事件时,Game::keyEvent()被调用。keyEvent()方法的函数签名如下:

virtual void keyEvent(Keyboard::KeyEvent evt, int key);

其中

  • evt代表发生的键盘事件,是Keyboard.h中定义的以下枚举值之一:
    • KEY_PRESS
    • KEY_RELEASE
    • KEY_CHAR - 这用于文本字符,因此不会因按下CtrlShift、箭头键、HomeEnd等键而触发。
  • key - 如果evtKEY_PRESSKEY_RELEASE,那么key就是来自Keyboard::Key的键码。如果evtKEY_CHAR,那么key就是字符的unicode值。

Keyboard::Key枚举中不同键码的完整列表可以在页面(gameplay3d API 参考)或Keyboard.h源文件中找到。

你可以调用Game::displayKeyboard(),它接受一个布尔值,用来显示(true)或隐藏(false)支持它的平台的虚拟键盘。

当发生触摸事件时,Game::touchEvent()被调用。touchEvent()方法的函数签名如下:

virtual void touchEvent(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex);

其中

  • evt代表发生的触摸事件,是Touch.h中定义的以下枚举值之一:
    • TOUCH_PRESS
    • TOUCH_RELEASE
    • TOUCH_MOVE
  • x是触摸在像素中的x位置。 (左边缘为零。)
  • y是触摸在像素中的y位置。 (上边缘为零。)
  • contactIndex用于区分启用多点触控时的多个触摸点,表示多个触摸点的发生顺序,从零开始。但是,不要假设contactIndex值是连续的。

一些平台可能允许你在屏幕边界之外触摸,所以负xy值是可能的。

你可以使用Game::setMultiTouch()启用多点触控,它接受布尔值。默认情况下禁用(false)。

一些平台支持手势。Game::isGestureSupported()可以用来确定哪些手势受支持。

你可以检查的手势在Gesture.h中的GestureEvent枚举中定义,如下所示:

  • GESTURE_TAP
  • GESTURE_SWIPE
  • GESTURE_PINCH
  • GESTURE_LONG_TAP
  • GESTURE_DRAG
  • GESTURE_DROP
  • GESTURE_ANY_SUPPORTED

Game::registerGesture(),它接受GestureEvent值作为参数,用来注册一种手势。

注册手势后,你将通过以下虚拟方法接收回调。有关参数的详细信息,请参见Game.h中的函数声明:

virtual void gestureTapEvent(int x, int y);
virtual void gestureSwipeEvent(int x, int y, int direction);
virtual void gesturePinchEvent(int x, int y, float scale);
virtual void gestureLongTapEvent(int x, int y, float duration);
virtual void gestureDragEvent(int x, int y);
virtual void gestureDropEvent(int x, int y);

游戏手柄

[编辑 | 编辑源代码]

加速度计

[编辑 | 编辑源代码]
华夏公益教科书