1. 程式人生 > >利用Android遊戲引擎Angle開發介面——顯示漢字

利用Android遊戲引擎Angle開發介面——顯示漢字

Angle不支援漢字的顯示,內帶的AngleFont,對E文的支援是沒問題。AngleFont通過把字元變為Bitmap的方式來載入字型檔,準備紋理。對於漢字字型檔,這個過程會耗時很長,全部載入進來,佔用記憶體也很多;如果部分載入、根據使用頻度更新字型檔快取,演算法又太麻煩。

我使用的是笨方法,先使用Android的Canvas,把漢字繪製到記憶體圖片,然後根據圖片生成一個AngleSprite(含配套的AngleSpriteLayout及AngleSpriteLayout關聯的Texture)。下面是轉換漢字為Bitmap的類,支援單行文字繪製,可以根據需要做省略處理。

public final class StringToBitmap {

	public static Bitmap getBitmapFromSingleLineString(String text, int textColor, int backgroundColor, String fontType,
			int fontSize, int bitmapWidth, int bitmapHeight, Paint.Align align) {
		Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight,
				Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		// 背景顏色
		canvas.drawColor(backgroundColor);
		TextPaint paint = new TextPaint();

		Typeface typeface = Typeface.create(fontType, Typeface.NORMAL);
		// 消除鋸齒
		paint.setAntiAlias(true);
		// 字型為紅色
		paint.setColor(textColor);
		paint.setTypeface(typeface);
		paint.setTextSize(fontSize);
		paint.setTextAlign(align);
		
		CharSequence truncateText = TextUtils.ellipsize(text, paint
				, bitmapWidth, TextUtils.TruncateAt.END);
		// 繪製字型
		canvas.drawText(truncateText, 0, truncateText.length(), 0, bitmapHeight - 1,  paint);
		return bitmap;
	}
}

僅僅是上面的處理還不夠,生成了一個Bitmap,還需要轉變成紋理。

Angle類庫中的AngleTextureEngine只能從Resouce中載入紋理。第一步,我修改了AngleTextureEngine類,添加了下面的方法以便從已有的Bitmap生成紋理物件。

	public AngleTexture createTextureFromBitmap(Bitmap bitmap)
	{
		AngleTexture tex = null;
		Iterator<AngleTexture> it = mTexturesX.iterator();
		while (it.hasNext())
		{
			tex = it.next();
			if (tex instanceof AngleBitmapTexture)
			{
				// Texture already exists
				if (((AngleBitmapTexture) tex).mBitmap == bitmap)
				{
					tex.mRefernces++;
					return tex;
				}
			}
		}

		tex = new AngleBitmapTexture(this, bitmap);
		mTexturesX.add(tex);
		return tex;
	}

第二步,還要修改AngleSpriteLayout類來支援從Bitmap建立紋理,新增下面兩個方法(沒有指定cropWidth和cropHeight,只指定紋理尺寸width和height)。
	public AngleSpriteLayout(AngleSurfaceView view, Bitmap bitmap)
	{
		doInit(view, 0, 0, bitmap);
	}
	
	public AngleSpriteLayout(AngleSurfaceView view, int width, int height, Bitmap bitmap)
	{
		doInit(view, width, height, bitmap);
	}

上面兩個方法呼叫的doInit函式,我參考AngleSpriteLayout類原有的doInit函式做了過載。

第三步,還得實現一個紋理類AngleBitmapTexture。程式碼如下:

public class AngleBitmapTexture extends AngleTexture {
	protected Bitmap mBitmap;

	public AngleBitmapTexture(AngleTextureEngine textureEngine, Bitmap bmp) {
		super(textureEngine);
		mBitmap = bmp;
	}

	@Override
	public Bitmap create() {
		return mBitmap;
	}
	
	void setBitmap(Bitmap bitmap){
		mBitmap = bitmap;
		mTextureEngine.releaseHWTexture(this);
	}

}


