libgdx 启动者(个人翻译,还请指教)类和配置
2014-07-19 01:00
155 查看
本文章翻译自libGDX官方wiki,,转载请注明出处:http://blog.csdn.net/kent_todo/article/details/37942047libGDX官方网址:http://libgdx.badlogicgames.com/libGDX源码:https://github.com/libgdx/libgdx
libGDX支持的平台:
对于每一个目标平台,都必须有一个启动者类。这个类实例化了一个后期指定的Application实现,并且实例化了一个ApplicationListener,它实现了应用的逻辑。启动者类是与平台相关的,让我们来看一看怎么样来实例化和配置他们。
这篇文章假设你已经掌握了程序创建,运行和调试,并且已经导入了核心、桌面、Android和HTML5的工程到Eclipse当中。
关于libGDX程序的创建、运行和调试会在以后的博文中进行介绍,或者直接到官网查看相关文档。
Desktop(LWJGL) 桌面游戏
lwjgl简介:
打开在my-gdx-game中的Main.java类可以看到如下内容:
package com.me.mygdxgame; 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 = "my-gdx-game"; cfg.useGL30 = false; cfg.width = 480; cfg.height = 320; new LwjglApplication(new MyGdxGame(), cfg); } }
首先,一个LwjglApplicationConfigration被实例化。这儿类指定了多种组态设定,比如初始化的屏幕分辨率,是否使用OpenGL ES 1.X或者2.0和更多。
当这个配置对象被设置之后,一个LwjglApplication被实例化。MyGdxGame()类是实现了游戏逻辑的ApplicationListener;
这样一个窗口就被创建出来了,并且ApplicationListener会被像在有关生命周期的介绍中那样被调用。
Android(安卓)
Android应用不使用main(0方法作为进入点,但是它需要一个Activity作为起始点。打开my-gdx-game-android中的MainAcitivity.java类会看到:
package com.me.mygdxgame; 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(); cfg.useGL20 = false; initialize(new MyGdxGame(), cfg); } }
游戏的主要的起始点是Acitivity中的onCreate()函数。注意MainAcitivity继承自AndroidApplication,而AndroidApplication又继承自Acitivity.跟桌面程序中一样,一个配置对象将被实例化(AndroidApplicationConfiguration)。只要配置完成,AndroidApplication.initalize()方法就会被调用,传递了一个ApplicationListener(即MyGdxGame)和配置参数对象。
Android应用程序能够有不同的Acitivity。但是libGDX游戏应该只有一个Acitivity。游戏的不同场景在libGDX内部实现,跟分开的Acitivity是不一样的。这样做的原因是因为创建一个新的Acitivity也意味着创建了一个县的OpenGL上下文,这是耗时的,并且意味着所有的图像资源都要被重新加载。
基于Fragement的libGDX
Android sdk提供了控制屏幕特殊部分的api,它可以再多屏幕上简单的使用。这个api就是Fragement api。libgdx也能够在一个大屏幕当中的一部分进行显示运行,前提是使用fragement。要创建一个libgdx fragement,要使用到子类:AndroidFragementApplication并且实现方法onCreateView(),比如:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Plane plane = (Plane) getArguments().get(ARGS_PLANE); return initializeForView(new MyGdxGame()); }
AndroidManifest.xml 文件
除了AndroidApplicationConfiguration之外,一个Android应用程序也通过AndroidManifest.xml文件来进行配置,在Android工程的根目录下能够找到这个文件。文件的内容大致如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.me.mygdxgame" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="15" /> <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>
目标SDK版本
指定targetSdkVersion一个大于等于3的值是很重要的,如果这个应用程序要支持运行在高于Android1.5的系统上。如果这个属性没有设置的话,更高的Android版本将会用来运行程序。绘制区域的分辨率将会比实际屏幕的分辨率低,这是很糟糕的。
屏幕方向&配置改变
除了targetSdkVersion, screenOrientation和configChanges这两个属性也应该设置。
screenOrientation属性指定了应用程序的确定的屏幕方法, 如果应用程序能够在水平和竖直方法上都能正常运行,那么这个属性就可以不设置。
configeChanges属性很重要,它总是应该有值,即被设置。如果省略了这个属性,那就意味着每次物理键盘弹出或隐藏或者屏幕方向改变的时候,应用程序都将重新启动。如果screenOrientation属性被忽略了,libgdx程序会收到ApplicationListener.resize()的调用来指出屏幕的改变。从而相应的重新布局显示的内容。
Permissions(权限)
如果应用程序要向外部存储空间(比如sd卡)中写入数据、使用网络,使用振动器或者想录音的话,下面的权限就需要被加入到AndroidManifest.xml文件中:
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.VIBRATE"/>
用户可能会经常对许多权限有所顾虑,所以请慎重的选择使用。
为了从锁定状态中唤醒,AndroidApplicationConfiguration.useWakeLock需要被设置成true(源码默认设置成false);
如果游戏不需要使用加速计或者指南针的话,我们建议将AndroidApplicationConfiguration中的useAccelerometer和useCompass变量设置成false;(源码中这两个变量默认为true)
Live Wallpapers(动态壁纸)
libGDX提供了一个创建Android动态壁纸的简单的方式。一个动态壁纸的启动类叫做AndroidLiveWallpaperService,下面是一个例子:
package com.mypackage; // imports snipped for brevity public class LiveWallpaper extends AndroidLiveWallpaperService { @Override public ApplicationListener createListener () { return new MyApplicationListener(); } @Override public AndroidApplicationConfiguration createConfig () { return new AndroidApplicationConfiguration(); } @Override public void offsetChange (ApplicationListener listener, float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) { Gdx.app.log("LiveWallpaper", "offset changed: " + xOffset + ", " + yOffset); } }
createListener()和createConfig()这两个方法将会在动态壁纸显示或者在Home界面创建的时候被调用。
offsetChange()方法在用户在Home界面上滑动屏幕(切换屏幕)的时候调用,它告诉你当前屏幕和中介屏幕的偏移量。这个方法会在渲染线程中被调用,所以你不用考虑去同步任何东西。
除了一个启动类,你还必须要创建一个xml文件来描述你的壁纸。我们给它起一个名字叫livewallpaper.xml。在你的Android工程中的res文件夹下面创建一个叫做xml的文件夹,然后在里面创建一个livewallpaper.xml的文件,文件中的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail="@drawable/ic_launcher" android:description="@string/description" android:settingsActivity="com.mypackage.LivewallpaperSettings"/>
这个定义了你的动态壁纸在手机上显示的缩略图,如果你在Android系统中设置当前壁纸为你的应用程序壁纸,那么上面的description和Acitivity就会被显示出来。这个Activity就是一个标准的Activity,它可以有一些动态的效果,比如北京颜色的改变等等。你可以再SharedPreferences中储存这些设置,以后通过Gdx.app.getPreferences()来加载存储的数据。
最后,你需要向AndroidManifest.xml文件中添加东西,下面是一个包含一个简单Activity的动态壁纸的例子:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mypackage" android:versionCode="1" android:versionName="1.0" android:installLocation="preferExternal"> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14"/> <uses-feature android:name="android.software.live_wallpaper" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".LivewallpaperSettings" android:label="Livewallpaper Settings"/> <service android:name=".LiveWallpaper" android:label="@string/app_name" android:icon="@drawable/icon" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/livewallpaper" /> </service> </application> </manifest>
上面的manifest文件定义了:
1.它使用了动态壁纸特征,关于<uses-feature>这个属性,请阅读这篇博文:http://blog.csdn.net/kent_todo/article/details/37956957
2.一个运行绑定壁纸的权限。
3.设置的acitivity。
4.动态壁纸服务,在livewallper.xml文件中指定。
目前,动态壁纸只支持Android2.1(api level 7) 以上系统。
这样构建出来的动态壁纸在触摸输入上有一定的局限性。一般情况下,只有点击和滑动事件能够被响应。如果你想响应所有的触摸事件,你可以看看AndroidApplicationConfiguration#getTouchEventsForLiveWallpaper属性,设置成true来接收所有多种的触摸事件。
Daydreams(白日梦)
Tips:Daydreams是Android自4.2的新特性,它提供了在手机处于闲置状态时更加丰富的用户交互体验,即在屏幕锁定时动态显示一些内容,并且能够与用户进行交互。
从Android4.2开始,用户可以设置Daydreams,它会在设备处于闲置或者停驻状态下显示出来。这些daydreams和屏幕保护程序很相似,能够显示像相册一类的东西。libgdx可以让你更加方便的写一个这样的daydream。
Daydream的启动类叫做AndroidDaydream,下面是一个例子:
package com.badlogic.gdx.tests.android; import android.annotation.TargetApi; import android.util.Log; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.badlogic.gdx.backends.android.AndroidDaydream; import com.badlogic.gdx.tests.MeshShaderTest; @TargetApi(17) public class Daydream extends AndroidDaydream { @Override public void onAttachedToWindow() { super.onAttachedToWindow(); setInteractive(false); AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration(); cfg.useGL20 = true; ApplicationListener app = new MeshShaderTest(); initialize(app, cfg); } }
简单的继承自AndroidDaydream,重写onAttachedToWindow,设置你的配置参数和ApplicationListener并且实例化你的daydream。
除了daydream自身,你额可以提供一个设置界面(一个Acitivity)来让用户设置你的daydream。这可以使一个普通的Acitivity,或者一个libGDX的AndroidApplication。这里用一个空的Acitivity作为例子:
package com.badlogic.gdx.tests.android; import android.app.Activity; public class DaydreamSettings extends Activity { }
这个设置界面必须作为metadata属性设置在Daydream service中。在res/xml目录下创建一个xml文件,然后指定:
<dream xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.badlogic.gdx.tests.android/.DaydreamSettings" />
最后,在AndroidManifest.xml文件中添加设置界面的相关声明和一个service的描述。比如:
<service android:name=".Daydream" android:label="@string/app_name" android:icon="@drawable/icon" android:exported="true"> <intent-filter> <action android:name="android.service.dreams.DreamService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.service.dream" android:resource="@xml/daydream" /> </service>
关于IOS上的文档暂时不翻译
相关文章推荐
- Google Guide:Test Your App (个人翻译,请多指教)
- [Struts2官方指南的个人学习和翻译] Struts2的配置文件
- [Struts2官方指南的个人学习和翻译] Struts2的配置元素-管理元素
- [Struts2官方指南的个人学习和翻译] Struts2的配置元素-请求处理元素
- J2EE开发环境配置个人总结
- J2ME in a Nutshell(翻译版) :第二章 连接有限设备配置CLDC,2.1.2安全特性
- TomCat配置文件翻译
- 关于XML配置使用的个人感觉
- J2ME in a Nutshell(翻译版) :第二章 连接有限设备配置CLDC,2.1.1虚拟机和语言特性
- Web界面配置Tomcat连接池---我得一点个人心得
- NHibernate文档翻译 第2章---- ISessionFactory配置
- Java font.properties 配置文件(中文/翻译中。。。)
- 经典教程翻译系列: Mach-II应用程序配置指南
- Firefox:备份个人配置
- shark工作流引擎核心配置[翻译]
- 21天学会c++(英汉对照,个人翻译,水平有限,供参考)-------第2天
- 个人翻译Beyond the C++ Standard Library
- J2ME in a Nutshell(翻译版):第二章 连接有限设备配置(CLDC)2.1
- 关于XML配置使用的个人感觉
- shark工作流引擎核心配置[翻译]