LibGDX输入模块之鼠标、触摸屏及键盘

libgdx支持的主要输入设备是桌面/浏览器上的鼠标,Android上的触摸屏以及键盘。 我们来看看libgdx如何抽象这些输入设备。

键盘

键盘通过生成用于按下和释放键的事件来指示用户输入了哪个键。 每个事件带有一个键代码,用于标识被按下/释放的键。 这些密钥代码在平台之间有所不同。 Libgdx尝试通过提供自己的密钥代码表来隐藏这个差异性,参见Keys (source) 类了解更多。 您可以通过轮询查询当前正在被按下的键。

Key-codes alone do not give us information about which character the user actually entered. This information is often derived from the state of multiple keys, e.g. the character 'A' is generated by the keys 'a' and 'shift' being pressed simultaneously. In general, deriving characters from the keyboard's state (which keys are down) is non-trivial. Thankfully, the operating system usually has a means to hook up an event listener that not only reports key-code events (key pressed/key released), but also characters. Libgdx uses this mechanism under the hood to provide you with character information. See Event Handling.

鼠标和触摸屏

鼠标和触摸输入允许用户指向屏幕上的东西。 两个输入机制将相互作用的位置报告为相对于屏幕左上角的2D坐标,正x轴指向右侧,y轴指向下方。

鼠标输入附带附加信息,即哪个按钮被按下。 大多数鼠标都有一个左键和一个鼠标右键以及一个鼠标中键。 此外,通常有一个滚轮可用于许多应用中的缩放或滚动。

触摸输入不具有按钮的概念,并且由于硬件的差异性导致监听多点触摸变得复杂。 第一代Android手机只支持单触。 从摩托罗拉Droid手机开始,多点触控成为大多数Android手机的标准功能。

触摸在不同的设备上有完全不同的实现方式,这关系到指针索引的指定和释放以及触发事件的方式,确保用尽可能多的设备来测试你的控制方案是否可行,市面上也有 很多的输入测试应用程序,它可以帮忙确定特定的设备如何处理触摸事件,并帮助设计一种在多设备上运行的控制方案。

LibGDX统一处理鼠标和触摸事件,对于鼠标事件,LibGDX会把它看做是一种特殊的触摸事件,它只有一个手指被跟踪,处理报告坐标外,它还会上报是是左键还是右键被按下了,对于触摸输入,我们支持跟踪多个手指(指针),并报告所有事件的按键是鼠标左键。

注意,在Android系统中,坐标系统相对于纵向或横向模式,取决于您为应用程序设置的内容。
鼠标事件或者触摸事件都可以被轮训polled 或者通过事件进行监听Event Handling

接触点

获得正确的世界坐标的接触点或鼠标光标要转换原屏幕坐标与摄像机在世界坐标。下面是一个简单的例子。

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, not 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);
    }
}

//TODO 待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容