好了,準備工作完成了,下面看怎麼使用。其實很簡單,舉個例子:

		long t = System.currentTimeMillis();
		
		AngleObject textHolder = mGLSurfaceView.addObject(new AngleObject());
		int x = 120;
		int y = 100;
		for (int i = 0; i < 30; i++) {
			if (i % 6 == 0) {
				y += 60;
				x = 120;
			}
			AngleSprite textSprite = new AngleSprite(x, y,
					new AngleSpriteLayout(mGLSurfaceView, 190, 50,
							StringToBitmap.getBitmapFromSingleLineString(
									"渲染測試中" + i, 0xFFEEEEEE, 0x00000000, "宋體",
									28, 190, 50, Paint.Align.LEFT)));
			textHolder.addObject(textSprite);
			x += 200;
		}
		Log.v("StringBitmap", "create 30 string bitmap, use: " + (System.currentTimeMillis() - t));

OK,到此為止,可以正常顯示漢字了,就是不知道效能如何。我在上面的程式碼中,加了些測試的程式碼,建立耗時還不算太多,在我的裝置上,建立30個字串文理,150毫秒左右。

似乎應該先分析一下Angle引擎的框架,不過程式碼和類都不太多,比較容易理清楚,閱讀程式碼花不了太多時間,等我有時間再補了。這也可能是這個引擎沒有文件的原因之一,作者認為程式碼可以說明大部分東西,不需要。

相關推薦

利用Android遊戲引擎Angle開發介面——顯示漢字

Angle不支援漢字的顯示,內帶的AngleFont,對E文的支援是沒問題。AngleFont通過把字元變為Bitmap的方式來載入字型檔,準備紋理。對於漢字字型檔,這個過程會耗時很長,全部載入進來,佔用記憶體也很多;如果部分載入、根據使用頻度更新字型檔快取,演算法又太麻煩

國外15種手機遊戲引擎開發工具介紹

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android遊戲引擎Rokon宣佈停止更新

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

為什麼沒有好用的Android遊戲引擎

                隨著Android平臺的不斷髮展,近期Android開發者數量呈現出上升勢頭,就連以往較為冷門的遊戲開發領域也湧現出不少生力軍。然而,全新的問題正擺在了初學者面前,很多他們從未遇過的問題開始浮上臺面。“找了好久也沒看見合適的引擎,看來Android真的不適合遊戲開發”、“我試過

記錄一下八款開源 Android 遊戲引擎

雖然android學了點點,然後現在又沒學了(我為啥這麼沒有恆心呢大哭)。以後有時間還是要繼續學android的,一定要啊!雖然現在沒學android遊戲程式設計,不過還是把這些八款開源的android遊戲引擎記錄一下,以後可能會用到也說不定。 1、Angle Angle是一款專為Android平臺設計的,敏

android遊戲引擎彙總

隨著Android系統的使用越來越廣泛,瞭解一下Android平臺下的遊戲引擎就非常有必要。而同時因為基於Intel x86的移動裝置越來越多,我也非常關注支援x86的移動遊戲引擎。然而就目前為止遊戲引擎的數量已經非常之多,每個引擎都有不同的特徵、價格、成熟度等。通過一些調

利用android studio實現手機資訊介面

1.    設計思路(實現原理) 1)將準備好的八個圖示複製到res/drawable資料夾下 2)建立一個垂直的線性佈局,並在線性佈局中建立4個相對佈局  3)在相對佈局中新增相應的TextView 4)在values檔案下的style.xml檔案中存放抽取出來的樣式

android遊戲引擎andengine學習系列三:繪製遊戲虛擬搖桿

 如何高效的學習,這才是我們最值得去學習的。 andengine中繪製虛擬遊戲搖桿非常簡單,只需要實現AnalogOnScreenControl模擬搖桿類,在設定一些屬性即可。先看效果圖: 左邊的搖桿是控制精靈上下左右移動,右邊的搖桿空值精靈的旋轉。程式碼結構跟and

android——TextView預設文字開發顯示執行時隱藏

