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,0,1,0,0,1,0,-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;
}

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

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

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

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

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

本篇文章源码:  >
这里 <

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

时间: 2024-11-08 22:23:39

Cocos2d-x 3.4 之 消灭星星 > 第二篇 <的相关文章

Cocos2d JS 之消灭星星(九) 处理星星类之——移动和消灭星星

1 /* 2 * 本层拥有处理星星的实例化以及对星星的操作 3 * 1/排列星星 4 * 2/移动和删除星星 5 */ 6 var GameStarLayout = ccui.Layout.extend( 7 { 8 size:null, 9 starArr:[],//存放点击与被点击状态的星星资源 10 starObjArr:[],//存放游戏中星星的二位数组 11 firstTouchStar:null,//第一次选择的星星,用于判断两次选择的星星颜色是否一致 12 isSelected:f

Cocos2d-x 3.4 之 消灭星星 &gt; 第三篇(终) &lt;

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 满满的泪啊, 从5月22日写的第一篇,于6月6日结束. 中间各种课程.上机.大作业穿插,焦头烂额的, 最后终于做出来差不多的样子了... PS:写博客这几天,宿舍一直停电状态...真是醉了.. 本篇实现的功能: > 粒子特效 > 音乐音效 > 漂浮文字

Cocos2d-x 3.4 之 消灭星星 &amp;gt; 第三篇(终) &amp;lt;

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 满满的泪啊. 从5月22日写的第一篇,于6月6日结束. 中间各种课程.上机.大作业穿插.焦头烂额的. 最后最终做出来几乎相同的样子了.. . PS:写博客这几天.宿舍一直停电状态.. .真是醉了.. 本篇实现的功能: > 粒子特效 > 音乐音效 > 漂浮

cocos2d-x 仿 消灭星星(满天星) 源码+解析

今天要写一篇关于cocos2d-x的实战教程, 仿消灭星星(满天星)...... 如果你不知道什么是消灭星星.. 百度! 这是大一刚学cocos2d-x时候写的一个例子,  今天整理文件的时候发现的. 觉得直接丢了怪可惜的, 就稍微整理了下, 写篇教程让大家一起学习. 当然, 在这之前你如果没有cocos2d-x 基础知识... 那么还是先学习了再参考吧. 此篇博文作为cocos2d-x 实战练习, 并非教学教程. 首先, 看下游戏运行效果.                    可以从我的gi

体验《消灭星星》之移植《星星》

最近在360手机助手下载了5-6款消灭星星都玩了几关,发现这些版本游戏体验非常差.好吧,我只想好好玩星星,不要这么搞啊,于是乎去豌豆夹.91助手下载此游戏,额...这些市场该游戏下载量排名靠前的,也已被在360助手发布该游戏的开发商占领. 额...,也不知android应用分发市场审核app游戏是何标准,个人开发者好不容易开发完某单机游戏,提交到各应用市场,就是各种被拒,被拒理由各种奇葩,此处就不多了,我们心中的痛. 体验完各应用市场该游戏,总结报告: 1.竟然英文版的星星下载量也有20w(用户

quick cocos2d-x重写消灭星星

之前学习过c++在cocos2d-x游戏引擎上实现的消灭星星游戏,为了熟悉quick cocos2d-x以及Lua语言,我使用2.1.4版本的quick cocos2d-x重写了消灭星星,不过只是实现了其基本的消除,移动,计分以及过关等功能,一些文字漂移.粒子特效等功能有待以后完善. 该游戏的界面非常简单,只有两个场景的切换,首先是一个开始场景,该场景下有一个背景图片以及一个按钮,点击该按钮可以进入到游戏场景界面.开始场景的主要实现代码如下: 1 function MainScene:ctor(

Cocos2d-x 3.4 之 消灭星星 &gt;前言+第一篇&lt;

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 前言: 五一假期完毕,学校放运动会四天小长假, 去泰山耍了耍,从红门爬到顶,累惨了... 但在 玉皇顶 俯瞰山河的感觉真是不错的呀, 在山上无人的地方,静静的坐了一段时间,瞎想了很多, 回来,还是要接着奋斗下去呀.... 这次是用 cocos2d-x 3.4 开

Pascal小游戏 不要消灭星星

不要消灭星星 Pascal小游戏 Chaobs改编自pascal吧 控制台小游戏嘛,就当是练习一下结构化的写法. program wxtw; uses crt; type      zbdy=record      x,y:integer; end; var n,i,x,y,t,sjs:integer;    ml:char; zb: array [1..12] of zbdy; begin    randomize;    sjs:=random(3);    zb[1].x:=15; zb[

大一课设 消灭星星

1 #include<iostream> 2 #include<graphics.h> 3 #include<windows.h> 4 #include<cstring> 5 #include<cmath> 6 #include<cstring> 7 #include<cstdlib> 8 #include<cstdio> 9 #include<time.h> 10 #include <pth