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: