您的位置:首页 > 其它

libgdx游戏引擎教程(八) libgdx中的用户手势识别(一)附源码

2013-03-11 14:26 543 查看
转自:http://www.apkbus.com/android-58933-1-1.html

我们在第七讲的基础上做修改,第七讲源代码:


edu.nju.wsj.libgdx—old.rar(3.57
MB, 下载次数: 85)

2012-7-13 18:14 上传
点击文件名下载附件

下载积分: 下载豆 -2

本讲源代码下载:


edu.nju.wsj.libgdx.rar(3.57
MB, 下载次数: 103)

2012-7-13 18:10 上传
点击文件名下载附件

下载积分: 下载豆 -2

[align=left]按理今天应该是实战篇的第七讲,但是我昨天无意中想起了一个很有意思的东西,就是libgdx中的手势检测。游戏成功的很大一部分因素在于这个游戏能够激起用户持续玩的兴趣,并提供优异的交互体验。那么我们今天就来看一看Libgdx作为一个出色的游戏引擎,它是怎样实现手势识别的功能的。[/align]

Libgdx中提供了一个手势检测的类:GestureDetector

[align=left]ClassGestureDetector[/align]

[align=left]java.lang.Object[/align]
[align=left]|com.badlogic.gdx.InputAdapter[/align]
[align=left]|com.badlogic.gdx.input.GestureDetector[/align]

[align=left]All ImplementedInterfaces:[/align]
[align=left]InputProcessor[/align]

[align=left]可以看出GestureDetector实现了InputProcessor接口,为了更好地让大家理解其中的原理,这里我们先用一讲的篇幅首先介绍一下InputProcessor这个类,其实这个类我们一点也不陌生,只是在以往的教程中我并没有直接提出来罢了。先卖个关子,大家往下看就明白了。[/align]

[align=left]看一下官方文档中InputProcessor的说明:[/align]

[align=left]InterfaceInputProcessor[/align]

[align=left]All KnownImplementing Classes:[/align]
[align=left]GestureDetector, InputAdapter, InputMultiplexer, RemoteSender, Stage[/align]

[align=left]在这部分下面还有一句话:[/align]

“AnInputProcessor is used to receive input events from the keyboard and the touchscreen (mouse on the desktop). For this it has to be registered with the Input.setInputProcessor(InputProcessor) method. It will be called each frame before thecall
to ApplicationListener.render(). The methods return a boolean in case you want to write amultiplexing InputProcessor that has a chain of child processors that signalwhether they processed the event. TheInputMultiplexer
offers you exactly this functionality.”

[align=left]简单地说,InputProcessor就是用来接收用户的键盘和屏幕的输入事件的,我们在使用InputProcessor之前,换句话就是我们要让系统自动接收用户的键盘和屏幕的输入事件并让其做出相应响应的话,我们必须要调用[/align]

Gdx.input.setInputProcessor(InputProcessor);

复制代码
[align=left]这一语句。还记得我们在libgdx中添加舞台stage,并让舞台中的控件,如按钮能够接收触摸事件的时候我们是怎么做的吗?我们在Screen的show()函数中添加了以下语句[/align]

Gdx.input.setInputProcessor(stage);

复制代码
[align=left]我们再看看上面给出的InputProcessor的介绍:[/align]

[align=left]All KnownImplementing Classes:[/align]
[align=left]GestureDetector, InputAdapter, InputMultiplexer, RemoteSender, Stage[/align]

[align=left]这两句话告诉大家,[/align]
[align=left]GestureDetector,InputAdapter,InputMultiplexer,RemoteSender,Stage[/align]

[align=left]都直接实现了InputProcessor接口。[/align]

[align=left]这样大家就明白了吧?根据java的多态原则,舞台类Stage实现了InputProcessor接口,就可以把它看作InputProcessor实例,那么传入stage的引用就可以让stage接收用户触摸事件了。[/align]

Gdx.input.setInputProcessor(InputProcessor);

复制代码

那如果我们要让多个实现了InputProcessor的实例都接收用户的键盘和屏幕的输入事件该怎么办呢?很显然

Gdx.input.setInputProcessor(InputProcessor);

复制代码
[align=left]只将某一个实现了InputProcessor接口的实例传入,这样只有这一个实例可以接收用户的键盘和屏幕触摸事件,但我们有时候需要多个实例都同时接收到这些事件,比如我们有一个Screen(相信这个对于一直看我的教程的童鞋们应该不陌生吧),再之这个Screen里面有一个stage,两个都需要接收手势事件怎么办呢?我们首先可以让这个Screen实现InputProcessor接口,这样这个Screen就可以接收用户触摸和按键事件了,然后这里Libgdx提供了另外一个类:InputMutiPlexer,使用方法如下:[/align]

InputMultiplexer multiplexer = new InputMultiplexer();

multiplexer.addProcessor(new InputProcessor1());

multiplexer.addProcessor(new InputProcessor2());

Gdx.input.setInputProcessor(multiplexer);

复制代码
[align=left][/align]

[align=left]其中InputProcessor1,InputProcessor2是两个分别实现了InputProcessor的类,相信从上面的语句大家应该明白怎么做了,这里就不再赘述。[/align]

[align=left]其中我们第七讲中介绍了一种拦截按键事件的方法,就是在Screen的render()函数中不断调用Gdx.input.isKeyPressed()来判断按键事件,这个方法不是回调方法,因此从某种程度上来说是我们人为地接收了这个事件,这样比较麻烦,不够简便。这里我们将用InputProcessor拦截按钮事件,更重要的是,InputProcessor中的相应函数是回调函数,因此它会自动对按键和触摸事件做出相应,对我们开发者而言真是省心多了。这一讲的代码我们将第七讲中的代码做修改,改用InputProcessor来拦截按键事件。[/align]

[align=left]我们打开第七讲结束后的工程。[/align]



2012-7-13 18:02 上传
下载附件(45 KB)

[align=left]修改Progress.java,让Progress实现Screen,InputProcessor两个接口:[/align]

public class Progress implements Screen,InputProcessor

复制代码
[align=left]这里我们还可以做一个工作,添加一条语句[/align]

Gdx.input.setCatchBackKey(true);

复制代码
[align=left]在官方网站上的wiki中我们可以看到对这段语句的解释:“You will still receive key events if you have registered an InputProcessor, but the operating system will not close your application.”[/align]
也就是说,这条语句添加之后,Android系统就不会拦截到Back键按下的事件了,按下Back键Activity也就不会退出了

[align=left]还记得在第七讲中我是怎么实现同样的功能的吗?我重写了LibgdxActivity.java中的OnBackPressed(),使得Android系统本身不能接收到Back事件,那么在用了这个语句以后,我们就不用再重写OnBackPressed()了,为了证明这条语句的作用,我们将LibgdxActivity.java中的OnBackPressed()方法恢复成它本来的样子:[/align]

@Override

public void onBackPressed() {

// TODO Auto-generated method stub

super.onBackPressed();

}

复制代码
[align=left]我们再在MyGame.java的show()函数中添加[/align]

Gdx.input.setCatchBackKey(true);

复制代码
[align=left]这一语句,保证在程序画面一显示的时候(因为程序默认启动界面就是一个MyGame,按下该界面上的按钮后才跳转到Progress)就使得Android系统本身不能接收到Back事件。[/align]

[align=left]我们再修改Progress.java,把render()函数中的Back事件检测的代码删去,并将Back事件处理的代码放在Progress.java的OnKeyDown()函数内:[/align]

@Override

public boolean keyDown(int arg0) {

// TODO Auto-generated method stub

//这里还要检测一下按键的类型

if(arg0==Input.Keys.BACK){

System.out.println("Back Pressed");

activity.ag.setScreen(activity.mg);

stage.removeActor(animal);

}

return false;

}

复制代码
[align=left]当然还有一个非常非常非常重要的工作我们要做!!就是将实现了InputProcessor接口的Progress.java也调用Gdx.input.setInputProcessor语句,让Progress也能监听用户的触摸的按键事件,在Progress.java的show()函数末尾修改,修改前的代码是这样的:[/align]

[align=left][/align]

Gdx.input.setInputProcessor(stage);

复制代码
[align=left]我们修改成这样:[/align]

InputMultiplexer multiplexer = new InputMultiplexer();

multiplexer.addProcessor(this);

multiplexer.addProcessor(stage);

Gdx.input.setInputProcessor(multiplexer);

复制代码
[align=left]即让两者都能接收用户触摸和按键事件。[/align]

[align=left]这就算修改完成了,运行一下看看效果:[/align]



2012-7-13 18:02 上传
下载附件(49.99 KB)

[align=left]这个时候我们按下Back按钮,没有反映,程序不会退出,说明[/align]

Gdx.input.setCatchBackKey(true);

复制代码
这一语句确实拦截了Back按钮事件。这里说一句题外话,libgdx也可以用同样的方法拦截Menu按下的事件,方法极其类似:

Gdx.input.setCatchMenuKey(true);

复制代码
[align=left]然后我们点击按钮进入游戏页面:[/align]



2012-7-13 18:02 上传
下载附件(35.63 KB)

[align=left]再按下Back键,游戏界面退出,回到主页面,说明我们的代码是有效的。[/align]

这样我们这一讲对InputProcessor这个Libgdx中非常重要的事件监听接口有了一个大概的介绍,更多的东西还是希望大家能在libgdx的实际开发中自己摸索自己总结,这样才能有长足的进步。下一讲我们将正式进入libgdx的GestureDetector,也就是用户手势检测部分的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