出于个人兴趣,简单研究了一下凹凸拼图的实现。以下为本人的实现思路,多多交流。
以下来逐步讲解各个流程
生成拼图模板:
线框图形的填充需要用到填充算法,比较简单的是“种子填充算法”,但对于J2ME来说过多的递归会导致内存溢出。我测试了一下,如果使用8向连同方式,填充72X72的区域就会导致溢出了。
种子填充算法的相关链接:
对此我绕了个大弯,通过改良了一下广度优先搜索算法来实现。我们的目的就是填充一个指定的区域,给定一个起始点(先前我们生成模板时做的记录),然后以线框边界为障碍,遍历填充线框内的每个点。而搜索算法本身的作用是给定一个起始点和终点,然后搜索可行路径,在搜索的过程中是试探式的,也就说如果一直没有找到终点,就会一直遍历下去,直到所有点都被尝试过了。我们这里就利用这点,让他找不到终点,然后试图遍历所有的点来达到填充的目的。而我们也得设定结束的条件,对此我用步数来限定(限定为图块像素的数量,这样做不一定合理,但能保证完全遍历,因为遍历的范围不会超出这个区域,而遍历过的路径也不会重复)。
这里给出一个实现:
/**
* 使用指定颜色填充多边形
* @param shape 包含多边形的图片
* @param sx 多边形区域内的任意一点X坐标
* @param sy 多边形区域内的任意一点Y坐标
* @param borderColor 多边形的边界颜色
* @param fillColor 希望填充的颜色
*/
public static void fillPolygonWithColor(CustomImage shape, int sx, int sy,
int borderColor, int fillColor) {
int w = shape.getWidth();
int h = shape.getHeight();
int size = w * h;
/*************************************
* 下面是通过广度优先搜索算法进行遍历
*/
int[][] pFace = { { 0, -1 }, { -1, 0 }, { 0, 1 }, { 1, 0 } };
int maxStep = size;
int[] path = new int[maxStep];
boolean AllComplete = false;
int LevelNow = 1;
int Act = 0;
int ActBefore = 0;
int MaxAct = pFace.length;
int ActNow = 0;
int sID = sy * w + sx;
int[] LevelFoot = new int[maxStep];
int[] Table = new int[maxStep];
// 参数初始化
LevelNow = 1;
LevelFoot[1] = 0;
LevelFoot[0] = -1;
path[0] = sID;
while (!AllComplete) {
LevelNow++; // 进入下一层搜索
if (LevelNow >= maxStep)
break;
LevelFoot[LevelNow] = LevelFoot[LevelNow - 1];
for (ActBefore = LevelFoot[LevelNow - 2] + 1;
ActBefore <= LevelFoot[LevelNow - 1]; ActBefore++) {
// 遍历预设的几个方向
int srow = path[ActBefore] / w;
int scol = path[ActBefore] % w;
for (Act = 1; Act <= MaxAct; Act++) {
if (!AllComplete) {
// 试探下一步是否可行
int trow = srow + pFace[Act - 1][0];
int tcol = scol + pFace[Act - 1][1];
if (trow < 0 || trow >= h || tcol < 0 || tcol >= w)
continue;
int tID = trow * w + tcol;
if (tID < 0 || tID >= size) {
continue;
}
if (Table[tID] == 1) {
continue;
} else {
Table[tID] = 1;
}
if (shape.getRGB()[tID] == borderColor) {
continue;
}
// 标记当前状态
sID = tID;
LevelFoot[LevelNow]++;
ActNow = LevelFoot[LevelNow];
path[ActNow] = sID;
shape.getRGB()[sID] = fillColor;
// 检测结束条件
if (LevelNow >= maxStep)
AllComplete = true;
}
}
}
}
}
我们在遍历的同时提取填充为新的图片,而不直接在模板上填充。生成独立的模板便于后续的操作。
接下来我们通过蒙板从原图中提取不规则图块,这类似于DirectX中用实现图片透明的做法。需要一个填充为纯色的底图(蒙板),然后同时遍历蒙板和原图进行像素提取,生成新的图块。
具体思路可参考:
当蒙板生成后,就可以根据当初记录的起始坐标从原图中提取出对应的图块。
一个简单的实现(主要是当做练习和确定某些想法是否可行,所以实现不是很完整。顽童能跑):
- 大小: 208.9 KB
- 大小: 97.1 KB
- 大小: 67.9 KB
分享到:
相关推荐
这个程序是基于J2ME的简单拼图,有三个管卡可以选择。包内不仅有项目还有实验报告,比较清楚的介绍了我的这个实验项目
java基于J2ME的智能拼图游戏的设计与实现源码.rar
A*算法(j2me实现)A算法使用j2me实现
J2ME小游戏 拼图,代码简单易懂,各位亲可又下载看看哦,
基于J2ME的智能拼图系统的设计与实现论文.docx
基于J2ME的智能拼图游戏的设计与实现java毕业论文.docx
上传的是源代码 一个SRC文件夹 也包括所用到的图片
基于JDK1.3的J2ME的九宫格拼图,资源为源码,属于src下的com.homework3中,注意图片资源需要放在src目录下,并且大小调整为210*210(必须被三整除),代码中有判断逆序数的函数,即随机生成的拼图必须可解,可参考我...
j2me实现的des加密解密算法 j2me实现的des加密解密算法 j2me实现的des加密解密算法
j2me俄罗斯方块的制作思路 j2me俄罗斯方块的制作思路
J2ME插值算法实现图片的放大缩小 J2ME插值算法实现图片的放大缩小
实现了J2me拼图小游戏,可以选择图片,难度,分别有3x3,4x4,5x5,游戏中进行了计时,计步数。根据时间,步数进行评分,给出最后得分并根据不同等级显示不同的图片
J2ME 拼图游戏源码 J2ME 拼图游戏源码 J2ME 拼图游戏源码
本游戏实现了拼图游戏的基本功能,另外有计时,计步,暂停,重新开始,RMS持久存储,支持图像的动态切分。。。。。
j2me贪吃蛇的制作思路 j2me贪吃蛇的制作思路
j2me拼图游戏,利用面向对象实现。是中国移动mm培训讲师讲的一个项目
java j2me 手机游戏 源代码 可以运行
J2ME插值算法实现图片的放大缩小方法,难得的好资料,欢迎下载使用!
j2me Picpuzzle 拼图游戏 可选择自己喜欢的背景图片 操作简单
自己开发的一个J2ME的拼图游戏,这个不是一个很成熟的项目,但是对于初学J2ME游戏开发的网友们,可以参考一下的。这个是一个Eclipse项目,导入到Eclipse中就可以查看和运行了。