libGDX学习之路04:Input Handling输入处理

简介

因为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);
	}
}

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TDSSS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值