在我使用OGEngine_2.x进行消灭圈圈(星星)游戏的实践的时候,使用BitmapFont对自定义字体进行调用。
原文字体教程如下:http://blog.csdn.net/OrangeGame/article/details/40182921
原文使用的Hiero版本为v3.0,但我在网上找了很久没找到,只找到了Hiero_v2.0
根据教程,使用Hiero_v2.0生成fnt,并使用TexturePacker将png图片压缩为pvr.ccz和xml后,放入android项目当中。
发现一旦调用com.orange.opengl.font.BitmapFont构造方法加载字体文件,则出现黑屏情况,原因在于fnt无法找到需要加载的png文件(因为在原教程中png已经压缩为pvr.ccz和xml)。
解决办法:
1.用记事本打开fnt文件,将file="XXX.png"改为file="XXX.xml"(即TexturePacker生成的xml文件)。(不建议使用该方法)
此时在项目中使用BitmapFont进行字体输出,可能会出现奇怪的图案,因为TexturePacker压缩png后生成的pvr.ccz和xml的字符坐标和原png的不一样。
TexturePacker的输出设置必须与Hiero的输出设置一样,才可以正常显示。
2.直接使用Hiero_v2.0生成的fnt和png两个文件进行加载。
若输出的png文件较小可以使用这种方法。缺点是若文件较大,不进行压缩的话会比较耗内存。
Hiero_v2.0的问题在于:没有办法输出中文字符。对于仅需要英文字符的同学来说,Hiero2.0足够用了。
想要输出中文字符集可以试试BMFont。
BMFont的教程(看前半段就可以了):
http://blog.csdn.net/qiurisuixiang/article/details/8984288
不过如果要在OGE_2.1.4以及之前的版本中使用BMFont输出的fnt文件,还应该做一些修改。
1.将fnt文件用记事本打开
2.删除 alphaChnl / redChnl / greenChnl / blueChnl / kernings / kerning 等不必要的参数
3.使用ANSI编码进行保存
最后附上OGE文字输出的代码和效果图:
以下仅是GameLayer的主要代码——切勿直接使用
import com.orange.engine.device.Device; import com.orange.entity.text.Text; import com.orange.entity.text.TextOptions; import com.orange.util.HorizontalAlign; import com.orange.util.color.Color; import com.orange.opengl.font.BitmapFont; public class GameLayer extends MatchLayer{ // 引用上级scene private GameScene mGameScene; public GameLayer(GameScene pScene) { super(pScene); this.mGameScene = pScene; initView(); } private void initView() { BitmapFont bitmapFont = new BitmapFont(getEngine().getTextureManager(), Device.getDevice().getFileManage(), "font/bitmapFont.fnt"); bitmapFont.load(); Text t = new Text(this.getCentreX(), 50, bitmapFont, "你好世界", new TextOptions(HorizontalAlign.CENTER), this.getVertexBufferObjectManager()); t.setColor(Color.RED); this.attachChild(t); } }
附: