置顶随笔 #
2011年12月25日 #
前段时间看到动作编辑器Sprite更新了,名为Spx2011。加了多图和支持透明像素的功能。可是想不到竟然要收费了,听到这个消息,我心里很是愤慨,忍不住要骂一句:卑鄙。我是个文化人,我所能想到的最脏的词语大抵就是这个词了。
Sprite以前的版本我也用了一两年,感觉还不错(应该是我没用过别的编辑器的缘故吧)。但是一大堆的Bug在里面,我们好像还只能默默的忍受,因为据说作者是个高傲的人。
更早之前有认识另一个做动作编辑器的高手,这是个小心的低调的程序员。有跟他小小的交流动作编辑器这一块。我跟他提到Sprite,他一堆的不屑,说:界面差,代码结构差。后来他有给我看他写的游戏编辑器,给我的感觉就是惊艳!(截图如下:)

这是个游戏编辑器,他把动作编辑器,地图编辑器等游戏工具整到这一个工具里了。界面很美观!有资源管理器,管理方便;有控制台输出,有打包,编译,甚至有直接运行的功能!这样的编辑器才有资格在市面上拿出来卖钱吧?那些其他的不入流的工具们,麻烦你们把你们那丑陋的头缩回去吧!
本来我之前已经在写动作编辑器了,主体结构也搭的差不多了,后来看到这个霸气的工具,心里为之一惊,于是把我的工具重新规划修改了一下。加了项目管理,
日志,网络管理几个大的模块,其实也是跟这个差不多,也是要把动作编辑器,地图编辑器等游戏工具整到一起。不过没这么多细的功能。
我这个编辑器是我利用空闲时间写出来的,前前后后也就大概两个月左右的时间,用Java写的,才能写的快一些。当然时间仓促,还有很多不足之处,欢迎提出批评指教。(截图如下)

其实动作编辑器也没多复杂的东西在里面,希望大家不要去花那份冤枉钱来买别人写的垃圾工具。有钱的话还是多多支持一下中国正困难中的手游吧。
后面我会专门拿一个系列来讲这个工具,一步一步为大家揭开动作编辑器这个神秘的面纱。敬请期待。
2011年12月19日 #
做过手机游戏(尤其是J2me)的程序员想必对各手机自带的系统字都是深恶痛绝的吧:难看,运行效率低,各个机型还不匹配,移植起来也很麻烦。
一般情况每个公司都是用图片代替,这样虽然是很美观,但是图片在程序里是很占内存的。尤其是做Rpg的时候,这么多的剧情文字不可能全都做成图片吧!
后来我研究了一下点阵字库的实现原理,我觉得也可以模仿一下,做个山寨版的点阵字库。
原理如下:
1 获得每个字的点阵数据
把每个字画出来,转成图片,然后获得每个点的颜色信息,这样就知道这个字的点阵数据。(如图1)
2 把这些点阵数据写到二进制文件里,要用的时候读出这些点阵数据,画字的时候再用画线的方法画出来就行了。

(图1)
至于每个字的数据,可以保存点或线的数据。我是保存的线的数据(因为Java里找不到画点的函数,只有画线的,这样做渐变字的时候也很方便,至于说描边,那就要另外再写算法了)
J2me端的实现:
每个字一个MyWord对象
里面就一个属性byte[][] lineData;
下面是画字函数 也很简单(普通的,没有特效)
public static void drawWord(Graphics g,MyWord word, int x, int y, int color) {
if (word == null) {
return;
}
g.setColor(color);
for (int i = 0; i <word.lineData.length; i++) {
int index = 0;
if (word.lineData[i] != null) {
int len =word.lineData[i].length >> 1;
for (int j = 0; j < len;j++) {
g.drawLine(x +word.lineData[i][index], y, x + word.lineData[i][index + 1], y);
index += 2;
}
}
y++;
}
}
下面是画渐变字的函数,传了一个渐变颜色的数组进去
public staticvoid drawWordEffectA(Graphics g, MyWord word, int x, int y, int[] color) {//渐变
if (word== null) {
return;
}
for (inti = 0; i < word.lineData.length; i++) {
intindex = 0;
g.setColor(color[i]);
if(word.lineData[i] != null) {
int len = word.lineData[i].length >> 1;
for (int j = 0; j < len; j++) {
g.drawLine(x + word.lineData[i][index], y, x + word.lineData[i][index +1], y);
index += 2;
}
}
y++;
}
}
OK,总的来说是很简单的一些算法和应用。但是用到游戏里面去,对游戏的整体效果提高了很多。
比较一下点阵字,系统字,图片,这几个方法的优缺点:
|
|
点阵字 |
系统字 |
图片 |
|
数据文件大小
|
跟字的笔画复杂程度成正比, 一般1个字100字节左右,但打包到Jar时会压掉2/3 |
不会增加Jar的大小 |
文件很小 |
|
占用内存
|
每个字的对象里就一个Byte的二维数组,占用内存小 |
不占用内存,每次画的时候还会消耗额外的内存 |
跟图片的面积成正比,当有很多个字的时候,占用的内存就很恐怖了 |
|
运行速度
|
运行速度慢,在N73真机上平均每个字要1毫秒,但丝毫不影响整体运行效果(不知道还有没有优化的方法) |
运行速度快,但每次画的时候还会消耗额外的内存 |
运行速度很快 |
最后总结一下,如果少量的字还是用图片吧,美观省事运行快。
低性能的机子还是不要用这种点阵字库吧。

