cocos2dx实战游戏开发之【别踩白块】------游戏逻辑的实现【完结篇】

                     【别踩白块】游戏实战开发之游戏逻辑的实现

           

             大家好,我是Lampard------是一位从事cocos开发的游戏小白。

             如果各位大家有更好的建议,欢迎在下方评论,谢谢!!!

 

         今天要介绍的是游戏主菜单场景的实现:

             这款游戏的游戏逻辑很简单,主要是分为:

           (1)实现黑白块行的实现

             在上一篇的博客上面我们已经定义过了Block砖块类,所以我们初始化黑白块行时,我们只需要用随机数选取一个位置放置白块,然后用一个循环,从左到右依次的create砖块类,普通的位置放置黑块,当i==blockIndex时放置白块。并用LineCount来记录行的位置。

void GameLayer::addNormalLine(int LineIndex) {

	Block *block;
	int blockIndex = rand() % 4;

	for (int i = 0; i < 4; i++) {

		block = Block::createWithArgs(blockIndex==i?Color3B::BLACK:Color3B::WHITE,Size(vsable.width/4-1,vsable.height/4-1), "", 20, Color4B::BLACK);
		this->addChild(block);

		block->setPosition(i*vsable.width / 4, LineIndex*vsable.height / 4);
		block->setLineIndex(LineIndex);
	}

	LineCount++;
}

           (2)黑白块行的移动

               移动函数包含了游戏成功界面的实现,首先我们要判断游戏是否已经结束,如果已经结束了,则切换到成功界面。如果没有结束,则把存放砖块的向量遍历,然后从第0行开始,把砖块沿着y轴放向向下移动一行。然后在第四行上面新建一行新的砖块行进行填充。

void GameLayer::moveDown() {
	
	// 判断是否结束
	if (LineCount < 25) {
		addNormalLine(4);
	}
	else 
	{
		log("%.1f",Time);
		Director::getInstance()->replaceScene(WinLayer::createScene());

	}

	auto bs = Block::getBlocks();
	for (auto it = bs->begin(); it != bs->end(); it++) {
		(*it)->moveDown();

	}

}

           (3)游戏时间的记录

             因为我们要在胜利场景中显示游戏所用的时间,所以我们需要设置一个计时器,来记录全局变量Time,TIME我保存在了存放全局变量的Global类中。

void GameLayer::addTime(float dt) {

	Time=Time+0.1;

}

           (4)用户操作的监听以及游戏失败的判断

              监听函数我们使用单点触摸类来实现,然后判断所触摸的点是否在第一行,因为我们游戏里面,第一行时用户交互行,所以一切不在第一行的触摸不予以理会。当触摸点在第一行上时,则进行判断,所触摸的点对应的砖块的颜色。如果颜色等于黑色,则把黑色的砖块变黑,然后把游戏行进行下移。当触摸点对应的砖块为白块时,则跳转到失败界面。

auto Listener = EventListenerTouchOneByOne::create();
	Listener->onTouchBegan = [this](Touch* t, Event* e) {
		log("Ontouch");

		auto bs = Block::getBlocks();
		Block* block;

		for (auto it = bs->begin(); it != bs->end(); it++) {

			block = *it;
			if (block->getLineIndex() == 1 &&                       // 用户点击的点事在第一行并且发生碰撞的点事在block这个精灵内部的话,则执行游戏逻辑
				block->getBoundingBox().containsPoint(t->getLocation()))  // 砖块的内部含触摸点
			{
				if (block->getColor() == Color3B::BLACK) {
					block->setColor(Color3B::GRAY);
					this->moveDown();
				}
				else {
					Director::getInstance()->replaceScene(FaildLayer::createScene());
				}

				break;
			}
		}

		return false;
	};

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

              

 

           至此,我们的游戏【别踩白块】系列所有的游戏逻辑已经实现。

           感谢阅读,谢谢大家!!!

               

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值