有沒有一種方法可以讓預設文字只在android studio 編輯時顯示,而在真機執行時不顯示,避免載入資料時的不友好展示呢? 根佈局新增屬性: xmlns:tools="http://schemas.android.com/tools" textview新增屬性:

Android 百度地圖開發(一)如何呼叫百度地圖介面和在專案中顯示百度地圖以及實現定位

二、下載百度地圖API庫 然後新增到專案中即可。   三、在專案清單AndroidMainifest.xml配置百度地圖API key和新增相關許可權                         四、在專案呼叫百度地圖專案功能,這篇文章就首先講講顯示地圖和定位的功能 首先

利用遊戲伺服器引擎Matchvs開發聯網微信小遊戲

Matchvs是一款十分易用的遊戲伺服器引擎,開發者通過SaaS層提供的API,即可完成“就近”節點接入、玩家匹配、遊戲資料通訊的建立;PaaS提供GS開發框架、託管平臺,無需自有伺服器資源即可對服務端的聯網能力進行擴充套件,實現自定義的服務端邏輯。 微信小遊戲玩法簡介:遊

Android遊戲開發十六】Android Gesture之【觸控式螢幕手勢識別】操作!利用觸控式螢幕手勢實現一個簡單切換圖片的功能!

原創,轉載務必在明顯處註明:很多童鞋說我的程式碼執行後,點選home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完Himi的博文,第十九篇Himi專門寫了關於這些錯誤的原因和解決方法,這裡我在部落格都補充說明下,省的童鞋們總疑惑這一塊;請點選下面聯絡進入

為基於 x86 的 Android* 遊戲選擇合適的引擎

文章 開源 版本號 操作 ani android uic 摘要 方法 摘要 遊戲開發者知道 Android 中蘊藏著巨大的機遇。 在 Google Play 商店的前 100 款應用中,約一半是遊戲應用(在利潤最高的前 100 款應用中。它們所占的比例超過 90%)

[android] 百度地圖開發 (一).申請AK顯示地圖及解決顯示空白網格問題

定義 gps 官方 應用程序 2.x lns settings sap xmlns 近期做android百度地圖,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so顯示百度地圖時總是遇到問題——僅僅顯示

android應用開發 button顯示兩行文本

data oid out ron sdn weight drawable 做的 nor 自己寫了個電話撥號器的程序給男朋友玩,用來專門打我的手機號,為了把界面做的好看一點,須要用到顯示兩行文本的button。在網上搜羅了兩種方法,記錄在以下。跟大家一起分享一下,希望

如何學習aNDROID遊戲開發

.com and 遊戲開發 baidu ongl oid hao123 music andro %E5%AE%89%E5%8D%93%E7%9A%84%E5%B0%B1%E4%B8%9A%E6%96%B9%E5%90%91%E9%83%BD%E6%9C%89%E9%82%A

開發H5牛牛大廳遊戲引擎的選擇:Egret或Laya?

cti visual 回復 pre 開發經驗 中一 程序 進行 社區 Q1446595067官網:h5.haozibbs.com一、H5遊戲開發的引擎介紹 開發H5遊戲的引擎有很多,比如egret、laya、cocos-js等等。這裏主要是分析的是egret和laya,因為

遊戲開發】免費開源遊戲引擎

開源即開放原始碼(Open Source),遊戲引擎好比賽車的引擎,是用於控制所有遊戲功能的主程式,從計算碰撞、物理加速系統和物體的相對位置,到接受玩家的輸入,以及按照正確的音量輸出聲音等等。無論是角色扮演遊戲、即時策略遊戲、冒險解謎遊戲或是動作射擊遊戲,哪怕是一個只有1兆的小遊戲,都有這樣一段起控

一個人獨立開發 3D 遊戲引擎可能嗎?

  作者:孫志超 連結:https://www.zhihu.com/question/24733255/answer/42000966 來源:知乎 著作權歸作者所有,轉載請聯絡作者獲得授權。 當然可以,但難道有個引擎,就可以做出真正商業化的遊戲麼?

LGame-0 3 Android與JavaSE遊戲引擎 正式釋出,新增SRPG製作模組

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!