使用程序自动生成不同是一件几乎不可能的任务 因此找茬游戏的图片还是需要作者自己PS 但是一对图只能使用一次实在是太浪费了
今天看了下Win8版的美女找茬的文件结构 搞清楚了他们的设计
首先处理图片
在原图片的基础上尽可能的修改多的地方 每个修改后的区域另存为图片
用JSON XML或者文本文件记录每个区域的坐标
保存的形式可以用 左上坐标+长宽 或者左上坐标+右下坐标 或者中心坐标+长宽的1/2
无论哪个都是4个整型 =.= 而最后一种格式 似乎于在应用中标识不同之处的矩形中更方便一些 但是生成数据难一点
这个应用使用的是文本文件保存区域的左上和右下坐标
范围以用矩形区域内的图片替换原文件相同区域不会有问题为准
使用图片时
假定 游戏设定中每一关的不同数量相同 为N个 某一对图中修改的数量为M
从一对图像的M个不同点中随机选取N个 同时随机生成N个Boolean
读取源图像为并显示到左右窗口中 然后读取已选中的不同点的信息 (图像和坐标)
如果N个随机Boolean第i个为true 将此区域的图像通过坐标重叠显示在左屏幕的对应位置 如果是false 显示在右屏幕 (或者反之 true右 false左 这个不影响)
检测到鼠标点击事件(或者触屏的话是触摸事件)判断点击坐标是否在已选中的不同点的区域中
是就(通过已读取到的坐标)在左右屏幕同时标识 否就出现错误提示
JAVA语言的伪代码如下:
int imageId = getARandomImageId(MAX_USEABLE_IMAGE_ID); // 随机获得一个图像的ID
Image src = new Image(imageId); // 获得原图片
ImageInfo info = new ImageInfo(imageId); //获得此图片的信息 包括不同的坐标啊什么的
drawIntoScreen(src,LEFT_SCREEN); // 将源图片绘制到左屏幕
drawIntoScreen(src,RIGHT_SCREEN); // 将源图片绘制到右屏幕
int [] diffList = getARandomDiffList(info.getDiffList(),DIFF_NUM_PER_STAGE); // 获得一个随机的图片的N个不同点的列表
Random r = new Random();
for (int i = 0; i < diffList.length; i++) {
drawIntoScreen(info.getDiffImage(i),r.nextBoolean(),info.getDiffX(i),info.getDiffY(i)); // 将不同点的图片绘制到屏幕上
}
startGame(); // 开始游戏 注册计时器 Lisenter什么的
基本上就是这样 剩下的就是计时啊 道具啊什么的...
至于不同点区域的坐标 指望美工人工搞似乎工作量有点大 美工修图完了之后 还得量像素啊 位置啊什么的 然后切下来
可以写个程序自动分析处理完了的图片和原图片 对每个像素逐一进行对比 差异超过阈值为1否则为0 得到差异map
然后对差异map进行分析 获得差异的宽高和中心点 计算出需要切割的坐标和宽高 自动切割存储图片