简介
因为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(){
@Override
public 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);
}
@Override
public 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 world
public 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 one
public 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 start
viewport = new ExtendViewport(VP_WIDTH, VP_HEIGHT, camera);
// ShapeRenderer so we can see our touch point
shapes = 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 pointer
if (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 properly
viewport.update(width, height, true);
}
@Override public void dispose () {
// disposable stuff must be disposed
shapes.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);
}
}
官网示例代码中,我们点击鼠标左键可以在点击处创建一个白色的圆,并且鼠标按住左键还可以根据鼠标的位置进行移动。