启动类指定了libGDX应用程序的入口。每个目标平台都有特定的启动类,通常,这些类都非常简单,仅几行代码用于设置一些参数并应用于平台。你可以把它们看作每个平台的启动顺序(bootup sequence),当一个启动执行完成,libGDX框架将通过调用实现了ApplicationListener接口的MyDemo类的方法,从启动类(例如demo-desktop项目)转移到你被共享的应用程序代码(例如demo/demo-core项目),请记住,MyDemo类是被共享的应用程序代码的起点。
现在,我们就一起来看看在每个项目设置过程中生成的启动类
在桌面上运行demo应用程序
桌面应用程序的启动类叫做Main.java,以下代码清单来自于demo-desktop项目的Main.java :
package com.packtpub.libgdx.demo;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
public class Main {
public static void main(String[] args) {
LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
cfg.title = "demo";
cfg.width = 480;
cfg.height = 320;
new LwjglApplication(new MyDemo(), cfg);
}
}
在上面的代码清代中,你可以看到Main.class是一个非常普通的Java类,它并没有实现任何接口或继承其他类,相反,一个LwjglApplication类的实例被创建,该类提供了几个可选择的构造函数。在这里,我们传入MyDemo类的实例作为第一个参数,LwjglApplicationConfiguration类的实例作为第二个参数(可选)。配置类允许你设置libGDX桌面应用所有可配置的参数,在这里,我们将窗口标题设置为demo,并将窗口的宽和高分别设置为480和320像素。
以上便是你要为启动类做的所有编写和配置,现在,让我们运行应用程序。在Project Explorer中的demo-desktop项目上右击,然后选择Run As菜单中的Java Application选项,Eclipse可能会要求你选择主类,这时候,直接选择Main class(包名为 com.packtpub.libgdx.demo),然后点击OK按钮 :
如果你使用的Gradle构建工具,桌面应用的启动类的名称为DesktopLauncher.java,包名为com.packtpub.libgdx.demo.desktop
桌面应用现在应该已经在你的电脑上运行,如果你使用的是Windows,运行截图如下 :
若使用Gradle构建工具,截图如下 :
在Android上运行demo项目
Android应用的启动类叫做MainActivity.java,基于Gradle构建工具的启动类叫做AndroidLauncher.java。
以下代码来自于demo-android的MainActivity.java :
package com.packtpub.libgdx.demo; import android.os.Bundle; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; public class MainActivity extends AndroidApplication { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration(); initialize(new MyDemo(), cfg); } }
可以看到,MainActivity类继承于AndroidApplication类,libGDX对该类进行了任务封装,例如创建一个所谓的Activity去处理触屏输入事件,读取传感器数据等。你需要做的是创建一个实现了ApplicationListener接口的类的实例,在这里,MyDemo类的实例充当了这个角色,MyDemo类和AndroidApplicationConfiguration类的实例作为参数传值给initialize()方法。
如果你对Android开发硬件统计感兴趣,你可以参考Android开发者网站的仪表盘(http://developer.android.com/about/dashboards/index.html#OpenGL)
下图是2016年9月,OpenGL的状态截图 :
libGDX默认支持的OpenGL版本为2.0,其最大的好处就是可以使用无二次幂限制纹理(NPOT Texture)——图片的宽和高不需要满足2^n,例如32x32, 512x512,和128x1024。
【注意】NPOT纹理不保证适用于所有的设备,例如,Nexus One忽略了NPOT纹理,此外,在某些硬件上它可能导致性能损耗,所以尽量避免使用这个特性,在第4章,收集资源中,你将学会到一个概念叫做Texture Atlas,它允许你在非GLES2环境下使用任意尺寸的图片。
此外,对于Android系统,你必须关注一个清单文件,它用于指定Android应用程序的一些参数配置,如果你不了解Android的清单文件,可以阅读官方文档http://developer.android.com/guide/topics/manifest/manifest-intro.html
以下是demo-android项目的Android Manifest.xml代码清单 :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.packtpub.libgdx.demo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19"/> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:configChanges="keyboard|keyboardHidden| orientation"> <intent-filter> <action android:name="android.intent.action. MAIN"/> <category android:name="android. intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
使用API 8在这里可能出现一个错误 :
这是因为API 8不支持screenSize值,去掉即可。想了解更多android:configChanges元素以及其他元素可以访问http://developer.android.com/guide/topics/manifest/activity-element.html
以下是一些常用的清单文件元素 :
• minSdkVersion :这是应用程序支持的最低API版本,如果设备的Android版本低于minSdkVersion,应用程序将无法在该设备正常运行
• targetSdkVersion :targetSdkVersion 是 Android 系统提供前向兼容的主要手段。这是什么意思呢?随着 Android 系统的升级,某个系统的 API 或者模块的行为可能会发生改变,但是为了保证老APK的行为还是和以前兼容。只要 APK 的 targetSdkVersion不变,即使这个APK安装在新 Android 系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的前向兼容性。如果没有指定,其值等于minSdkVersion
• icon :应用程序图标
• name :主类名称,对于libDGX而言,它指定了启动类名称
• label :应用程序名称
• screenOrientation :设备屏幕方向,常用的值为portrait(竖屏)和landscape(横屏)
清单文件另外一个关键作用是指定应用权限,应用被安装的时候会向用户发出权限请求。
【注意】请确保不要请求不必要的权限并在应用商店的表述中写清权限信息,因为当用户看到一个权限清单时会觉得很可疑,并不是所有人都知道权限的具体用途。
更多关于Android权限的介绍和使用何以查看官方文档http://developer.android.com/guide/topics/security/permissions.html
现在,让我们在真正的物理设备上运行Android项目,首先请确保你的Amdroid手机通过USB来连接到电脑并打开调试模式。然后,在demo-android项目上右击,选择Run As菜单下的Android Application。
Android应用需要花费一点时间编译并安装到你的手机上,以下截图是一个运行在HTC设备上的应用程序 :
由于Android模拟器性能非常的差,所以尽量使用真机调试,而不是在模拟器上调试libGDX应用!
在支持WebGL的网页浏览器上运行demo应用程序
WebGL应用程序的启动内叫做GwtLauncher.java,以下代码来自于demo-html的GwtLauncher.java :
package com.packtpub.libgdx.demo.client; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.backends.gwt.GwtApplication; import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration; import com.packtpub.libgdx.demo.MyDemo; public class GwtLauncher extends GwtApplication { @Override public GwtApplicationConfiguration getConfig() { GwtApplicationConfiguration cfg = new GwtApplicationConfiguration(800, 480); return cfg; } @Override public ApplicationListener getApplicationListener() { return new MyDemo(); } }
通过以上代码,可以看到GwtLauncher类继承了GwtApplication类,libGDX封装了GWT,你只需要实现两个抽象方法:getConfig()和getApplicationListener()。getConfig()方法返回一个GwtApplicationConfiguration类的实例,在这里,直接通过构造函数设置窗口的宽和高。getApplicationListener()方法返回一个ApplicationListener接口实现类的实例,在这里,返回了一个MyDemo类的实例。
此外,GWT被组织到一个集成了所有配置信息的模块当中,这个模块叫做MyDemo.gwt.xml,它指定了GWT关联Java资源文件的路径,在这里为com/packtpub/libgdx/demo,这些资源文件将被GWT交叉编译成高质量的JavaScript代码,可以直接在浏览器上运行。
以下是MyDemo.gwt.xml的代码清单 :
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit trunk//EN" "http://google-web- toolkit.googlecode.com/svn/trunk/distro-source/core/src/gwt-module.dtd"> <module> <source path="com/packtpub/libgdx/demo"/> </module>
现在让我们尝试去运行应用程序,在demo-html项目上右击,选择Run As菜单下的Web Application,一个标题为Development Mode的标签将在IDE的底部打开,双击下面的地址跳即可在默认浏览器中打开 :
请记住,在运行WebGL应用的时候Eclipse将默认使用调试模式,这意味着你的应用程序将运行的及其缓慢,解决该问题有两个方法:使用GWT Super Dev Mode或部署项目到本地服务器。
在项目成功运行之前,你可能需要为你的浏览器安装Google Web Toolkit Developer插件 :
插件成功安装后,应用即可正常运行 :
如果你想将你的应用部署到服务器并通过互联网分享给其他人,你需要将的项目编译打包,这个过程非常简单,在demo-html项目上右击依次选择Google->GWT Compile,如下图 :
一个标题为GWT Compile的窗口将被打开,在这里,你可以选择日志信息层级,保持默认支持,点击Compile开发编译打包:
编译时间比较漫长,本书截图中,在Intel Core i7 (3.4GHz)的处理器上编译超过了两分钟 :
编译完成后,war文件夹结构如下 :
现在可以该文件夹下的所有内容(除WEB-INF文件夹)上传到你的web服务器上,并在任何支持WebGL的浏览器上访问并运行它!
【完】
【译者注】
• 目前libGDX支持的GWT SDK版本为2.6.0(亲测支持2.6.1),所以你必须下载并使用对应的GWT版本,GWT SDK下载地址:http://www.gwtproject.org/versions.html
• 关于GWT Super Dev Mode的使用,可以参考Mario的博客:http://www.badlogicgames.com/wordpress/?p=3073
• 由于RoboVM无法使用,故翻译省略了iOS部分,想了解如何在iOS上运行可以参考这篇文章: https://doc.multi-os-engine.org/multi-os-engine/9_game/1_libgdx/libgdx.html
希望继续更新哦
希望讲解一下书中的游戏代码呀,感觉有点不懂。他定义了好多类和变量