简介

因为libGDX的跨屏台性,我们需要兼顾很多平台的输入方式。比如说电脑桌面端和网页端是用键盘(Keyboard)和鼠标(Mouse)来输入,而Android端是用屏幕来点触的。libGDX对这些点触和鼠标点击等操作进行了抽象。但这样也有许多不同的地方,Android端的支持多点触控,电脑端支持鼠标左键、中键、右键、滚轮等点击事件。

用法

我们有两种方法来检测这个键或者操作是否成功,在libGDX中我们获取某个“按键”的值的方法都是通过 Input.Keys.[key] 来获取的

直接检测

在libGDX中,我们可以直接检测这个键是否被按下,如

   // 检查A键是否被按下boolean isPressed = Gdx.input.isKeyPressed(Input.Keys.A);

但是这么做会导致判断不够精准,因为按键分为两步,是按下和松开,这种方法只能检测你是否按了这个键。

创建监听器 listener

我们通过实现 InputProcessor这个类或者直接重写InputAdapter的方法来实现监听器的功能

API如下

依次介绍一下

keyDown()——当键被按下时调用此方法

keyTyped()——同上监听键的作用一致

keyUp()——当键被松开时调用此方法

mouseMoved()——鼠标移动时调用此方法

scrolled()——当滑动鼠标滚轮时调用此方法

touchDown()——当鼠标左键按下或手按到屏幕上时调用此方法

touchDragged()——当鼠标按住并拖动或手按住屏幕并拖动时调用此方法

touchUp()——当鼠标左键松开或手松开屏幕时调用此方法

示例代码如下

