libGDX提供了6个模块允许你去访问目标系统的各个部分,这些模块对于你来说是非常棒的,作为开发者你可以通过一套单一的API在多个平台上实现相同的效果。这显得非常强大,因为你可以专注于当前应用程序本身,而不必担心其他平台带来一些的麻烦,例如bug调试非常困难。这一切将因一套简单的API而变得极为容易。它被分为6个逻辑模块,可通过Gdx类进行全局访问。
【注意】libGDX允许你为不同的目标平台创建特定的代码逻辑。例如,你可以增加桌面游戏的复杂度,因为桌面系统拥有比移动设备更强大的计算能力。
应用模块(The application module)
应用模块可以通过Gdx.app访问。它允许你访问日志工具、通过一个方法关闭当前应用、数据持久化存储、查询Android设备的API版本、查询目标平台类型、查询内存使用状态等。
libGDX自带日志工具,你可以选择一个日志等级去过滤打印到控制台的日志。默认日志等级为LOG_INFO,你可以预先指定一个日志等级或通过以下代码动态地改变日志等级
Gdx.app.setLogLevel(Application.LOG_DEBUG);
有以下几种可用的日志等级 :
• LOG_NONE : 不会打印任何日志,日志功能被禁用
• LOG_ERROR : 仅打印错误日志
• LOG_INFO : 打印错误和信息日志
• LOG_DEBUG : 打印错误,信息,调试日志
通过以下方式,可以打印一个信息,调试,错误日志到控制台 :
Gdx.app.log("MyDemoTag", "This is an info log."); Gdx.app.debug("MyDemoTag", "This is a debug log."); Gdx.app.error("MyDemoTag", "This is an error log.");
优雅地退出应用
你可以告知libGDX退出当前应用程序,框架将会以正确的顺序停止并释放掉所有其占用的内存资源和Java原生堆栈,通过以下代码可以执行该操作 :
Gdx.app.exit();
【注意】当你要退出当前应用的时候请务必使用以上方法,否则,将会有内存泄露的风险,在移动设备上,内存泄漏将带来最大的负面影响将导致其资源被限制。在Android设备上,它将会在一段时间之后调用pause()和dispose()函数,而不是立刻结束应用。
保存数据
如果想在应用退出前保存你的数据,你应该使用Preferences类,它仅仅是一个字典或者Hash Map数据结构,在一个文件中存储了若干键值对.如果该配置文件不存在,libGDX将会新建一个。你可以通过创建多个配置文件对数据进行分类,你可以通过文件名得到一个Preferences实例 :
Preferences prefs = Gdx.app.getPreferences("settings.prefs");
每个键(key)和值(value)都是一对一映射关系,如果当前键已存在于preferences文件中,新的键将会覆盖旧的键。最后,请不要忘记调用flush():
prefs.putInteger("sound_volume", 100); prefs.flush();
【注意】存储数据到preferences文件要比写入数据到内存花费更多的时间,因此,最好在调用flush()前保存数据。
要从preferences文件读取某一个值,你需要知道对应的键,如果该键不存在,将会返回一个默认的值。你可以通过第二个参数选择性的传递一个默认值 :
int soundVolume = prefs.getInteger("sound_volume", 50);
查询Android API版本
对于Android,你可以查询到Android API版本,这将允许你在不同版本的Android系统上处理不同的逻辑,通过以下方法查询到Andorid版本 :
Gdx.app.getVersion();
【注意】除Android平台以外,其他平台返回值均为0
查询平台类型
如果你想编写特定平台的代码,你必须要知道当前平台的类型,以下代码向你展示了如何查询平台类型 :
switch (Gdx.app.getType()) { case Desktop: break; case Android: break; case WebGL: break; case iOS: break; default: // 未知平台 break; }
查询内存使用
你可以查询到当前应用所占用的系统内存,这有助于你避免内存过度分配(可能导致应用崩溃),以下函数可以返回相应堆使用的内存(单位:byte)。
long memUsageJavaHeap = Gdx.app.getJavaHeap(); long memUsageNativeHeap = Gdx.app.getNativeHeap();
多线程
当我们的游戏被创建,libGDX将会创建一个单独的线程叫做主循环线程(Main Loop Thread),OpenGL上下文将依赖于该线程,所有的事件处理和渲染都发生在该线程中而不是UI线程,因此要从其它线程传递一个值到渲染线程,一般使用Application.postRunnable(),这些代码将会于渲染线程的下一帧在Runnable方法中被运行,代码如下:
Gdx.app.postRunnable(new Runnable() { @Override public void run() { //do something } });
图形模块(The graphics module)
图形模块可以通过Gdx.getGraphics()或Gdx.graphics进行访问。
查询delta time
查询libGDX当前帧与上一帧的时间跨度(单位:秒),可以通过以下方式实现 :
Gdx.graphics.getDeltaTime()
查询显示区域大小
查询设备的显示区域大小并返回一个像素值 :
int width - Gdx.graphics.getWidth(); int height = Gdx.graphics.getHeight();
查询每秒帧数(the frames per second,FPS)
libGDX内置一个FPS计数器,可通过以下方式访问 :
Gdx.graphics.getFramesPerSecond()
音频模块(The audio module)
音频模块可以通过Gdx.getAudio()或Gdx.audio进行访问
音效播放
加载音效可通过调用Gdx.audio.newSound()实现。
libGDX支持播放的文件格式有WAV,MP3和OGG。然而,iOS平台并不支持OGG。每个音效文件大小不得超过1MB,音效应该是一段短暂的声音,例如子弹射击或爆炸,所以限制其大小是合理的。
音乐流
对于音乐播放,可通过调用Gdx.audio.newMusic()实现,被支持的文件格式有WAV,MP3和OGG。同样,iOS目前仅支持前两种。
输入模块(The input module)
输入模块可以通过Gdx.getInput()或Gdx.input访问。
为了正确的接收和处理输入事件,你必须实现InputProcessor接口,并设置其作为libGDX全局的输入事件处理器,通过以下方式即可实现 :
Gdx.input.setInputProcessor();
读取键盘/触屏/鼠标的输入事件
屏幕的原点位于左上角,查询屏幕坐标系中的某个坐标值(x,y),通过Gdx.input.getX()或Gdx.input.getY()实现,此外,还有以下几种不同的条件:
• 判断屏幕是否被手指或鼠标触碰,可调用Gdx.input.isTouched()。
• 判断鼠标按钮是否被点击,可调用 Gdx.input.isButtonPressed()。
• 判断键盘是够被点击,可调用Gdx.input.isKeyPressed()。
查询加速度计
查询加速度计x轴方向的值,可调用Gdx.input.getAccelerometerX(),同理,查询y轴和z轴方向的值分别调用Gdx.input.getAccelerometerY()和Gdx.input.getAccelerometerZ()。由于桌面端不具备加速度计所以其返回值为0.
启用和停止震动
在Android平台,你可以通过调用Gdx.input.vibrate()使设备震动,可通过调用Gdx.input.cancelVibrate()停止震动。
拦截Aandroid软键盘事件
你可能想要拦截Andorid的软键盘事件,并添加一些额外的代码逻辑。如果你想要拦截返回键,可调用Gdx.input.setCatchBackKey(true)。如果你想要拦截菜单键,可调用Gdx.input.setCatchBackKey(true)。
在桌面端,你拥有一个鼠标指针,你可以告诉libGDX去拦截它,在当前窗口内你可以获得一个持续的鼠标事件,通过Gdx.input.setCursorCatched(true)即可可以拦截鼠标光标。
文件模块(The files module)
文件模块可以通过Gdx.getFiles()或Gdx.files访问。
获取一个内部文件句柄
你可以通过调用Gdx.files.internal()获得一个内部文件句柄,在Android和WebGL平台上,文件句柄关联assets文件夹,在桌面端,其关联root文件夹。
获取一个外部文件句柄
你可以通过调用Gdx.files.external()获得一个外部文件句柄,在Aandroid平台,外部文件关联SD卡,在桌面端外部文件关联用户文件夹,请记住在该功能在WebGL端不可用。
网络模块(The network module)
你可以通过Gdx.getNet()或Gdx.net访问网络模块。
HTTP请求
你可以通过调用Gdx.net.sendHttpRequest()和Gdx.net.cancelHttpRequest()发送和取消一个HTTP请求。
客户端/浏览器套接字(Client/Server Sockets)
你可以通过调用Gdx.net.newClientSocket()或Gdx.net.newServerSocket()创建客户端/浏览器套接字
在浏览器中打开URI
调用 Gdx.net.openURI(URI)可以在默认浏览器中打开一个URI
【完】
不错 又过了遍大纲。了解到些新东西