9.2.2、Libgdx的输入处理之事件处理

(官网:www.libgdx.cn

事件处理可以更加准确的获取用户的输入。事件处理提供了一种可以通过用户接口进行交互的方法。比如按下、释放一个按钮。

输入处理

事件处理通过观察者模式来完成。首先,需要实现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 mouseMoved (int x, int y) {
return false;
}
@Override
public boolean scrolled (int amount) {
return false;
}
}

前三个方法允许你监听键盘事件:

  • keyDown():当一个按键按下时触发。返回key code,查阅点击
  • keyUp():当一个按键释放时触发。返回key code。
  • keyTyped():当一个Unicode字符通过键盘输入获得时生成。

接下来的三个方法报告鼠标或触摸事件:

  • touchDown():当手指按到屏幕上时或鼠标按下时触发该事件。报告坐标、指针索引和鼠标按键(触摸操作默认左键)。
  • touchUp():当手机从屏幕释放或者鼠标释放时调用。报告最后的坐标、指针索引和鼠标按键(触摸默认左键)。
  • touchDragged():当手指在屏幕上拖动或鼠标在屏幕上拖动时触发该事件。返回坐标和指针索引。鼠标按键将不会返回。
  • mouseMoved():当鼠标在屏幕上移动并没有按键按下时触发。这个方法仅仅适用于桌面环境。
  • scrolled():鼠标滑轮滚动时触发。返回1或-1。不能在触摸屏中触发。

每个方法返回一个布尔类型。我将在之后解释原因。

一旦你自己实现InputProcessor接口,你必须告诉Libgdx:

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

这样的话,所有的输入事件都会放到MyInputProcessor实例中。在ApplicationListener.render()之前调用。

InputAdapter

InputAdapter实现了InputProcessor接口,并在每个方法中返回false。你可以对InputAdapter进行扩展。这样,你就可以实现你需要的方法。你同样可以使用一个匿名类。

Gdx.input.setInputProcessor(new InputAdapter () {
public boolean touchDown (int x, int y, int pointer, int button) {
// 你的代码
return true;
}

public boolean touchUp (int x, int y, int pointer, int button) {
// 你的代码
return true;
}
});

InputMultiplexer

有时,你需要控制InputProcessor。比如应用UI线程优先,输入事件处理次之。你可以通过InputMultiplexer类来实现:

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

InputMultiplexer将会处理第一个添加的InputProcessor的所有的新的事件。如果这个InputProcessor返回false。将会处理下一个InputProcessor。

持续输入处理实例

如果你向通过Input Processor移动一个actor,你需要注意的是之后在按下后才会处理,要想持续处理输入,或者移动精灵,你可以添加一个flag到你的actor中。

public class Bob
{
boolean leftMove;
boolean rightMove;
...
updateMotion()
{
if (leftMove)
{
x -= 5 * Gdx.graphics.getDeltaTime();
}
if (rightMove)
{
x += 5 * Gdx.graphics.getDeltaTime();
}
}
...
public void setLeftMove(boolean t)
{
if(rightMove && t) rightMove = false;
leftMove = t;
}
public void setRightMove(boolean t)
{
if(leftMove && t) leftMove = false;
rightMove = t;
}

接下来,如下处理:

...
@Override
public boolean keyDown(int keycode)
{
switch (keycode)
{
case Keys.LEFT:
bob.setLeftMove(true);
break;
case Keys.RIGHT:
bob.setRightMove(true);
break;
}
return true;
}
@Override
public boolean keyUp(int keycode)
{
switch (keycode)
{
case Keys.LEFT:
bob.setLeftMove(false);
break;
case Keys.RIGHT:
bob.setRightMove(false);
break;
}
return true;
}

www.libgdx.cn版权所有,如需转载,注明出处)

时间: 2024-10-30 14:09:22

9.2.2、Libgdx的输入处理之事件处理的相关文章

9.2、Libgdx的输入处理之鼠标、触摸和键盘

(官网:www.libgdx.cn) Libgdx支持的最主要的设备是desktop或浏览器的鼠标支持,Android的触摸屏支持和键盘的支持.我们接下来了解一下. 键盘 用户按下或释放一个按键生成了相应的事件.每个事件包含了一个 key-code来识别是哪个按键按下或释放.这些key-code在不同的平台是不同的.Libgdx要做的就是隐藏不同系统之前的差别.可以查阅Keys类.你可以通过轮询来判断是哪个键被按下. 单独的key-code不能告诉我们用户输入了什么.这通常是组合键造成这种困扰,

