出于个人兴趣,简单研究了一下凹凸拼图的实现。以下为本人的实现思路,多多交流。
以下来逐步讲解各个流程
生成拼图模板:
线框图形的填充需要用到填充算法,比较简单的是“种子填充算法”,但对于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语言在小型设备上实现交互式娱乐功能。 **1. J2ME基础** J2ME包含了一套运行时环境和一组可扩展的框架,用于在不同类型的设备上构建和部署应用程序。它主要由配置...
本资源主要介绍了基于 J2ME 的智能拼图游戏的设计与实现的 Java 毕业论文,涵盖了 J2ME、手机游戏、算法、智能拼图等知识点。 知识点一:J2ME 技术概述 J2ME(Java 2 Platform Micro Edition)是一种 Java 平台,...
总结来说,这个J2ME拼图游戏项目涵盖了基本的图形用户界面设计、事件处理、游戏逻辑实现和资源管理。对于学习J2ME开发的初学者,这是一个很好的实践项目,因为它涉及到许多关键概念,如对象模型、图形绘制、用户输入...
4. 图形处理:J2ME提供Canvas类,可以自定义绘制图形,实现拼图的显示和动画效果。 5. 用户界面:使用Form或Alert等组件构建简单易用的交互界面,供玩家操作。 三、源代码分析 在"PinTu"文件中,我们可以找到游戏的...
通过分析这个"J2ME小游戏 拼图"项目,不仅可以学习到基本的J2ME编程技巧,还能深入理解游戏开发中的图形处理、用户交互和资源管理等多个方面,对于提升移动开发能力具有很大帮助。如果你对这个项目感兴趣,可以从源...
Java基于J2ME的智能拼图游戏是一种在移动设备上实现的经典娱乐应用,它利用了Java Micro Edition(J2ME)平台的特性,为用户提供了一种互动式的游戏体验。J2ME是Java的一个子集,专门针对嵌入式设备和移动设备设计,...
- 性能优化:由于J2ME运行在资源有限的设备上,开发者需要考虑内存管理和图形渲染效率,避免无谓的计算和资源浪费。 总的来说,J2ME拼图游戏展示了移动开发的灵活性和多样性。通过合理利用J2ME提供的API,开发者...
根据提供的文件信息,我们可以深入探讨A*算法在J2ME平台上的实现方法和技术要点。首先,需要明确的是,A*算法是一种广泛应用于路径查找和图遍历中的算法,它能够找到从起点到终点的最短路径。而在本例中,我们关注的...
"基于J2ME的智能拼图系统的设计与实现" J2ME技术概述 J2ME(Java 2 Platform, Micro Edition)是一种专门为移动设备和嵌入式系统设计的Java平台。它提供了一个灵活的开发环境,允许开发者创建可以在各种移动设备上...
本项目“WTK_pt.rar”是一个基于J2ME的拼图游戏,通过面向对象编程技术实现,展现了在移动平台上开发游戏的基本流程和技巧。 一、J2ME基础 J2ME由配置(Configurations)、简表(Profiles)和功能包(Packages)...
基于JDK1.3的J2ME的九宫格拼图,资源为源码,属于src下的com.homework3中,注意图片资源需要放在src目录下,并且大小调整为210*210(必须被三整除),代码中有判断逆序数的函数,即随机生成的拼图必须可解,可参考我...
Java ME(J2ME)是Java平台的一个子集,主要用于移动设备、嵌入式系统和其他有限资源的设备上的应用程序开发。这个"j2me 开发的 拼图小游戏 源代码"是一个适合初学者学习的例子,它可以帮助开发者了解如何在Java ME...
4. **图形渲染**:J2ME使用` Graphics `对象进行绘图,开发者需要创建一个类来负责画布上的所有图形操作,包括绘制拼图块、背景、边框等。可能有一个名为` GameView `的类,它继承自` Canvas `或` Displayable `,并...
在移动设备上实现游戏,尤其是像拼图游戏这样简单而有趣的智力游戏,是J2ME应用的一个典型场景。本文将深入探讨基于J2ME的拼图游戏源码,带你走进这个小型但充满挑战的游戏世界。 首先,我们来看一下拼图游戏的基本...
J2ME虽然资源有限,但仍然可以通过使用插值算法来实现高质量的图像缩放。插值算法是一种用于提高图像分辨率的方法,它通过在原始像素之间插入新的像素值来实现平滑的放大效果,避免像素化的现象。本文将深入探讨J2ME...
综上所述,这个J2ME手机拼图游戏的实现涉及了J2ME的基础架构、游戏逻辑、数据持久化和图像处理等多个核心知识点。通过理解并分析这些组件,我们可以学习到如何在移动平台上构建一个完整的互动娱乐应用。对于想要深入...
综上所述,J2ME 提供了对 ZIP 和 GZIP 压缩格式的支持,开发者可以通过 `java.util.zip` 包中的类实现文件的压缩和解压缩功能,这对于在有限存储空间的设备上处理大量数据非常有用。在实际应用中,需要根据具体需求...
本文将深入探讨一款基于Java技术的拼图游戏,特别关注其在J2ME(Java Micro Edition)平台上的实现,以及如何通过该平台带给用户独特的拼图游戏体验。这款名为"net.npaka.puzzlegame"的游戏,以其精美的动漫美女拼图...
2. 图形平移:在拼图游戏中,当用户移动一块图像时,需要实现平滑的过渡效果。利用坐标变换,计算出每次移动的距离,然后逐步更新图像位置。 3. 缓动算法:为了增加游戏的流畅感,可以引入缓动函数,使图像块在移动...
本文主要讨论如何使用插值算法在J2ME环境中实现图片的放大和缩小。首先,我们需要理解图像缩放的基本原理。 1. 图像缩放的基本思想: 图像放大或缩小涉及到图像坐标系统的变换。在放大图像时,新的目标图像坐标可能...