事件处理(Event Handling)

事件处理,能够让您按时间顺序获得更准确更全面的用户输入的信息。当特定的输入序列比较重要的时候,事件处理利用用户界面提供了一种方法来实现的,如按下按钮,松开按钮,表示用户点击了一次按钮。这种互动是很难用轮询来实现的。

输入处理器(Input Processor)

事件处理是用观察者模式来实现的。首先,我们需要实现监听接口叫做InputProcessor:

public class MyInputProcessor implements InputProcessor {
   @Override
   public boolean keyDown (int keycode) {
      return false;
   }

   @Override
   public boolean keyUp (int keycode) {
      return false;
   }

   @Override
   public boolean keyTyped (char character) {
      return false;
   }

   @Override
   public boolean touchDown (int x, int y, int pointer, int button) {
      return false;
   }

   @Override
   public boolean touchUp (int x, int y, int pointer, int button) {
      return false;
   }

   @Override
   public boolean touchDragged (int x, int y, int pointer) {
      return false;
   }

   @Override
   public boolean touchMoved (int x, int y) {
      return false;
   }

   @Override
   public boolean scrolled (int amount) {
      return false;
   }
}

前三个方法使你能够监听键盘的事件:

  • keyDown():当有按键被按下的时候会调用这个方法,返回一个按键的代码,代码看这里
  • keyUp():当有键盘松起的时候会调用这个方法,返回同上的按键代码。
  • keyTyped(): 当用键盘输入一个Unicode字符的时候会调用这个方法。可以用来实现文本区域和类似的用户界面元素。

 

接下去的方法用来返回鼠标/触摸事件:

  • touchDown(): 当有一个手指碰到触摸屏或者鼠标点击的时候调用这个方法。返回触摸点对应指针的XY坐标,指针的索引号,或者鼠标点击的按键(对触摸屏来说一般来说是左键)。
  • touchUp(): 当有一个手指离开屏幕或者鼠标键松开时会调用该方法。返回最后接触的XY坐标,索引号,鼠标键。
  • touchDragged(): 当手指在屏幕上滑动,或者鼠标按键按下然后移动时会调用该方法。返回坐标和指针索引。但是在滑动的时候有多个按键按下的时候,这些按键不会被返回。你可以使用Gdx.input.isButtonPressed()来检查一个特定的按键状态。
  • touchMoved(): 当鼠标在按键按下并移动的时候触发该方法。事件只会在桌面程序上触发,对于有触碰的设备你需要使用上面的那个方法。
  • scrolled(): 当鼠标滚轮滚动的时候触发这个方法。返回-1或1表示滚动的方向。这个方法在触屏设备上也不会被调用。

 

以上的所有方法都是返回boolean类型的。我们可以通过下面的章节来了解InputMultiplexer (输入调制器)。

当你实现了自己的输入处理器(InputProcessor)的时候,你必须告诉libgdx,这样才能在有输入事件发生时使用你的处理器来处理:

MyInputProcessor inputProcessor = new MyInputProcessor();
Gdx.input.setInputProcessor(inputProcessor);

像如上设置好之后,所有的新输入事件都会被放到这个MyInputProcessor实例中来处理。事件会在渲染线程调用ApplicationListener.render()前被分配妥。

输入调制器(InputMultiplexer)

有时候你会需要把多个事件处理器(InputProcessor)串联起来,你有一个处理器来处理界面的事件,然后有第二个处理器来处理游戏中的输入事件。那么你可以使用InputMultiplexer 来这样实现:

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(new MyUiInputProcessor());
multiplexer.addProcessor(new MyGameInputProcessor());
Gdx.input.setInputProcessor(multiplexer);

这个输入调制器(InputMultiplexer)会把捕捉到的事件放到第一个处理器中处理。如果处理器返回的结果是false,表示处理器不能处理这个输入事件,那么调制器会把事件传给下一个处理器处理。通过这个机制,MyUiInputProcessor就可以把所有widgets上发生的事件处理掉,并把其他事件传给MyGameInputProcessor。

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

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