1. 程式人生 > >LGame效能改進,並增加TMX地圖支援(0 2 96版)

LGame效能改進,並增加TMX地圖支援(0 2 96版)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

下載地址(內含原始碼、示例、jar)http://loon-simple.googlecode.com/files/LGame-Android-0.2.96.7z

本次更新主要針對LGame與Android系統元件互動部分進行改進,簡化了流程與程式碼,同時調整了LGame執行在不同環境執行時的顯示策略,解決了以往存在的大多數真機差異問題,以儘量滿足不同手機平臺的需求。

 

主要改進如下:

1、新增Touch類,用以替代Android系統預設的MotionEvent類(為了封裝自適屏座標切換),所有觸屏引數自0.2.96起改為由此類傳遞。

2、刪除舊有的SpriteTile類,改為使用標準TMX地圖,相關封裝在org.loon.framework.android.game.action.map.tmx包下。

基本使用方法如下所示,更詳細可見原始碼部分或等待0.3版釋出時文件。

[java] view plain copy print ?
  1.  TMXTiledMap map;  
  2. public void onLoad() {  
  3.     //載入TMX地圖,XML中圖片載入路徑在assets資料夾下  
  4.     map = new TMXTiledMap("assets/desert.tmx","assets");  
  5. }  
  6. public void draw(LGraphics g) {  
  7.     //當onLoad中資源全部載入完畢時  
  8.     if (isOnLoadComplete()) {  
  9.         //繪製TMX地圖到螢幕,由TMX座標的1,5位置開始顯示(換算為畫素座標就是1*tileWidth,5*tileHeight)  
  10.         map.draw(g,1,5);  
  11.     }  
  12. }  
     TMXTiledMap map;    public void onLoad() {        //載入TMX地圖,XML中圖片載入路徑在assets資料夾下        map = new TMXTiledMap("assets/desert.tmx","assets");    }    public void draw(LGraphics g) {        //當onLoad中資源全部載入完畢時        if (isOnLoadComplete()) {            //繪製TMX地圖到螢幕,由TMX座標的1,5位置開始顯示(換算為畫素座標就是1*tileWidth,5*tileHeight)            map.draw(g,1,5);        }    }
效果圖:

00


3、新增Mode類,用以管理LGame引擎所開發遊戲的顯示模式。

自LGame-0.2.96起,我們可以先用maxScreen函式建立一個480x320之類低解析度的視窗,而後通過initialization(true,Mode.Fill)(引數中true代表橫屏,false代表豎屏)方式讓它以全屏狀態執行在800x480等較高解析度的手機之上,呼叫此函式所產生的窗體完全不需修改其它部分,座標與畫面比例都將自動切換(當然,縮放的代價是畫面與速度的損耗無法避免)。


4、不再強制繫結Admob類庫,原有呼叫方式改為手動呼叫封裝好的AdUtils類。

需要注意的是,此封裝類僅處理AdView相關部分封裝,超出AdView許可權的部分不再處理。做如此變更的主要原因在於,最新版的Admob類庫會依賴新增的AdMobActivity類,硬編碼處理隱患太多,故此交還許可權給使用者(另一個原因是Admob類庫越來越大,如果不用Admob還帶著它APK在體積上吃虧(- -|||)),使用Admob類庫時請按Admob示例中格式自行配置AndroidManifest.xml檔案即可,和普通程式沒有任何區別。(用AdUtils封裝的話配置AndroidManifest.xml就夠了,不用的話請完全照搬Admob示例中程式碼)

基本使用方法如下所示:

[java] view plain copy print ?
  1. public class Main extends LGameAndroid2DActivity {  
  2.     public void onMain() {  
  3.         this.initialization(true);  
  4.         if(AdUtils.isAdJarExist()){  
  5.             AdUtils.createAdView(this, Location.RIGHT,"Android game"30);  
  6.         }  
  7.         this.setShowLogo(true);  
  8.         this.setShowFPS(true);  
  9.         this.setScreen(new TD());  
  10.         this.showScreen();  
  11.     }  
  12. }  
public class Main extends LGameAndroid2DActivity {    public void onMain() {        this.initialization(true);        if(AdUtils.isAdJarExist()){            AdUtils.createAdView(this, Location.RIGHT,"Android game", 30);        }        this.setShowLogo(true);        this.setShowFPS(true);        this.setScreen(new TD());        this.showScreen();    }}

效果圖:

 

00

5、不再強制使用者必須使用LGameAndroid2DActivity。

 

雖然個人並不主張同時建立多個Activity達到畫面轉換的效果(太耗資源),但假如您一定要使用此方式的話,自0.2.96版起可以在LGame初始化時設定setDestroy(false)函式,這樣就可以讓程式在登出LGameAndroid2DActivity時不退出遊戲,從而把LGameAndroid2DActivity當作一個非常普通的Activity使用。

6、簡化了LGame與標準Android元件互動時的編碼流程,讓Android窗體新增方式更貼近於LGame自帶元件的新增方式。


自0.2.96版起,當我們想載入一個規定大小的Web介面到LGame的指定位置,可以直接使用以下編碼做到:

[java] view plain copy print ?
  1. //構建LGameWeb(其實就是WebView的簡單封裝,直接用WebView或其它任何View操作方式完全一致,另外用removeView可以刪除)  
  2. LGameWeb web = new LGameWeb("www.baidu.com");  
  3. //PS:讀取XML檔案的話,將web處直接替換為LSystem.getActivity().findViewById(id)即可 ,在LGameAndroid2DActivity和  
  4. //Screen中都有addView函式。另外View是一個泛指的概念,因為ViewGroup繼承View,而Android中所有Layout都繼承自ViewGr  
  5. //oup,所以無論是View或Layout都可以注入該函式。  
  6. //新增LGameWeb到遊戲窗體當中,大小設定為320x240,位置居於螢幕中心(Location已改良,可設定所有相對位置)  
  7. addView(web, 320240,Location.CENTER);  
//構建LGameWeb(其實就是WebView的簡單封裝,直接用WebView或其它任何View操作方式完全一致,另外用removeView可以刪除)LGameWeb web = new LGameWeb("www.baidu.com");//PS:讀取XML檔案的話,將web處直接替換為LSystem.getActivity().findViewById(id)即可 ,在LGameAndroid2DActivity和//Screen中都有addView函式。另外View是一個泛指的概念,因為ViewGroup繼承View,而Android中所有Layout都繼承自ViewGr//oup,所以無論是View或Layout都可以注入該函式。//新增LGameWeb到遊戲窗體當中,大小設定為320x240,位置居於螢幕中心(Location已改良,可設定所有相對位置)addView(web, 320, 240,Location.CENTER);

效果如下圖所示:

 

00

全屏的話改為這樣既可。

 

[java] view plain copy print ?
  1. addView(web, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,Location.CENTER);  
addView(web, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,Location.CENTER);

效果如下圖所示:

 

00

另外,由於Android系統自身的特殊執行緒機制,如果在多執行緒環境中使用addView新增元件或者進行其它Android系統元件操作(比如LGame的onLoad等函式中呼叫),需要使用runOnUiThread將其包裝,具體程式碼如下所示:

[java] view plain copy print ?
  1. LSystem.runOnUiThread(new Runnable() {     
  2.             public void run() {  
  3.                 LGameWeb web = new LGameWeb("www.baidu.com");  
  4.                 addView(web, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,  
  5.                         Location.CENTER);  
  6.             }  
  7. });  
LSystem.runOnUiThread(new Runnable() {               public void run() {                LGameWeb web = new LGameWeb("www.baidu.com");                addView(web, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,                        Location.CENTER);            }});

最後,網路操作必須開啟 <uses-permission android:name="android.permission.INTERNET" />


PS:舉凡程式設計,都是先有標準的構建方式,再有XML配置方式,所以只要能進行Activity載入,就肯定能正常讀取和載入Android的XML文件。更何況LGame引擎從本質上說就是一個Android圖形系統的封裝馬甲,絕不可能穿上馬甲就不能以預設方式程式設計了。如果您看不慣LGame的元件呼叫方式,大可以該怎麼寫就怎麼寫,操作上完全一致。

7、改良了AndroidDialog呼叫方式,讓其使用更簡便。


呼叫選擇框:
[java] view plain copy print ?
  1. public void onTouchDown(Touch e) {  
  2.     showAndroidSelect(new SelectListener() {  
  3.         public void item(int index) {  
  4.             Log.i("Select""item:" + index);  
  5.         }  
  6.         public void cancled() {  
  7.         }  
  8.     }, "選擇框"new String[] { "1""2""3" });  
  9. }  
    public void onTouchDown(Touch e) {        showAndroidSelect(new SelectListener() {            public void item(int index) {                Log.i("Select", "item:" + index);            }            public void cancled() {            }        }, "選擇框", new String[] { "1", "2", "3" });    }


00

呼叫輸入框:

[java] view plain copy print ?
  1. public void onTouchDown(Touch e) {  
  2.         showAndroidTextInput(new TextListener() {  
  3.             public void input(String text) {  
  4.              
  5.             }  
  6.              
  7.             public void cancled() {  
  8.              
  9.             }  
  10.         }, "輸入框""ABCDEFG");  
  11.     }  
public void onTouchDown(Touch e) {        showAndroidTextInput(new TextListener() {            public void input(String text) {                       }                       public void cancled() {                       }        }, "輸入框", "ABCDEFG");    }

 

00



呼叫一個Assets資料夾下的HTML文件:

[java] view plain copy print ?
  1. public void onTouchDown(Touch e) {  
  2. showAndroidOpenHTML(new ClickListener() {  
  3.             public void clicked() {  
  4.             }  
  5.              
  6.              
  7.             public void cancled() {  
  8.                  
  9.             }  
  10. },"TEST""test.html");  
  11. }  
public void onTouchDown(Touch e) {showAndroidOpenHTML(new ClickListener() {            public void clicked() {            }                                  public void cancled() {                           }},"TEST", "test.html");}

 

00

其它不一一例舉,總之所有的Dialog都可以正常呼叫(用Android系統預設的呼叫方式也一樣)。

下載地址(內含原始碼、示例、jar)http://loon-simple.googlecode.com/files/LGame-Android-0.2.96.7z
————————————————

0.3版的SLG模組有速度問題(在JavaSE版就沒事,鬱悶),所以0.3預計延後一到兩週釋出,先發個0.2.96版勞煩大家幫小弟找找BUG(另外一點,無法釋出0.3的更重要原因在於,小弟最近脖子落枕了(-_-))……

 

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述