9、Libgdx的输入处理

(官网:www.libgdx.cn) 不同的平台有着不同的输入方式.桌面用户可以通过键盘和鼠标与应用进行交互,基于浏览器的游戏也是这样.在Android中,鼠标被触摸屏所替代,通常没有实体键盘.Android设备有加速度计和罗盘等传感器. Libgdx抽象了所有的这些输入设备.鼠标和触摸屏被视为同一类型,并且支持多点触摸. 取决于不同的输入设备,可以使用轮询的方式来监听状态,或者通过注册一个监听. 所有的输入设备通过Input模块访问: // 判断键盘A是否被按下. boolean isPres

9.1、Libgdx的输入处理的配置和查询

(官网:www.libgdx.cn) 有时判断是否支持输入设备是必要的.通常你的游戏不需要支持所有的输入设备.比如你可能不需要加速度计或者罗盘.这时我们需要禁用这些设备保持电量.接下来将教你怎样做. 禁用加速度计和罗盘(Android) 在执行AndroidApplication.initialize()方法之前,可以只用AndroidApplicationConfiguration类来设置一些参数,包括配置输入设备. 假设我们的游戏不需要加速度计和罗盘,我们可以禁用这些设备: public c

集成 Struts、Tiles 和 JavaServer Faces

server 内容:JSF 简介为什么将这三者集成为一体?将 Struts 和 JSF 与 Struts-Faces 集成将Struts 应用程序移植到 JSF集成 Struts-Faces 和 Tiles 的挑战到目前为止所作的改变参考资料 作者简介对本文的评价相关内容:Struts, an open-source MVC implementationStruts and Tiles aid component-based developmentUI development with Java

Linux input子系统编程、分析与模板

输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系统也支持自动创建设备文件,这些文件采用阻塞的IO读写方式,被创建在"/dev/input/"下.如下图所示.内核中的输入子系统自底向上分为设备驱动层,输入核心层,事件处理层.由于每种输入的设备上报的事件都各有不同,所以为了应用层能够很好识别上报的事件,内核中也为应用层封装了标准的接口来描述

第八章 Libgdx输入处理(3)输入设备

Android游戏开发群:290051794 Libgdx游戏开发框架交流群:261954621      简介 在Android中,Libgdx支持的主要输入设备为触摸屏和键盘.由于现在大部分Android设备不再配备键盘,所以这里我们只讨论触摸屏. 触摸操作 触摸输入机制可以确定你的点击的屏幕的位置,屏幕的左上角为原点.X轴指向右边,y轴指向屏幕下边. 触摸没有按钮的概念.依靠硬件的支持可以同时响应多个触摸操作.第一代的Android手机仅仅支持单点触摸.从Motorola Droid开始,

第八章 Libgdx输入处理(1)

Android游戏开发群:290051794Libgdx游戏开发框架交流群:261954621    在Android中,输入设备通常为触摸屏.有的Android通常会有加速度计或罗盘. Libgdx将所有的不同的输入设备抽象化.只不过不同的输入设备或许会有不同的方法. 根据不同的输入设备,可以检测设备的状态,或者注册一个监听器按时间顺序接收输入事件. 所有的输入设备都是通过输入模块实现:  // 检查是否按键A被按下 boolean isPressed = Gdx.input.isKeyPre

第八章 Libgdx输入处理(4)手势捕获

Android游戏开发群:290051794 Libgdx游戏开发框架交流群:261954621   触摸屏非常适合手势输入.一个手势可以是通过两个手指来变焦,点击,双击或长按等等. Libgdx提供了GestureDetector类来检测以下动作: 1.  点击:用户触摸屏幕.当一个点击被注册后,手指不要远离初始位置太远. 2.  滑动:用户在屏幕上滑动,并释放. 3.  变焦:用两个手指在屏幕上实现放大缩小. 4.  Pinch:类似于变焦.但有些不同. 5.  一个GestureDetec

第八章 Libgdx输入处理(8)振动器

Android游戏开发群:290051794 Libgdx游戏开发框架交流群:261954621   虽然这不是严格的输入设备,只不过是一个外设而已.我们认为它属于输入模型. 振动器允许你震动手机,这通常可以用于游戏控制器中. 在Android中使用振动器需要申请相关权限: android.permission.VIBRATE. 如下: Gdx.input.vibrate(2000); 上句的2000相当于2秒. 更复杂的模式可以通过第二个vibrate()方法实现: Gdx.input.vib