cocos2d-x3.6 连连看随机地图实现
我的博客:http://blog.csdn.net/dawn_moon
这一节来讲地图初始化实现。
连连看地图初始化有非常多实现方式,大概会有下面几种:
- 每一格的位置随机取图片放上去
- 随机取图片放到随机的位置上去
- 把图片铺满地图。随机打乱位置
我们採用第三种方式。
要注意的是。为了保证最后全部的图片都被消掉,那么全部的图片都要是偶数个。我们採用逐格绘制。每次放两张同样的图片,铺满地图以后,随机打乱。
初始例如以下:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 0 |
0 | 5 | 5 | 6 | 6 | 7 | 7 | 8 | 8 | 0 |
0 | 9 | 9 | 10 | 10 | 11 | 11 | 12 | 12 | 0 |
0 | 13 | 13 | 14 | 14 | 15 | 15 | 16 | 16 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
然后随机打乱就能够了,注意仅仅随机打乱非零的位置。
代码里面怎样实现呢。非常easy。
定义一个二维数组。地图每一格相应一个值。 其值为0表示是一个空格,其它数字就是图片的id。
数组初始化都是0。然后遍历一遍,四个边框还是零,里面的位置按图片id,成对赋值。
我把地图数组赋值和图片绘制分成两部分,先初始化地图数组。然后再画棋盘。看代码:
void GameScene::initMap()
{
// 这里x用来控制地图数组的每格的值,y用来控制两次反转。即每两个格标记同一个值
int x = 1;
int y = 0;
// 数组下标从0開始。这里从1開始遍历,那么最外面一圈就是0不变
for (int i = 1; i < xCount - 1; i++) {
for (int j = 1; j < yCount - 1; j++) {
// 地图数组赋值
mMap[i][j] = x;
// y控制反转。x控制每格值添加。增大到图片总数后从再1開始递增
if (y == 1) {
x++;
y = 0;
if ( x == iconCount) {
x = 1;
}
}else{
y = 1;
}
}
}
change();
drawMap();
}
上面的 change()函数就是随机打乱地图数组,drawMap()函数就是绘制棋盘,讲地图数组相应的图标绘制出来。
接下来看下change()函数:
// 随机改变一下棋局位置
void GameScene::change()
{
// 随机种子
srand((unsigned int)time(NULL));
// 暂时变量,用来交换两个位置的数据
int tempX, tempY, tempM;
// 遍历地图数组,随机交换位置
for (int x = 1; x < xCount - 1 ; x++)
for (int y = 1; y < yCount - 1; y++) {
tempX = 1 + (int)(CCRANDOM_0_1() * (xCount - 2));
tempY = 1 + (int)(CCRANDOM_0_1() * (yCount - 2));
tempM = mMap[x][y];
mMap[x][y] = mMap[tempX][tempY];
mMap[tempX][tempY] = tempM;
}
}
非常easy是吧,不说了。
接着看drawMap()函数:
void GameScene::drawMap()
{
// 绘制棋盘上精灵
for (int x = 0; x < xCount; x++) {
for (int y = 0; y < yCount; y++) {
if (mMap[x][y] > 0) {
char iconName[64] = {0};
// 格式化图片名
sprintf(iconName, "%d.png", mMap[x][y]);
auto position = indextoScreen(x, y);
// 全部图片已经加到帧缓存,这里直接用名字取一帧。创建一个精灵
auto icon = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(iconName));
// icon->setAnchorPoint(Vec2(0, 0));
icon->setPosition(position);
// 设置一个tag,方便兴许识别点击的是那个图标
int tag = (yCount - 2) * ( x - 1 ) + y;
// 这是Z序和tag值,Z序设置大一些确保图标在其它精灵的前面
addChild(icon, 100, tag);
}
}
}
}
代码都加了非常多凝视。应该非常好理解。只是里面有一行凝视掉的代码,是设置锚点的。精灵的默认锚点是(0.5。0.5),也就是中心位置。可是我一開始想把它设为左下角,这样地图铺起来就比較直观。
做到后来做点击连线的时候发现从中间连线会非常麻烦,所以就把这行凝视掉了,直接用默认锚点。
这样做的话,后面的屏幕坐标和地图数组坐标转换就要做一下处理了。后面再讲。
好了。到这里地图就绘制完毕了。
cocos2d-x3.6 连连看随机地图实现的更多相关文章
- Unity 随机地图房间通道生成
之前的博客中已经说了随机房间生成: https://www.cnblogs.com/koshio0219/p/12604383.html 但实现房间生成只是整个地图生成最初最简单的一步.下面讨论如何随 ...
- Unity3d 随机地图生成
2D解析图: 3D地形: 嘿嘿.
- SpriteKit游戏Delve随机生成地牢地图一个Bug的修复
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图 ...
- roguelike地图的随机生成算法
如果要想自己设计一个roguelike游戏,那么需要你有一个随机地图生成,我在indienova上看到一篇文章,描述了一个roguelike算法,然后自己用unity实现了一个下. 原文地址:随机生成 ...
- 《连连看》算法c语言演示(自动连连看)
(图片是游戏的示意图,来自互联网,与本文程序无关) 看题目就知道是写给初学者的,没需要的就别看了,自己都觉得怪无聊的. 很多游戏的耐玩性都来自精巧的算法,特别是人工智能的水平.比如前几天看了著名的Al ...
- cocos2d 消除类游戏简单的算法 (一)
1. 游戏视频演示 2.三消游戏我的理解 上面视频中的游戏.我做了2个星期时间,仅仅能算个简单Demo,还有bug.特效也差点儿没有.感觉三消游戏主要靠磨.越磨越精品. 市场上三消游戏已经超级多了.主 ...
- VBA随机地牢生成
无聊啊--于是,我想做一个随机地图. 但是我很懒,不想做. 但是身体很诚实. 这次是直接在Excel中制作的地图,但是,VB的执行效率很慢,我代码的效率也很慢,导致,一旦地图长宽稍大,就会出现好几分钟 ...
- unity3d 随机添加树木
开放世界随机地图才是最重要的.. 随机生成树木 Terrain.terrainData //获取地形设置 terrainData.treePrototypes {get;set;} //获取或设置树木 ...
- 18.libgdx制作预览图,背景移动循环,改变地图颜色
经过构思,游戏将分为两部分, 1,预览图,只负责展示世界形势 2,根据预览图生成的战役项 现在要记录的是我制作预览图的部分 1.预览图只有实际地图的1/4,首先生成地图(建议不要缩放以前地图,由于误差 ...
随机推荐
- PostgreSql入门命令
1 命令行登录数据库 有两种方式,一是直接在系统shell下执行psql命令:而是先进入psql环境,然后再连接数据库.下面分别给出实例: (1)直接登录 执行命令:psql -h 192.168.1 ...
- CloudEra Email Search
http://blog.cloudera.com/blog/2013/09/email-indexing-using-cloudera-search/ http://blog.cloudera.com ...
- 新装docker 从本地仓库下载
docker:/root# docker images Get http:///var/run/docker.sock/v1.19/images/json: dial unix /var/run/do ...
- Unity2D屏幕适配方案
看了cnblogs里的一篇文章,终于理解了Unity2D的摄像机系统:http://www.cnblogs.com/flyFreeZn/p/4073655.html 我根据他的方案,改写了两种适配方案 ...
- poj3006---素数筛法
#include <stdio.h> #include <stdlib.h> ];//以后都用宏定义 MAX int main()//如要将包括1000000在内的打表,数组就 ...
- 客户端浏览器判断(ios .android)
在开发工程中,我们可能需要判断客户端浏览器的版本而作相应的处理:通常做法是通过浏览器的userAgent去判断浏览器版本,故在此总结下,方便以后使用. <script type="te ...
- css3教程:弹性盒模型
Css3引入了新的盒模型——弹性盒模型,该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用的空间.这与XUL(火狐使用的用户交互语言)相似,其它语言也使用相同的盒模型,如XAML .GladeX ...
- JSthis对象
第一章: this是javascript语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如 function test(){ ; } 随着函数使用场合的不同,this ...
- OC 实现多选参数
在iOS的开发过程中有许多方法都是有可选参数的,例如: + (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_N ...
- 在WPF中将某张表中的数据显示到datagrid
a.在.xaml文件中拖入一个datagrid,然后添加列名,使用Binding="{Binding 数据库中的 列名称}",如下: <DataGrid AutoGenera ...