cocos2d-x 3.2 之 别踩白块(第二篇)

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

别踩白块——第二篇

全文摘要

> 监听

> 整个游戏的逻辑

> 游戏结束

> 计时

别踩白块到这里算是一个分号了,

游戏整体逻辑已经交代清除,

但是还不够完善,之后我将完善它,就是说一定还会有第三篇滴~

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

1.监听

别踩白块 这个游戏,需要我们去触摸黑色的块,避免触摸白色的块,所以 触摸事件 必须执行。

我们已经有了 黑白块和开始行的显示了,

在监听器之前,我们要加一些其他的东西,

我们判断触碰的时候,要遍历所有的块,之前提到过,我们把所有块都放在一个Vector中,所以我们需要一个方法,将这个Vector取出来:

// Block.cpp

// 获取所有的块
Vector<Block*> * Block::getBlocks(){
	return Block::blocks;
}

然后就可以加一个监听器,并实现它的逻辑

// HelloWorldScene.cpp

bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    // 获取屏幕大小
	visibleSize= Director::getInstance()->getVisibleSize();
	// 开始游戏
	startGame();

	// 添加监听器
	auto listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan= [this](Touch* t,Event* e){

		auto bs = Block::getBlocks();
		Block *b;
		for (auto it = bs->begin();it!=bs->end();it++)
		{
			b = *it;
			//游戏逻辑的实现
			// 如果点击
			if( b->getLineIndex()==1 && b->getBoundingBox().containsPoint(t->getLocation()) )
			{
				if (b->getColor()==Color3B::BLACK)
				{
					// 触摸到黑色块,就让它变成灰色
					b->setColor(Color3B::GRAY);
				}
				else
				{
					// 未触摸到该行黑色块,就提示 游戏失败
					MessageBox("GameOver","失败");
				}
			}
		}

		return false;
	};

	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

    return true;
}

好的,运行一下,就可以发现在第一行,我们可以实现游戏逻辑啦~

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

2.整个游戏的逻辑

之前实现了第一行的逻辑,就是只能点黑块,不能点白块,

对于整个游戏来说,我们需要在点击正确时,所有的整体向下移动一行,最上面一行产生新的一行。

这些东西,我们要做一个 moveDown函数来实现,在点击黑块,颜色变成灰色以后执行:

// HelloWorldScene.cpp

// 向下移动一行
void HelloWorld::moveDown(){
	// 产生新的一行
	addNormalLine(4);

	auto bs = Block::getBlocks();
	//遍历所有方块,让方块向下移动,最下面的一行消除
	for (auto it = bs->begin();it!=bs->end();it++)
	{
		(*it)->moveDown();
	}
}

向下移动,同时也在 Block类内,继续定义

// Block.cpp 

void Block::moveDown()	{
	Size visibleSize = Director::getInstance()->getVisibleSize();
	this->lineIndex--;
	//时间用0.1秒,移动到指定的位置(X方向不变,Y方向)
	runAction(Sequence::create(MoveTo::create(0.1f,Point(getPositionX(),lineIndex*visibleSize.height/4)),
		CallFunc::create([this](){
			if (lineIndex<0)
			{
				this->removeBlock();
			}
	}),NULL));
}

场景moveDown函数执行位置也知道了

这里还有最重要的一点,当我们找到所触摸的点时候,就不需要继续执行下去了,所以要加一个 break,一旦找到所触摸的块,无论是黑、是白、是灰,都不需要继续继续向下查找下去,所以最后加一个break,跳出循环。

运行一下,整个游戏的逻辑已经实现了。

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

3.游戏结束

本文的别踩白块同网上其他的一样,都是限制步数的,

就是 走50步,然后比谁的时间最短。

之前已经实现了,下移一行这些东西,

所以,需要做的就是,记录行数,全局变量 lineCount,

然后,在到第50行的时候的操作,

如果 已经显示了最后一行(全绿色界面),就无需动作,

如果 还没显示最后一行,需要显示新动作。

总结下来就这几个改动:

moveDown函数:

// HelloWorldScene.cpp

// 向下移动一行
void HelloWorld::moveDown(){

	if( lineCount < 50 )	{
		// 产生新的一行
		addNormalLine(4);
	}
	else if( !isEnd )	{
		addEndLine();
		isEnd = true;
	}

	auto bs = Block::getBlocks();
	//遍历所有方块,让方块向下移动,最下面的一行消除
	for (auto it = bs->begin();it!=bs->end();it++)
	{
		(*it)->moveDown();
	}
}

init函数:

// HelloWorldScene.cpp

bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    // 获取屏幕大小
	visibleSize= Director::getInstance()->getVisibleSize();
	// 开始游戏
	startGame();

	// 添加监听器
	auto listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan= [this](Touch* t,Event* e){

		auto bs = Block::getBlocks();
		Block *b;
		for (auto it = bs->begin();it!=bs->end();it++)
		{
			b = *it;
			//游戏逻辑的实现
			// 如果点击
			if( b->getLineIndex()==1 && b->getBoundingBox().containsPoint(t->getLocation()) )
			{
				if (b->getColor()==Color3B::BLACK)
				{
					// 触摸到黑色块,就让它变成灰色
					b->setColor(Color3B::GRAY);
					this->moveDown();
				}
				else if( b->getColor()==Color3B::GREEN)
				{
					this->moveDown();
				}
				else
				{
					// 未触摸到该行黑色块,就提示 游戏失败
					MessageBox("GameOver","失败");
				}
				break;
			}
		}

		return false;
	};

	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

    return true;
}

然后,不要忘了在 startGame函数中,对 isEnd 和 lineCount进行初始化哟。

总算可以开始 和 结束,像一个游戏啦。

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

4.计时

明确一点先,我们的 块是移动的,但时间是固定位置不变的。

代表什么? 代表着两个不是在同一层,

所以我们可以分层操作,不需要两层,只需要将块放在游戏层,而时间这个Label直接在底层就行了

像这样:

// HelloWorldScene.cpp   init函数

	// 添加游戏层
	gameLayer = Node::create();
	addChild(gameLayer);

	// 添加时间
	timerLabel = Label::create();
	timerLabel ->setTextColor(Color4B::BLUE);
	timerLabel->setSystemFontSize(48);
	timerLabel->setPosition(visibleSize.width/2,visibleSize.height-100);
	addChild(timerLabel);

然后,对于时间,三个函数,开始、停止 和 更新

void HelloWorld::startTimer()
{
	if (!isTimerRunning)
	{
		scheduleUpdate();
		//获取到了clock的时间
		startTime = clock();

		isTimerRunning = true;
	}
}

void HelloWorld::stopTimer()
{
	if (isTimerRunning)
	{
		unscheduleUpdate();

		isTimerRunning = false;
	}
}

void HelloWorld::update( float dt )
{
	//时间的偏差
	long offset = clock()-startTime;
	//强转offset为double类型
	timerLabel->setString(StringUtils::format("%g",((double)offset)/1000));
}

然后在,触碰判断那,设定什么时候可以 startTimer ,什么时候需要 stopTimer

// HelloWorldScene.cpp  init函数  监听器部分

// 添加监听器
	auto listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan= [this](Touch* t,Event* e){

		auto bs = Block::getBlocks();
		Block *b;
		for (auto it = bs->begin();it!=bs->end();it++)
		{
			b = *it;
			//游戏逻辑的实现
			// 如果点击
			if( b->getLineIndex()==1 && b->getBoundingBox().containsPoint(t->getLocation()) )
			{
				if (b->getColor()==Color3B::BLACK)
				{
					if (!isTimerRunning)
					{
						this->startTimer();
					}
					// 触摸到黑色块,就让它变成灰色
					b->setColor(Color3B::GRAY);
					this->moveDown();
				}
				else if( b->getColor()==Color3B::GREEN)
				{
					this->moveDown();
					this->stopTimer();
				}
				else
				{
					// 未触摸到该行黑色块,就提示 游戏失败
					MessageBox("GameOver","失败");
				}
				break;
			}
		}

		return false;
	};

Ok,现在我们就可以进行计时了。

至此,简单的 别踩白块 完毕。

只是简单地做了一下,别踩白块

但是,这就结束了吗?    NO!!

我肯定会继续修饰一下它,敬请期待吧~

本文源码: >
这里 <

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

时间: 2024-10-12 15:34:59

cocos2d-x 3.2 之 别踩白块(第二篇)的相关文章

C++用EGE简单实现别踩白块游戏

本项目已开源:https://github.com/wmpscc/AvoidBlank 关于EGE 介绍:EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在. 详情见EGE官网 下载:官网提供的下载地址 安装方法一 简单示例 #include <graphics.h> int main() { //初始化为640*480大小 initgraph(6

Cocos2dx学习之-----别踩白块V1.0

学了点COCOS2DX,一直感觉也没什么大意思,所以就找个教程做个小游戏出来,反正国庆在校也没啥事,自娱自乐. PS:我用的版本是cocos2dx3.2 一.创建项目 cocos new -p com.donttouchwhiteblock.xuran -l cpp -d . 二.创建block类 因为别猜白块里面最重要的一个元素就是"块",所以我们要为这个元素创建一个类,然后实例化一些方法,以便完成游戏中的诸多行为 首先是gameblock.h文件 #pragma once #inc

2cocos2dx别踩白块游戏案例

 1 建立一个别踩白块的项目dtwb(Don'ttouch white block) 2 修改main.cpp中的代码 3 修改AppDelegate.cpp中的代码 4 案例代码 Block.h #ifndef __BLOCK_H__ #define __BLOCK_H__ #include "cocos2d.h" USING_NS_CC; class Block :public CCSprite { public: //分別表示块大小,块颜色,块中的字符串,字的大小,颜色 st

Cocos2d-x 3.2 之 别踩白块(第三篇)

***************************************转载请注明出处:http://blog.csdn.net/lttree****************************************** 别踩白块,第三篇... 距离第二篇都快过去半年了... 一直没抽出时间来完善它, 这次简单的完善一下: > 触摸屏蔽 > 最高分的存储 > 时间显示优化 > 初始化优化 主要就是这几方面的优化了,其他杂七杂八的,就没有列出了,可以参考源码 1. 触摸屏

cocos2d-x 3.2 之 别踩白块(第一篇)

***************************************转载请注明出处:http://blog.csdn.net/lttree****************************************** 前言: 快过年了,事也不少,只能找一些简单的忙活下啦, 这游戏不知道还有没有人记得= =. 开发环境 -- VS2012 + cocos2d-x 3.2 正文: 闲话不多说,现在开始做我们的 别踩白块. 与之前的相比,这次的游戏会简单许多, 首先新建一个项目,然后修

小游戏--别踩白块

有图有真相,先上图再说 照旧贴出代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>别踩白块</title> <style type="text/cs

2015-03-27---cocos2dx别踩白块

今天博主总算沉下心来写了些代码,今天开始写别踩白块,写出来个大概能点的程序了,现在白块能点,也能自动销毁,就是随机数生成算法还是有一点问题,还有没有判断结束,等明天把这些完善完善继续学习cocos2dx,然后,预计过几天开始项目训练. 今天照常学车,而且明天还要去,所以今天当然要早点睡觉啦,我去刷牙,然后明天继续练车,加油啦,哈哈. 等明天如果程序写出来了,把源代码共享出来

jquery之别踩白块游戏的实现

转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5687112.html 前端学习要告一段落了,也没机会写什么像样的东西,然后无意中想起某人以前给我玩了一下别踩白块的游戏,手残还被嘲讽了下,现在想起来觉得这游戏实现起来也不难,于是上星期用jquery写了一个别踩白块的小游戏,就像当初学python的时候一样写了一个2048.然后今天正好抽个时间写个博客纪录下,算是对前一段时间学习的总结,没有玩过的可以去下一个原版的来玩一下,游戏很简单,就是从不断下落的方块中点击黑

JS实现别踩白块小游戏

最近有朋友找我用JS帮忙仿做一个别踩白块的小游戏程序,但他给的源代码较麻烦,而且没有注释,理解起来很无力,我就以自己的想法自己做了这个小游戏,主要是应用JS对DOM和数组的操作. 程序思路:如图:将游戏区域的CSS设置为相对定位.溢出隐藏;两块“游戏板”上分别排布着24块方格,黑色每行随机产生一个,“游戏板”向下滚动并交替显示,将每个操作板的黑块位置存入数组,每次点击时将数组pop出来进行比对(我觉得亮点在这……). 这里是游戏的GitHub地址,大家可以到里点击中部菜单最右边的的Downloa