微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cocos2d-x 3.4 之 消灭星星 > 第二篇 <

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************


这个,要说一下,

本系列文章,我是边写边发,所以可能前后有些改动。


上篇文章,已经做到了 游戏场景,点击星星,使其高亮状态。

这篇文章,将游戏逻辑玩法搞定:

> 星星 高亮状态 再次点击,消除

> 星星消除后,剩下的星星整合(下落或左移)

> 检测是否有可消除的星星,没有则跳转到 游戏结束界面



正文:


1. 星星 高亮状态下的消除

触摸事件函数 onTouchBegan需要重写一下:

// 触摸事件
bool GameScene::onTouchBegan(Touch *touch,Event *unused)	{
	
	auto location = touch->getLocation();
	Star* sta;
	sta = sTarofPoint(&location);
	
	// 当前对象不为空
	if( sta )	{
		// 看该 星星 处于什么状态
		if( sta->getdisplayMode() == disPLAY_MODE_norMAL )	{

			// 初始化记忆地图mapR+恢复普通状态
			for( int i = 0 ; i < ROWS ; i++ )	{
				for( int j = 0 ; j <COLS ; j++ )	{
					mapR[i][j] = false;
					if( map[i][j]!=NULL )
						map[i][j]->setdisplayMode(disPLAY_MODE_norMAL);
				}
			}

			// 如果只有当前一个星星这个颜色,不要让它处于高亮状态
			if( waitPop(sta->getRow(),sta->getCol()) == 1 )	{
				mapR[sta->getRow()][sta->getCol()]=false;
				sta->setdisplayMode(disPLAY_MODE_norMAL);
			}
		}
		else
		{
			deleteStar();
		}
		
	}

	return true;
}

在 所触摸的星星 非空的前提下,

判断该星星是否为高亮状态,如果不是,则初始化mapR,并将所有 星星 的显示状态恢复成 普通,

注意,这里所有星星的显示状态中,要把消除掉的过滤掉,否则会出错的。

然后是 deleteStar函数

void GameScene::deleteStar( void )
{
	int r,c;
	for( r = 0 ; r < ROWS ; r++ )	{
		for( c = 0 ;c < COLS ; c++ )	{
			if( mapR[r][c] == true )	{	
				// popStar(map[i][j]);

				map[r][c]->removeFromParent();
				map[r][c]=NULL;
			}
		}
	}

}

这里的popStar函数,是用来后期加一些特效啥的,先保留一下。

注意,在删除某个星星的时候,不要忘了 removeFromParent,将该对象从父节点拿掉。


还有一点,在本类构造函数时候,要对 mapR数组初始化,

可以用 memset,也可以两个for循环,甚至你写N个false赋值也没问题...

这里我用的memset,但要包含 string.h 头文件

GameScene::GameScene()	
: starSheet(NULL),mapLBX ( (GAME_SCREEN_WIDTH - STAR_WIDTH * COLS - (COLS - 1) * BOADER_WIDTH) / 2 ),mapLBY ( (GAME_SCREEN_HEIGHT - STAR_WIDTH * ROWS - (ROWS - 1) * BOADER_WIDTH) / 2 )
{
	// 初始化 mapR 数组(string.h 头文件)
	memset(mapR,false,sizeof(mapR));
}

现在,我们就可以将高亮的 星星 删除掉了

演示一下:(PS:一直想用GIF演示,但是没找到合适的GIF录制工具(GIFCAM不好用),求大家推荐一款)





2.消除后的整合

在将星星消除后,我们要将剩余的星星聚起来,

所有的星星就是向左下角移动,先向下,再向左....

说一下思路:

向下归拢: 按列为单位,每列中从下往上找,

若该对象为空,将上面第一个不为空的,落下来;

然后再向上找,直到最后。

向左归拢:依旧按列为单位,先判断每列第一行是否为空,

若为空,需要将右面的平移动过来,(因为先下落,再左移,如果第一行为空,上面肯定也为空,所以可以平移)

要注意,这个与下落不一样,每列向左平移相同距离(不是补齐)

Ok,实现起来就是这样:

void GameScene::adjustStar( )
{
	int r,c;
	// 向下归拢
	for( c = 0 ; c < COLS ; c++ )	{
		for( r = 0 ; r < ROWS-1 ; r++ )	{
			if( map[r][c] == NULL )	{
				for( int newR = r+1 ; newR < ROWS ; newR++ )	{
					Star* sta = map[newR][c];
					if( sta != NULL )	{

						map[r][c] = sta;
						map[newR][c] = NULL;

						Point startPosition = sta->getPosition();
						Point endPosition = positionOfItem(r,c);
						float speed = (startPosition.y - endPosition.y) / GAME_SCREEN_HEIGHT*2;
						sta->stopAllActions();
						sta->runAction(Moveto::create(speed,endPosition));
						sta->setRow(r);

						break;
					}
				}
			}
		}
	}

	// 向左归拢
	for( c = 0 ; c < COLS-1 ; c++ )	
		if( map[0][c] == NULL )	{
			for( int newC=c+1; newC < COLS ; newC++ )	{
				if( map[0][newC] != NULL )	{
					for( int moveR = 0 ; moveR < ROWS ; moveR++ )	{
						Star* sta = map[moveR][newC];
						
						if( sta!=NULL )	{
							map[moveR][c] = sta;
							map[moveR][newC] = NULL;

							Point startPosition = sta->getPosition();
							Point endPosition = positionOfItem(moveR,c);
							float speed = (startPosition.x - endPosition.x) / GAME_SCREEN_WIDTH*2;
							sta->stopAllActions();
							sta->runAction(Moveto::create(speed,endPosition));
							sta->setCol(c);
						}
					}
					break;
				}
			}
		}
}

一个非常重要一点,在runAction之前,一定要 stopAllActions!!!

就这一句,我调了一下午,~~o(>_<)o ~~

演示一下:(PS:一直想用GIF演示,但是没找到合适的GIF录制工具(GIFCAM不好用),求大家推荐一款)





3.判断游戏是否结束

这个相对来说就简单很多,因为数组不大,直接遍历,

将 本对象 与上下左右四个方向上对象比较,

如果有同颜色,直接返回false(表示 未结束)

遍历结束后,若没有出现相同颜色的,返回true(表示 结束)

bool GameScene::isFinish( )
{
	int i,r,c;
	// 四个方向 
	int search[4][2]={-1,1,-1};

	for( r = 0 ; r < ROWS ; r++ )	{
		for( c = 0 ; c < COLS ; c++ )	{
			if( !map[r][c] )	continue;

			for( i = 0 ; i < 4 ; i++ )	{
				int nr = r + search[i][0];
				int nc = c + search[i][1];

				if( nr>=0 && nr<ROWS && nc>=0 && nc<COLS )	{
					if( map[nr][nc]!=NULL )	{
						if( map[r][c]->getImgIndex() == map[nr][nc]->getImgIndex() )
							return false;
					}
				}
			}
		}
	}

	return true;
}

接下来,简单设置一下,跳转什么的,就可以了。


加新的场景(主界面场景)及跳转那些就不再列出了,直接看下面的源码吧。


游戏大体逻辑已经搞定了,

接下来就是一些增分性内容了,

分数、动画、还有我最想练的 粒子特效~



本篇文章源码: > 这里 <



********************************************

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建