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版釋出時文件。
- 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);
- }
- }
效果圖:
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示例中程式碼)
基本使用方法如下所示:
- 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();
- }
- }
效果圖:
5、不再強制使用者必須使用LGameAndroid2DActivity。
雖然個人並不主張同時建立多個Activity達到畫面轉換的效果(太耗資源),但假如您一定要使用此方式的話,自0.2.96版起可以在LGame初始化時設定setDestroy(false)函式,這樣就可以讓程式在登出LGameAndroid2DActivity時不退出遊戲,從而把LGameAndroid2DActivity當作一個非常普通的Activity使用。
6、簡化了LGame與標準Android元件互動時的編碼流程,讓Android窗體新增方式更貼近於LGame自帶元件的新增方式。
自0.2.96版起,當我們想載入一個規定大小的Web介面到LGame的指定位置,可以直接使用以下編碼做到:
- //構建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);
效果如下圖所示:
全屏的話改為這樣既可。
[java] view plain copy print ?
- addView(web, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,Location.CENTER);
效果如下圖所示:
另外,由於Android系統自身的特殊執行緒機制,如果在多執行緒環境中使用addView新增元件或者進行其它Android系統元件操作(比如LGame的onLoad等函式中呼叫),需要使用runOnUiThread將其包裝,具體程式碼如下所示:
- 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 ?
- 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" });
- }
呼叫輸入框:
- public void onTouchDown(Touch e) {
- showAndroidTextInput(new TextListener() {
- public void input(String text) {
- }
- public void cancled() {
- }
- }, "輸入框", "ABCDEFG");
- }
呼叫一個Assets資料夾下的HTML文件:
- public void onTouchDown(Touch e) {
- showAndroidOpenHTML(new ClickListener() {
- public void clicked() {
- }
- public void cancled() {
- }
- },"TEST", "test.html");
- }
其它不一一例舉,總之所有的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的更重要原因在於,小弟最近脖子落枕了(-_-))……