zoukankan      html  css  js  c++  java
  • 第五章(2)Libgdx应用框架之启动类和配置

     

       对于每个目标平台而言(本章只讲述Android),启动类必须实现。这个类实现一个后端特定的应用接口,ApplicationListener实现应用逻辑。启动类对平台有一定的依赖性,接下来我们看看怎样实例化和配置android的后端。

      本章假设你已经根据第四章(1)的内容配置好android项目。

     Android应用不使用main()方法作为入口,而是通过一个Activity。打开my-gdx-game-android项目中的MainActivity.java类:

    package com.me.mygdxgame;
    
    import android.os.Bundle;
    
    importcom.badlogic.gdx.backends.android.AndroidApplication;
    
    importcom.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
    
    public class MainActivity extendsAndroidApplication {
    
       @Override
    
       public void onCreate(Bundle savedInstanceState) {
    
           super.onCreate(savedInstanceState);        
    
           AndroidApplicationConfiguration cfg = newAndroidApplicationConfiguration();
    
           cfg.useGL20 = false;        
    
           initialize(new MyGdxGame(), cfg);
    
        }
    
    }
    


     

    主入口方法是ActivityOnCreate()方法。注意MainActivity继承自AndroidApplicationAndroidApplication继承自Activity。一旦配置好,AndroidApplication.initialize()就会被调用,传递到ApplicationListenerMyGdxGame)。

    Android可以有多个ActivityLibgdx游戏通常只有一个Activity组成。游戏的不同的屏幕在libgdx中实现,而不是分成多个Activity。这样做的原因是创建一个新的Activity同样需要创建一个新的OpenGL 环境,也就意味着所有的图像资源被重新加载。

    AndroidManifest.xml文件

    除了AndroidApplicationConfigurationAndroid应用也通过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="17" />
    
     
    
       <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|screenSize">
    
               <intent-filter>
    
                    <actionandroid:name="android.intent.action.MAIN" />
    
                    <categoryandroid:name="android.intent.category.LAUNCHER" />
    
               </intent-filter>
    
           </activity>
    
       </application>
    
     
    
    </manifest>
    


     

    目标SDk版本

    这是至关重要的,如果希望自己的应用运行在Android1.5以上的版本targetSdkVersion的值最小为6.如果这个值没有设置,应用将运行在传统模式。实际绘图区将小于屏幕实际分辨率,很难看。

    屏幕方向和配置更改

    除了targetSdkVersionscreenOrientation configChanges属性也需要也需要设置。

    screenOrientation属性指明应用的方向。一旦省略这个属性,应用将可以同时在横屏或竖屏中运行。

    configChanges属性至关重要,省略这个属性意味着每次键盘点击或方向变化时,应用将重新启动。如果省略screenOrientation,一个libgdx将获得一个ApplicationListener.resize()指示方向变化。可以根据情况布局你的应用。

    权限

    如果应用需要写入SD卡,需要上网,需要保持屏幕唤醒或者记录音频等,必须在AndroidManifest.xml中添加以下权限:

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    
           <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
           <uses-permissionandroid:name="android.permission.VIBRATE"/>
    
           <uses-permission android:name="android.permission.WAKE_LOCK"/>  
    


     

    用户经常怀疑这些权限的用处,所以要明智的进行选择。

    对于工作后锁定,设置相应的AndroidApplicationConfiguration.useWakeLock为true。

    如果一个游戏不需要加速度计和罗盘访问,通过设置AndroidApplicationConfiguration 中的useAccelerometer和useCompass设置为false。

    LiveWallpapers

    Libgdx可以通过较为简单的方式创建基于AndroidLiveWallpapers。一个livewallpaper的启动类称为AndroidLiveWallpaperService,以下是示例:

    package com.mypackage;
    
     
    
    // imports snipped for brevity 
    
     
    
    public class LiveWallpaper extendsAndroidLiveWallpaperService {
    
           @Override
    
           public ApplicationListener createListener () {
    
                    return newMyApplicationListener();
    
           }
    
     
    
           @Override
    
           public AndroidApplicationConfiguration createConfig () {
    
                    return newAndroidApplicationConfiguration();
    
           }
    
     
    
           @Override
    
           public void offsetChange (ApplicationListener listener, float xOffset,float yOffset, float xOffsetStep, float yOffsetStep,
    
                    int xPixelOffset, intyPixelOffset) {
    
                   Gdx.app.log("LiveWallpaper", "offset changed: " +xOffset + ", " + yOffset);
    
           }
    
    }
    


     

    createListener() createConfig()方法将在livepaper在主屏幕上创建时调用。

    offsetChange()方法将被渲染线程调用,所以你不需要更改。

    除了启动类,你也需要创建一个XML文件描述你的Wallpaper。我们可以定义它的名字为livewallpaper.xml。在你的res文件夹下创建一个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"/>
    


     

    这里定义一个thumbnail显示你的LWP中,当用户点击LWPSetting时将显示一个Activity或者描述。通过Activity改变背景颜色,你也可以存储到SharedPreferences,将它们之后通过Gdx.app.getPreferences()载入到LWP中。

    最后,你需要添加一些东西到AndroidManifest.xml中,以下是一个简单的示例:

    <?xml version="1.0"encoding="utf-8"?>
    
    <manifestxmlns: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-featureandroid:name="android.software.live_wallpaper" />
    
                    
    
           <application android:icon="@drawable/icon"android:label="@string/app_name">
    
                    <activityandroid:name=".LivewallpaperSettings" 
    
                                     android:label="Livewallpaper Settings"/>
    
                    
    
                    <serviceandroid:name=".LiveWallpaper"
    
               android:label="@string/app_name"
    
               android:icon="@drawable/icon"
    
               android:permission="android.permission.BIND_WALLPAPER">
    
               <intent-filter>
    
                    <actionandroid:name="android.service.wallpaper.WallpaperService" />
    
               </intent-filter>
    
               <meta-data android:name="android.service.wallpaper"
    
                   android:resource="@xml/livewallpaper" />
    
           </service>                                      
    
           </application>
    
    </manifest>
    


     

    Daydream

    Android4.2开始,用户可以设置Daydreams,会在设备闲置或停靠时显示。这些daydream类似屏保或者显示相册之类的东西。Libgdx可以让你轻松的编写Daydream.

    Daydream的启动类为AndroidDaydream,以下是示例:

    packagecom.badlogic.gdx.tests.android;
    
     
    
    importandroid.annotation.TargetApi;
    
    importandroid.util.Log;
    
     
    
    importcom.badlogic.gdx.ApplicationListener;
    
    importcom.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
    
    importcom.badlogic.gdx.backends.android.AndroidDaydream;
    
    importcom.badlogic.gdx.tests.MeshShaderTest;
    
     
    
    @TargetApi(17)
    
    publicclass Daydream extends AndroidDaydream {
    
       @Override
    
       public void onAttachedToWindow(){
    
          super.onAttachedToWindow();      
    
              setInteractive(false);
    
     
    
          AndroidApplicationConfiguration cfg = newAndroidApplicationConfiguration();
    
          cfg.useGL20 = true;
    
          ApplicationListener app = newMeshShaderTest();
    
          initialize(app, cfg);
    
       }
    
    }
    


     

    简单的继承了AndroidDaydream,重写了onAttachedToWindow,设置你的配置和ApplicationListener并初始化你的daydream。

    处理daydream本身你可以提供一个Activity来设置daydream。这可以是一个普通的Activity,或者一个libgdxAndroidApplication(继承自Activity)。一个空的Activity作为例子:

     

    packagecom.badlogic.gdx.tests.android;
    
     
    
    importandroid.app.Activity;
    
     
    
    publicclass DaydreamSettings extends Activity {
    
     
    
    }
    


     

    这个Activity必须指明到daydream服务的元数据。在res/xml下创建xml文件,如下:

    <dreamxmlns:android="http://schemas.android.com/apk/res/android"
    
     android:settingsActivity="com.badlogic.gdx.tests.android/.DaydreamSettings"/>
    


     

    最后,在AndroidManifest.xml中添加Activity的信息,一个daydream的服务描述。如下:

    <serviceandroid:name=".Daydream"
    
       android:label="@string/app_name"
    
       android:icon="@drawable/icon"
    
       android:exported="true">
    
       <intent-filter>
    
               <action android:name="android.service.dreams.DreamService"/>
    
               <categoryandroid:name="android.intent.category.DEFAULT" />
    
       </intent-filter>
    
       <meta-dataandroid:name="android.service.dream"
    
              android:resource="@xml/daydream" />
    
    </service>
    


     

     

  • 相关阅读:
    git-format-patch如何指定补丁生成的Subject格式
    openwrt生成的交叉编译器在哪里
    git如何在自动生成补丁时指定补丁名的起始编号
    hyper-v安装虚拟机ubuntu 18.04 64bit后无法使能增强模式怎么办
    Best regards缩写是什么
    git如何自动打补丁
    ubuntu 18.04 64bit build tensorflow report error:C++ compilation of rule '//tensorflow/core/kernels:broadcast_to_op' failed (Exit 4)
    linux安装yaml时出现Could not find a version that satisfies the requirement yaml (from versions: ) No matching distribution found for yaml
    String.format保留小数位数
    BigDecimal的保留位数和四舍五入的方法
  • 原文地址:https://www.cnblogs.com/hainange/p/6153565.html
Copyright © 2011-2022 走看看