zoukankan      html  css  js  c++  java
  • libgdx 启动者(个人翻译,还请不吝赐教)类和配置

    本文章翻译自libGDX官方wiki,。转载请注明出处:http://blog.csdn.net/kent_todo/article/details/37942047
    libGDX支持的平台:

    对于每个目标平台,都必须有一个启动者类。

    这个类实例化了一个后期指定的Application实现,而且实例化了一个ApplicationListener,它实现了应用的逻辑。启动者类是与平台相关的,让我们来看一看怎么样来实例化和配置他们。

    这篇文章假设你已经掌握了程序创建,执行和调试,而且已经导入了核心、桌面、Android和HTML5的project到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文件来进行配置,在Androidproject的根文件夹下能够找到这个文件。文件的内容大致例如以下:
    <?

    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。

    在你的Androidproject中的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上的文档临时不翻译

    
    
    
    
    
    
查看全文
  • 相关阅读:
    Linux下配置Tomcat服务器
    Octopress + GitHub Page 搭建个人博客
    Cocoapods报错Unable to satisfy the following requirements
    类方法load和initialize的区别
    AFNetworking3.0 Post JSON数据
    iOS防止button重复点击
    iOS与H5交互遇到的坑
    cocoapods安装
    平时做的一些好玩或者测试的 项目 特效,动画
    webpack那些事儿
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10836741.html
  • Copyright © 2011-2022 走看看