最近由于项目需要,研究了下点阵字库。在这里分享下,以便同样有此问题的同仁们参考。
我用的字库是标准的GB2312的16大小的汉字。(懒的自己做字库,直接用标准的)先分析下字库吧。
点阵字说白了就是用画点的方式画出一个字。一个点占一位,一共是16*16,那么一个16的字所占大小是32byte。每个汉字都有自己的区位码,一个汉字是由两个扩展ASCII码组成的。第一个是区码,第二个是位码。在GB2312标准中,将所有汉字分成94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有94*94=8836 个汉字。点阵字库中,汉字的点阵数据就是按照区位的顺序储存的。比如“你”字就是由c4和e3组成的。在汉字的内码中,汉字区位码的存放是在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中。具体是:
第一个扩展ASCII码 = 128+32 + 汉字区码
第二个扩展ASCII码 = 128+32 + 汉字位码
那么汉字的存放区位就能知道了:
汉字区码 = 第一个扩展ASCII码-128-32
汉字位码 = 第二个扩展ASCII吗-128-32
按照这个,“你”字的区位码就是36和67。
同时我们也可以找到我们想要的数据了。公式是:((区码-1) * 94 + 位码) * 一个点阵字占用的字节数
数据找到了,在j2me中把点画出来就是点阵字了。
代码如下:
import Java.io.InputStream;
import javax.microedition.lcdui.Graphics;
/*
* CustomFont.java
*
* Created on 2008年9月23日, 上午9:41
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
/**
*
* 点阵字库的加载和绘制,针对GB2312编码的16*16的标准汉字
* by killer
*/
public class CustomFont {
public final static int[] mask = {128, 64, 32, 16, 8, 4, 2, 1};
public final static String ZK_PATH = "/font/HZK16";
public final static String ENCODE = "GB2312";
/** Creates a new instance of CustomFont */
public CustomFont() {
}
/**
*绘制点阵中文汉字,gb2312,16字
*@param g 画笔
*@param str 需要绘制的文字
*@param x 屏幕显示位置x
*@param y 屏幕显示位置y
*@param color 文字颜色
*
*/
protected void drawString(Graphics g,String str,int x,int y,int color){
byte[] data = null;
int[] code = null;
int byteCount;//到点阵数据的第几个字节了
int lCount;//控制列
g.setColor(color);
for(int i = 0;i < str.length();i ++){
if(str.charAt(i) < 0x80){//非中文
g.drawString(str.substring(i,i+1),x+(i<<4),y,0);
continue;
}
code = getByteCode(str.substring(i,i+1));
data = read(code[0],code[1]);
byteCount = 0;
for(int line = 0;line < 16;line ++){
lCount = 0;
for(int k = 0;k < 2;k ++){
for(int j = 0;j < 8;j ++){
if((data[byteCount]&mask[j])==mask[j]){
g.drawLine(x+lCount+(i<<4),y+line,x+lCount+(i<<4),y+line);
}
lCount++;
}
byteCount ++;
}
}
}
}
/**
*读取文字信息
*@param areaCode 区码
*@param posCode 位码
*@return 文字数据
*/
protected byte[] read(int areaCode,int posCode){
byte[] data = null;
try{
int area = areaCode-0xa0;//获得真实区码
int pos = posCode-0xa0;//获得真实位码
InputStream in = getClass().getResourceAsStream(ZK_PATH);
long offset = 32*((area-1)*94+pos-1);
in.skip(offset);
data = new byte[32];
in.read(data,0,32);
in.close();
}catch(Exception ex){
}
return data;
}
/**
*获得文字的区位码
*@param str
*@return int[2]
*/
protected int[] getByteCode(String str){
int[] byteCode = new int[2];
try{
byte[] data = str.getBytes(ENCODE);
byteCode[0] = data[0] < 0?256+data[0]:data[0];
byteCode[1] = data[1] < 0?256+data[1]:data[1];
}catch(Exception ex){
}
return byteCode;
}
}
引用于http://dev.10086.cn/cmdn/wiki/index.php?doc-view-4995.html。它讲的很好!对汉字字库有深入的研究。
但是,在实际的开发中,要是将全部字库都加载到程序中,在N73还是会卡的。这个卡的原因,字库本身很庞大,导致检索很慢。为此我们只能将部分字库加载到游戏内存中,这里就有一个策略问题??我们应该如何设计??
相关推荐
点阵字库是J2ME应用中一种特殊的字体资源,尤其对于游戏开发来说,非常重要。这种字库以像素为单位描绘字符形状,适用于低内存和低分辨率的设备。 点阵字库的工作原理是将每个字符以二维数组的形式存储,数组的每个...
**J2ME游戏引擎详解** Java 2 Micro Edition(J2ME)是Oracle公司为小型设备和嵌入式系统设计的一种Java平台。它主要用于移动设备,如早期的智能手机和平板电脑,提供运行Java应用程序的能力。在J2ME的环境中,游戏...
相比之下,J2ME作为早期的移动平台,其游戏引擎开发相对较少,但仍有大量的老旧设备和低端市场需要支持,因此开发J2ME游戏引擎仍具有一定的市场价值和技术挑战。 2.1 游戏引擎相关技术 2.1.1 编程语言技术要求 ...
在本文中,我们将深入探讨"j2me游戏引擎",特别是其强大的编辑器和光照效果在2D游戏开发中的应用。 一、J2ME游戏引擎概述 J2ME游戏引擎是专门针对J2ME平台构建的游戏开发框架,它简化了游戏的编程工作,提供了丰富...
"DyMiX_basic_0.1"很可能就是这样一个针对J2ME平台优化的物理引擎库,它小巧而强大,能够在有限的资源条件下提供良好的物理模拟效果。 **DyMiX_basic_0.1 特性** 1. **轻量化设计**:DyMiX_basic_0.1作为J2ME物理...
J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏
**J2ME斜45度游戏引擎** J2ME(Java 2 Micro Edition)是Java平台上的一种轻量级开发框架,主要用于移动设备和嵌入式系统的应用程序开发,其中包括游戏。在移动游戏领域,J2ME曾是开发手机游戏的重要工具,尤其是在...
Java J2ME游戏引擎是为在Java Micro Edition (J2ME)平台上开发移动游戏而设计的一种软件框架。J2ME是一种轻量级的Java平台,主要用于嵌入式设备,如早期的智能手机和平板电脑,它提供了运行Java应用程序的能力,包括...
1. **MIDP GUI(图形用户界面)**: J2ME 游戏通常使用 MIDP 提供的 LCDUI(Limited Connected Device User Interface)库来创建用户界面。这包括使用 Form、ChoiceGroup、ImageItem 和 Alert 等组件。 2. **Canvas ...
这个压缩包包含的“J2ME游戏开发资源”是一份宝贵的资料库,对于想要学习或从事J2ME游戏开发的人员来说极具价值。 在J2ME游戏开发中,以下几个核心知识点至关重要: 1. **基础环境搭建**:首先,开发者需要安装...
J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏
j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发
Java 2 Micro Edition ...以上就是 J2ME 游戏的基本结构,开发者需要熟练掌握这些知识才能构建出高效、有趣的游戏。虽然现代移动平台更多地转向了 Android 和 iOS,但 J2ME 仍然是学习游戏开发原理和低级优化的好起点。
本篇将通过分析提供的文件名来探讨J2ME游戏开发的基础知识。 1. **NewGame.java** `NewGame` 文件很可能是游戏的主类,通常包含游戏的初始化逻辑,如创建游戏场景、设置游戏规则、加载资源等。在J2ME中,游戏通常...
【j2ME游戏开发详解】 Java 2 Micro Edition(j2ME)是Oracle公司推出的用于开发和部署在小型设备、移动设备以及嵌入式系统上的应用程序的平台。它以其轻量级、跨平台的特性,成为了早期手机游戏开发的重要工具。本...
本资源包含多款J2ME游戏的源代码,对于学习和理解移动游戏开发具有很高的价值。 1. **J2ME基础** J2ME由配置(Configurations)和 profiles 组成。配置定义了硬件和操作系统的基本特性,而profiles则进一步细化了...
《J2ME游戏开发中文教程》是一本专为Java ME(J2ME)平台上的游戏开发而设计的详细指南。J2ME,全称为Java 2 Micro Edition,是Java技术的一个分支,主要用于移动设备和嵌入式系统的应用程序开发,包括手机、智能...
总的来说,这份压缩包提供了全面的J2ME游戏开发资源,包括理论知识、源码示例和文档,是初学者上手J2ME游戏开发的宝贵资料。通过深入学习和实践,你可以逐步掌握J2ME游戏开发的核心技术,并有能力开发出自己的移动...