public void userInput(){//当按下键时,只调用一次Gdx.input.setInputProcessor(new InputAdapter(){@Overridepublic boolean keyDown(int key) {if (key == Input.Keys.A || key == Input.Keys.LEFT){if (dinasour.getX() > 125f){dinasour.setX(dinasour.getX()-125f);}}if (key == Input.Keys.D || key == Input.Keys.RIGHT){if (dinasour.getX() < Gdx.graphics.getWidth() - 125f){dinasour.setX(dinasour.getX()+125f);}}//暂停菜单if (key == Input.Keys.ESCAPE){if (!dialogShow){dialog.show(game.stage);dialogShow = true;}else {dialog.hide();dialogShow = false;}}return super.keyDown(key);}@Overridepublic boolean touchDown(int screenX, int screenY, int pointer, int button) {if (screenX<VIEW_WIDTH/2 && screenY>32*2){if (dinasour.getX() > 125f){dinasour.setX(dinasour.getX()-125f);}}if (screenX>VIEW_WIDTH/2 && screenY>32*2){if (dinasour.getX() < Gdx.graphics.getWidth() - 125f){dinasour.setX(dinasour.getX()+125f);}}return super.touchDown(screenX, screenY, pointer, button);}});}

这段代码的功能是按下A键、小键盘旁边的键或是鼠标左键点击屏幕左半边,dinasour会向左移动;按下D键、小键盘旁边的键或是鼠标左键点击屏幕右半边,dinasour会向右移动;按下ESC键可以打开游戏内的暂停菜单

顺便贴上官网wiki的示例代码:

public class SimplerTouchTest extends ApplicationAdapter implements InputProcessor {// we will use 32px/unit in worldpublic final static float SCALE = 32f;public final static float INV_SCALE = 1.f/SCALE;// this is our "target" resolution, note that the window can be any size, it is not bound to this onepublic final static float VP_WIDTH = 1280 * INV_SCALE;public final static float VP_HEIGHT = 720 * INV_SCALE;private OrthographicCamera camera;private ExtendViewport viewport;     private ShapeRenderer shapes;@Override public void create () {camera = new OrthographicCamera();// pick a viewport that suits your thing, ExtendViewport is a good startviewport = new ExtendViewport(VP_WIDTH, VP_HEIGHT, camera);// ShapeRenderer so we can see our touch pointshapes = new ShapeRenderer();Gdx.input.setInputProcessor(this);}@Override public void render () {Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);shapes.setProjectionMatrix(camera.combined);shapes.begin(ShapeRenderer.ShapeType.Filled);shapes.circle(tp.x, tp.y, 0.25f, 16);shapes.end();}Vector3 tp = new Vector3();boolean dragging;@Override public boolean mouseMoved (int screenX, int screenY) {// we can also handle mouse movement without anything pressed
//      camera.unproject(tp.set(screenX, screenY, 0));return false;}@Override public boolean touchDown (int screenX, int screenY, int pointer, int button) {// ignore if its not left mouse button or first touch pointerif (button != Input.Buttons.LEFT || pointer > 0) return false;camera.unproject(tp.set(screenX, screenY, 0));dragging = true;return true;}@Override public boolean touchDragged (int screenX, int screenY, int pointer) {if (!dragging) return false;camera.unproject(tp.set(screenX, screenY, 0));return true;}@Override public boolean touchUp (int screenX, int screenY, int pointer, int button) {if (button != Input.Buttons.LEFT || pointer > 0) return false;camera.unproject(tp.set(screenX, screenY, 0));dragging = false;return true;}@Override public void resize (int width, int height) {// viewport must be updated for it to work properlyviewport.update(width, height, true);}@Override public void dispose () {// disposable stuff must be disposedshapes.dispose();}@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 scrolled (int amount) {return false;}public static void main (String[] arg) {LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();config.width = 1280;config.height = 720;config.useHDPI = true;new LwjglApplication(new SimplerTouchTest(), config);}
}

官网示例代码中,我们点击鼠标左键可以在点击处创建一个白色的圆,并且鼠标按住左键还可以根据鼠标的位置进行移动。

libGDX学习之路04:Input Handling输入处理相关推荐

  1. Docker学习之路04:创建定制Nginx镜像

    Docker学习之路04:创建定制Nginx镜像 Docker学习路线传送门: Docker学习之路01:Docker的安装 Docker学习之路02:阿里云镜像加速器 Docker学习之路03:Do ...

  2. H5学习之路之Input类型新特性

    input的输入类型在H5之前已经有很多很广泛的使用了,但是H5其实加入了很多新的属性和验证,提供方便的同时给我们开发带来了更多的是安全性的提升,今天我们就简单的说一下H5中新的input属性和用法. ...

  3. Python学习之路day03——008用户输入input()方法

    用户输入 1.input()函数(或方法)的工作原理 input()函数是,让程序暂停运行,等待用户输入数据(文本以及其他信息),然后根据内容进行下一步运行: print('please type s ...

  4. libGDX学习之路02:利用Tiled绘制游戏地图

    简介 开始做游戏之后,我们免不了得先画一个游戏地图出来,可是这个地图怎么做呢.libGDX官方也给我们推荐了一个2D地图制作工具--Tiled 贴上官网 Tiled | Flexible level ...

  5. libGDX学习之路01(续):把libGDX项目部署到iOS

    前言 libGDX是一个非常强大的框架,我在写下libGDX入门那篇文章的时候,没能成功解决把libGDX项目部署到iOS设备上并运行,在我查了很多资料和反复实验中,我总结了一些经验,希望能帮到大家. ...

  6. Docker学习之路02:阿里云镜像加速器

    阿里云镜像加速器 Docker学习路线传送门: Docker学习之路01:Docker的安装 Docker学习之路02:阿里云镜像加速器 Docker学习之路03:Docker的常用命令 Docker ...

  7. Docker学习之路05:五分钟用docker compose搭建一个自己的个人博客网站!

    五分钟用docker compose搭建一个自己的个人博客网站! Docker学习路线传送门: Docker学习之路01:Docker的安装 Docker学习之路02:阿里云镜像加速器 Docker学 ...

  8. 强化学习入坑之路04

    强化学习入坑之路04 今天继续强化学习的学习,这些内容的学习主要参考了李宏毅的强化学习教程,在此基础上加入了个人的理解和总结.好,废话少说下面开始进入正题. 1.Q-learning(DQN) Sta ...

  9. QT学习之路(一)ubuntu 18.04的Qt Creator在线安装

    文章目录 前言 一.准备工作 二.安装步骤 参考链接 前言 Qt是嵌入式开发的必备工具之一,在Linux下安装尤其重要. Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率. ...

最新文章

  1. Linux中断处理驱动程序编写【转】
  2. 最长上升子序列之基础
  3. 函数作为变量,类型---golang
  4. cordova自定义android插件,Cordova 自定义插件(Android版本)
  5. python字典和集合对象可以进行索引操作_python字典和列表的高级应用
  6. java获取tomcat启动时间不对_部署在Tomcat 服务器中的web应用读取时间与系统时间不一致问题...
  7. 理解JS散度(Jensen–Shannon divergence)
  8. ASLD 高级固体激光器设计及仿真软件
  9. linux启动tomcat后,浏览器访问不到
  10. GPS误差分析及DGPS
  11. SRM 597div2 1K
  12. CocosCreator H5 微信内置浏览器调起微信支付
  13. 【算法】传教士和野人问题
  14. VB 数据库交互(二)——经典五实例总结
  15. 明日方舟抽卡模拟器wiki_明日方舟抽卡模拟器
  16. STM8L学习笔记-GPIO端口操作(一)
  17. 【前端必备项目】品优购商城前端
  18. 黑客攻防从入门到精通 第7章及后文
  19. php 当地天气预报,基于PHP的全国天气预报接口查询
  20. Windows7下 Cygwin 离线安装教程

热门文章

  1. 一些具非常有用源代码分享(百度指数破解(最新版),NDIS实现类似P2P终结者功能代码,GOOGLE在线翻译等等)
  2. win7 驱动默认路径
  3. 小知识-关于表达式的副作用与逗号表达式
  4. 摘自迅雷视频网站基于CSS+HTML实现大气清新的蓝色导航
  5. 5.1.2 运输层的两个重要协议
  6. 五百年前王阳明的优秀读后感作文2100字
  7. Windows之外的非主流操作系统Top10
  8. html获取页面控件,HTML控件ID和NAME属性及在CS页面获得.ASPX页面中HTML控件的值
  9. c语言 在txt文件中搜索关键词_请输入搜索关键字
  10. translator