简介

轮询(polling)是用来检查输入设备的当前状态,比如:一个特定的按键按下,或者一个手指在屏幕的触摸位置。这是一个快速简便的方法用来处理用户的输入,并且足以满足大多数街机游戏。

注意:如果你依赖于轮询(polling)时,你可能会错过事件,比如快节奏的按下向上键/向下键。如果您需要保证输入动作序列的完整性,那就需要使用事件处理(event handling),而不是使用轮询。

 

轮询键盘状态

简单的代码就能取到键盘的状态,如下。

boolean isAPressed = Gdx.input.isKeyPressed(Keys.A);

这个方法的参数很简单,就是传一个Key的代码。你不必记住这些Key内包含的代码,可以从输入接口的静态类里查到。

 

轮询触摸屏/鼠标

这里有不少方法涉及到轮询触摸屏/鼠标。要检查是否有一个或多个手指在屏幕上(相当于鼠标按钮被按下)目前可以通过以下方法做到:

boolean isTouched = Gdx.input.isTouched();

对于多点触控的屏幕,你需要注意哪个手指(指针)当前在屏幕上:

// Will Return whether the screen is currently touched
boolean firstFingerTouching = Gdx.input.isTouched(0);
boolean secondFingerTouching = Gdx.input.isTouched(1);
boolean thirdFingerTouching = Gdx.input.isTouched(2);

每个手指碰到屏幕的时候会得到一个指针索引。第一个手指触碰的时候得到索引0,第二个得到1,以此类推。如果一个手指离开屏幕然后又触碰屏幕,但其他手指还在屏幕上,这个时候这个手指会得到一个最小且空闲的索引。举例:

//第一个手指按下 -> 0
//第二个手指按下 -> 1
//第三个手指按下 -> 2
//第二个手指抬起 -> 这个时候 1 这个索引被释放了
//第一个手指抬起 -> 0 也被释放了,现在只有索引 2 还在使用
//又有一个手指按下 -> 0,因为 0 是第一个空闲的索引

在桌面或者浏览器上,你只能有一个手指来处理。

如果你想要查询用户是否按下并抬起手指,你可以用以下方法:

// Will return whether the screen has just been touched
boolean justTouched = Gdx.input.justTouched();

这个可以在这种情况下使用,你要查询快速按下和抬起这套动作,比如在屏幕上说:“点击屏幕继续”。注意,这不是一种可靠的方法,因为它是基于轮询的。

 

为了得到一个特定的手指的坐标,你可以使用下列方法:

int firstX = Gdx.input.getX();
int firstY = Gdx.input.getY();
int secondX = Gdx.input.getX(1);
int secondY = Gdx.input.getY(1);

这样我们可以得到指针索引0(0为默认值)和指针索引1的触摸坐标。在一个相对于屏幕的坐标系统坐标。原点(0,0)在屏幕的左上角,x轴向右,y轴向下。

 

鼠标按键

在桌面上你可以查询是否鼠标被点击:

boolean leftPressed = Gdx.input.isButtonPressed(Input.Buttons.LEFT);
boolean rightPressed = Gdx.input.isButtonPressed(Input.Buttons.RIGHT);

以下是常量按键类:

/** Mouse buttons.
* @author mzechner */
public class Buttons {
      public static final int LEFT = 0;
      public static final int RIGHT = 1;
      public static final int MIDDLE = 2;
}

请注意,在Android上,我们只能模拟鼠标左键。任何触摸事件将被解释为用鼠标左键按下按钮发出。因为触摸屏显然不具有左,右和中间键的概念。

好吧,本来本文想把事件处理也讲完,但篇幅已经有点长了,就下次讲了。

欢迎转载,请保留出处:爱撸小杰

libgdx跨平台游戏引擎介绍之Input