分享:libgdx調用平臺原生UI提示信息

libgdx的中文支持需要開發者做一些額外的工作,所以在不追求UI風格統一的情況下(或偷懶),我會選擇調用平臺的原生UI。例如加載遊戲完畢後,需要提示玩家“遊戲加載完成,點擊屏幕進入遊戲”,雖然中文字數不多,但爲了偷懶,我不去打開hero生成fnt,也不用導入freetype庫,甚至不用libgdx的UI庫去創建一個窗口,我只是寫了個接口,用接口去調用android的Toast.makeText(String massage)就行鳥。


所以我需要一個在core工程的接口類,然後在android工程實現這個類,至於html,desktop工程是類似的。值得一提的是,libgdx本身也提供了調用平臺UI功能的一個接口:Gdx.input.getTextInput,這個接口功能是彈出平臺UI的一個輸入框。我們自己實現的UI調用接口正是參考此處。

UI調用抽象接口:

package gdx.platform;

import com.badlogic.gdx.graphics.g2d.BitmapFont;

public interface PlatformResolver {
	/**
	 * 返回網絡是否連接
	 * @return
	 */
	public boolean isNetEnable();
	/**
	 * 彈出文字信息
	 * @param context 要顯示的信息
	 */
	public void showQuickTip(String context);
	/**
	 * 彈出一個帶按鈕的窗口
	 * @param title 窗口標題文字
	 * @param context 窗口內容文字
	 * @param callback 按鈕按下的在遊戲線程中的回調,
	 */
	public void showQucikDialog(String title,String context,Runnable callback);
	public BitmapFont getFont(String characters);
	public void callPay(String payee,int money);
}
最後的2個接口還沒實現好,讀者可以自己去試試。getFont接口是爲了用android平臺中的系統字庫來生成中文的BitmapFont,這方面可以參考一位開發者的博文:

http://blog.sina.com.cn/s/blog_923db0a30102vssg.html

而callPay接口是爲支付服務的,這要看開發者使用的是怎樣的第三方支付包。libgdx官方有gdx-pay開源庫(https://github.com/libgdx/gdx-pay/wiki)專門處理支付服務,它連這方面的接口都幫你完成了,而且仍舊跨平臺(android,ios,html,lwjgl),它所用的支付平臺是諸如googleplay的國際平臺,如果想接入國內的支付寶,微信支付,你得自己再做些工作。gdx-pay的開發文檔並不複雜,找天寫個支付的博文,翻譯它一下。
這裏是PlatformResolver的實現類:

package dawn.game;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.BitmapFont;

import hif.game.PlatformResolver;

public class AndroidPr implements PlatformResolver {
	Context _context;
	Handler hd;
	public AndroidPr(Context context){
		_context=context;
		hd=new Handler();
	}
	public boolean isNetEnable() {
		// TODO Auto-generated method stub
		 ConnectivityManager connectivityManager = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
	        
	        if (connectivityManager == null)
	        {
	            return false;
	        }
	        else
	        {
	            NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
	            
	            if (networkInfo != null && networkInfo.length > 0)
	            {
	                for (int i = 0; i < networkInfo.length; i++)
	                {
	                    System.out.println(i + "==net state==" + networkInfo[i].getState());
	                    System.out.println(i + "===net type===" + networkInfo[i].getTypeName());
	                    if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED)
	                    {
	                        return true;
	                    }
	                }
	            }
	        }
	        return false;
	    }


	public void showQuickTip(final String context) {
		// TODO Auto-generated method stub
		hd.post(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Toast.makeText(_context, context, Toast.LENGTH_LONG).show();
			}
		});
		
		
	}

	public BitmapFont getFont(String characters) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void callPay(final String payee,final int money) {
		// TODO Auto-generated method stub
		hd.post(new Runnable() {
			public void run() {
				 Intent intent=new Intent(_context, ShoppingCartActivity.class);
		         
		         Bundle bundle=new Bundle();
		         bundle.putString("payee",payee);
		         bundle.putInt("money", money);
		       
		         intent.putExtras(bundle);
		         _context.startActivity(intent);
			}
		});
		
		


	}
	@Override
	public void showQucikDialog(final String title, final String context, final Runnable callback) {
		// TODO Auto-generated method stub
		hd.post(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				new  AlertDialog.Builder(_context)    
				.setTitle(title )  
				.setMessage(context)  
				.setPositiveButton("確定" ,new OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						Gdx.app.postRunable(callback);
						
					}
				})  
				.show();
			}
		});
		
	}

}

需要注意的是線程問題,注意handler的正確使用,Gdx.app.postRunable接口是切入libgdx的遊戲主線程。如果調試中出現線程缺少looper的日誌,可以將Handler hd如下創建new Handler(_context.getMainLooper())就會保險點。

關於平臺接口創建後如何使用很簡單,libgdx官方wiki有技術文檔,你最後可以再去看看:https://github.com/libgdx/libgdx/wiki/Interfacing-with-platform-specific-code

還有一篇官方wiki也寫得很好,裏面有一小節講怎麼在android中使用Handler在遊戲中控制第三方廣告開啓與暫停https://github.com/libgdx/libgdx/wiki/Admob-in-libgdx#control

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章