`
aiquantong
  • 浏览: 112968 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2me 游戏点阵字库引擎(一) 之初步

    博客分类:
  • J2ME
阅读更多

最近在学习C的过程中无意发现了点阵字库的东西。整理了下,在J2ME实现了下相关的算法。

 

对于使用少量的汉字图形程序,完全没有必要带巨大的汉字库来运行,只要内存允许,你可以把汉字字模直接定义为数组的信息存储在EXE文件里。通过这个工具,你可以把单个字模信息直接取出来,然后在源代码中粘贴。该工具的强大在于不仅可以生成12×12、16×16宋体这些存在于DOS字库的字模,而且可以生成16×16楷体、黑体甚至自定义字体的字模,而且可以提供6种字模大小供您选择并即时预览效果!对使用少量汉字的图形编程能够提供极大方便。

相对于绘制这些字体的J2ME函数是:
首先,我们要通过工具来生成点阵字库的GB2312字模,然后在图像中绘制出来,下面我给出一些字体的字模,
废话少说,具体看例子吧。

 

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

class FontCanvas extends Canvas {
	
	protected void paint(Graphics g) {
		g.setColor(0x0);
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		drawFont(g);
	}

	void drawFont(Graphics g) {
		int i, j;

		drawmat(yi12, g,12, 50, 20, 0xFFFFFF);
		drawmat(er12, g,12, 50, 50, 0xFFFFFF);
		drawmat(dian12, g,12, 50, 80, 0xFFFFFF);
		drawmat(zhen12, g,12, 50, 110, 0xFFFFFF);
		drawmat(song16, g,16, 50, 130, 0xFF0000);
		drawmat(ti16, g,16, 50, 150, 0xFF0000);
		drawmat(zi24, g,24, 50, 180, 0x0000FF);
		drawmat(mo24, g,24, 50, 200, 0x00FF00);
		drawmat(guan48, g,48, 50, 250, 0x0000FF);
               		// for (i = 0; i < 15; i++) {
		// drawmat(matarray16k + i*32, g,16, 200 + i * 15, 200, 0xFFFFFF);
		// }
		// drawmat(matarray16k + 8*32, g,16, 200 + i * 15, 200, 0xFFFFFF);
		// drawmat(matarray16k + 9*32,g, 16, 200 + (++i) * 15, 200, 0xFFFFFF);
		// drawmat(matarray16k + 10 * 32, g,16, 200 + (++i) * 15, 200, 0xFFFFFF);
		// for (i = 18; i < 25; i++) {
		// drawmat(matarray16k + (i - 3) * 32, 16, 200 + i * 15, 200, 0xFFFFFF);
		// }
		}

	
	
	void drawmat(char[] mat, Graphics g, int matsize, int x, int y, int color)
	/* 依次:字模指针、点阵大小、起始坐标(x,y)、颜色 */
	{
		int i, j, k, n;
		n = (matsize - 1) / 8 + 1;
		for (j = 0; j < matsize; j++) {
			for (i = 0; i < n; i++) {
				for (k = 0; k < 8; k++) {
					if (!((mat[j * n + i] & (0x80 >> k)) == 0)) /* 测试为1的位则显示 */
					{
						g.setColor(color);
						g.drawLine(x + i * 8 + k, y + j, x + i * 8 + k, y + j);
						// putpixel(x + i * 8 + k, y + j, color);
					}
					// else
					// g.setColor(0xFFFFFF);
				}
			}
		}
	}
	
	
	char yi12[] = {
			/* 以下是 '1' 的 12点阵宋体 字模,24 byte */
			0x00, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x3C, 0x00,
			0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00,
			0x0C, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
			};

			char er12[] = {
			/* 以下是 '2' 的 12点阵宋体 字模,24 byte */
			0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x03, 0x00,
			0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00,
			0x63, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
			};

			char dian12[] = {
			/* 以下是 '点' 的 12点阵宋体 字模,24 byte */
			0x04, 0x00, 0x07, 0xC0, 0x04, 0x00, 0x04, 0x00,
			0x3F, 0x80, 0x20, 0x80, 0x20, 0x80, 0x3F, 0x80,
			0x00, 0x00, 0x49, 0x40, 0xC9, 0x20, 0x00, 0x00,
			};

			char zhen12[] = {
			/* 以下是 '阵' 的 12点阵宋体 字模,24 byte */
			0xF2, 0x00, 0x9F, 0xE0, 0x92, 0x00, 0xA5, 0x00,
			0xA5, 0x00, 0x97, 0xE0, 0x91, 0x00, 0xB1, 0x00,
			0x8F, 0xE0, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00,
			};

			char song16[] = {
			/* 以下是 '宋' 的 16点阵宋体 字模,32 byte */
			0x02, 0x00, 0x01, 0x00, 0x7F, 0xFE, 0x41, 0x04,
			0x81, 0x08, 0x01, 0x00, 0x7F, 0xFC, 0x03, 0x80,
			0x05, 0x80, 0x05, 0x40, 0x09, 0x20, 0x11, 0x10,
			0x21, 0x0E, 0x41, 0x04, 0x01, 0x00, 0x00, 0x00,
			};

			char ti16[] = {
			/* 以下是 '体' 的 16点阵宋体 字模,32 byte */
			0x10, 0x40, 0x18, 0x40, 0x10, 0x40, 0x20, 0x40,
			0x37, 0xFC, 0x60, 0xC0, 0xA0, 0xE0, 0x21, 0x60,
			0x21, 0x50, 0x22, 0x48, 0x24, 0x4E, 0x2B, 0xF4,
			0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x00, 0x00,
			};

			char zi24[] = {
			/* 以下是 '字' 的 24点阵隶书 字模,72 byte */
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x1C, 0x10,
			0x1F, 0xFF, 0xF0, 0x18, 0x00, 0x30, 0x18, 0xFF,
			0x10, 0x09, 0xC3, 0x90, 0x00, 0x3C, 0x00, 0x00,
			0x1C, 0x00, 0x3F, 0xFF, 0xFE, 0x7E, 0x0C, 0xFE,
			0x00, 0x1C, 0x04, 0x00, 0x1C, 0x00, 0x04, 0x3C,
			0x00, 0x03, 0xF8, 0x00, 0x00, 0xE0, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			};

			char mo24[] = {
			/* 以下是 '模' 的 24点阵楷体_GB2312 字模,72 byte */
			0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00,
			0x30, 0x03, 0x0C, 0x20, 0x03, 0x04, 0x3C, 0x02,
			0x07, 0xE0, 0x02, 0x1C, 0x40, 0x02, 0x00, 0x40,
			0x03, 0xC0, 0x70, 0x7E, 0x1F, 0x98, 0x02, 0x08,
			0x10, 0x06, 0x0F, 0x90, 0x07, 0x88, 0x10, 0x0A,
			0xCB, 0xE0, 0x1A, 0x05, 0x00, 0x12, 0x01, 0x1E,
			0x22, 0x0F, 0xFE, 0x42, 0x32, 0x80, 0x02, 0x02,
			0x40, 0x02, 0x04, 0x60, 0x02, 0x0C, 0x30, 0x02,
			0x18, 0x1C, 0x02, 0x20, 0x0F, 0x02, 0x00, 0x00,
			};

			char guan48[] = {
			/* 以下是 '灌' 的 48点阵黑体 字模,288 byte */
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x38, 0x00,
			0x03, 0x00, 0x03, 0xC0, 0x38, 0x00, 0x07, 0x80,
			0x03, 0xC0, 0x38, 0x00, 0x07, 0xC0, 0x03, 0xC0,
			0x38, 0x00, 0x03, 0xF1, 0xFF, 0xFF, 0xFF, 0xFC,
			0x01, 0xF9, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x79,
			0xF1, 0xC0, 0x39, 0xFC, 0x00, 0x30, 0x01, 0xC0,
			0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0xFF, 0xF0, 0xFF, 0xE0, 0x00, 0x00, 0xFF, 0xF0,
			0xFF, 0xE0, 0x00, 0x00, 0xE0, 0x70, 0xE0, 0xE0,
			0x0E, 0x00, 0xE0, 0x70, 0xE0, 0xE0, 0x1F, 0x80,
			0xE0, 0x70, 0xE0, 0xE0, 0x1F, 0xE0, 0xFF, 0xF0,
			0xFF, 0xE0, 0x07, 0xF0, 0xFF, 0xF0, 0xFF, 0xE0,
			0x01, 0xF0, 0xFF, 0xF1, 0xFF, 0xE0, 0x00, 0x60,
			0x08, 0x07, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x03,
			0x80, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x00,
			0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
			0x3F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0xFF,
			0xFF, 0xF0, 0x00, 0x00, 0x7C, 0x03, 0x80, 0x00,
			0x00, 0x20, 0x7C, 0x03, 0x80, 0x00, 0x00, 0x70,
			0xFC, 0x03, 0x80, 0x00, 0x00, 0x71, 0xFF, 0xFF,
			0xFF, 0xE0, 0x00, 0x73, 0xFF, 0xFF, 0xFF, 0xE0,
			0x00, 0xF3, 0xBC, 0x03, 0x80, 0x60, 0x00, 0xE3,
			0xBC, 0x03, 0x80, 0x00, 0x01, 0xE1, 0x3C, 0x03,
			0x80, 0x00, 0x01, 0xC0, 0x3F, 0xFF, 0xFF, 0xE0,
			0x01, 0xC0, 0x3F, 0xFF, 0xFF, 0xE0, 0x03, 0xC0,
			0x3F, 0xFF, 0xFF, 0xE0, 0x03, 0x80, 0x3C, 0x03,
			0x80, 0x00, 0x07, 0x80, 0x3C, 0x03, 0x80, 0x00,
			0x0F, 0x80, 0x3C, 0x03, 0x80, 0x00, 0x0F, 0x00,
			0x3F, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x3F, 0xFF,
			0xFF, 0xF8, 0x1F, 0x00, 0x3C, 0x00, 0x00, 0x00,
			0x06, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			};			
}

 

import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class FontMIDlet extends MIDlet {

	public FontMIDlet() {
		// TODO Auto-generated constructor stub
	}

	protected void destroyApp(boolean unconditional)
			throws MIDletStateChangeException {
		// TODO Auto-generated method stub

	}

	protected void pauseApp() {
		// TODO Auto-generated method stub

	}

	protected void startApp() throws MIDletStateChangeException {
		Display.getDisplay(this).setCurrent(new FontCanvas());

	}

}

 

 运行截图

 

 

 

  上述内容是从http://wuhua.iteye.com/blog/159107上copy的。

 

此仅仅是提供一种在J2ME上的自定义的点阵字库的实现,但是我们要是想把它集成在J2ME游戏引擎中,还相差甚远。现在摆在我们面前的至少有两大难题:

   1,绘制汉字的函数效率不高。放在实际的游戏中影响整体的效果,使游戏“卡”??

   2,我们应该如何管理点阵信息,如何保存,如何读取??

 

我会在以后的连载中逐个解决这两个问题!!

 

  • 大小: 10.8 KB
分享到:
评论
2 楼 aiquantong 2012-11-11  
兄弟 估计你是没有做过J2ME游戏,在J2ME游戏时代,对于剧情中的汉字是只有采用这种方式才能实现跨平台移植。
1 楼 hongliufeiyang 2012-06-06  
这么整还不累死了,那还不如直接性的用图片剪切呢

相关推荐

    j2me点阵字库

    点阵字库是J2ME应用中一种特殊的字体资源,尤其对于游戏开发来说,非常重要。这种字库以像素为单位描绘字符形状,适用于低内存和低分辨率的设备。 点阵字库的工作原理是将每个字符以二维数组的形式存储,数组的每个...

    j2me游戏引擎详解

    总之,J2ME游戏引擎是构建移动平台上游戏的关键工具,它们通过提供一系列预封装的功能和优化,帮助开发者克服硬件限制,创造出引人入胜的游戏体验。随着技术的发展,虽然现在更多高级平台如Unity和Unreal Engine占据...

    J2ME手机游戏开发引擎的分析与设计

    相比之下,J2ME作为早期的移动平台,其游戏引擎开发相对较少,但仍有大量的老旧设备和低端市场需要支持,因此开发J2ME游戏引擎仍具有一定的市场价值和技术挑战。 2.1 游戏引擎相关技术 2.1.1 编程语言技术要求 ...

    j2me游戏引擎(强大编辑器及光照效果)

    一、J2ME游戏引擎概述 J2ME游戏引擎是专门针对J2ME平台构建的游戏开发框架,它简化了游戏的编程工作,提供了丰富的功能和优化性能。这种引擎通常包括图形渲染、音频处理、物理模拟、用户输入管理等多个组件,帮助...

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏下,上为另一部分

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏

    一款 J2ME 的物理引擎

    在游戏开发中,物理引擎是一个关键组件,它负责模拟真实世界的物理规则,如重力、碰撞检测和对象运动,为游戏带来更加真实的交互体验。 **物理引擎的重要性** 物理引擎为游戏提供了动态和逼真的环境,让玩家能够...

    我的第一个j2me游戏代码

    我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我...

    J2ME游戏开发(第一版)

    《J2ME游戏开发(第一版)》是针对Java Micro Edition(J2ME)平台进行游戏编程的专业指导书籍。J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如早期的智能手机和平板电脑。这本书的焦点在于教导开发者...

    J2ME小游戏J2ME小游戏J2ME小游戏上,下为另一部分

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏

    java j2me的游戏引擎

    Java J2ME游戏引擎是为在Java Micro Edition (J2ME)平台上开发移动游戏而设计的一种软件框架。J2ME是一种轻量级的Java平台,主要用于嵌入式设备,如早期的智能手机和平板电脑,它提供了运行Java应用程序的能力,包括...

    j2ME游戏开发详解

    总之,j2ME游戏开发涉及到多方面的技术和技巧,从基础的MIDP API学习,到游戏设计、图形动画和音频处理,再到性能优化和分发部署,每一个环节都是成功开发游戏的关键。通过深入理解和实践,开发者可以创造出丰富的...

    J2ME斜45度游戏引擎

    "J2ME斜45度游戏引擎"是专门为J2ME平台设计的一种专门用于构建45度视角游戏的开发工具。 45度视角游戏通常是指游戏场景以45度角呈现,这样的设计可以使玩家同时看到角色周围的环境,增加了游戏的视觉深度和策略性。...

    J2me 游戏原代码

    Java 2 Micro Edition (J2ME) 是一种用于开发小型设备和嵌入式系统的 Java 平台,尤其在早期智能手机和功能手机上广泛应用于游戏开发。"J2ME 游戏原代码" 提供的资源可能是一个包含 J2ME 游戏完整源代码的压缩包,名...

    j2me游戏开发 经典教程

    j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发

    J2ME 游戏开发资源

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,主要用于移动设备、嵌入式设备上的应用程序开发,尤其是手机游戏。这个压缩包包含的“J2ME游戏开发资源”是一份宝贵的资料库,对于想要学习或从事J2ME游戏...

    J2ME游戏开发(第一版)无打印限制版

    《J2ME游戏开发》是一本专注于Java 2 Micro Edition (J2ME) 平台上游戏开发的专业书籍。该书由Jason Lam编写,Deaboway Chou翻译成中文版本。本书旨在教授读者如何利用J2ME的技术栈来开发适用于移动设备的游戏。 ##...

    经典j2me游戏实例

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,专门用于开发在移动设备和嵌入式系统上运行的应用程序,其中包括许多经典的游戏。本篇将通过分析提供的文件名来探讨J2ME游戏开发的基础知识。 1. **NewGame....

    J2ME游戏源代码

    J2ME应用的数据存储一般采用RecordStore系统,这是一个简单的键值对数据库,用于保存用户数据和游戏进度。 8. **优化技巧** 由于资源限制,J2ME游戏需要进行性能优化。例如,减少绘图调用、使用位图操作而非颜色...

Global site tag (gtag.js) - Google Analytics