Cocos2dx3.2 Crazy Tetris update 定时更新 游戏逻辑处理

现在,对于游戏的基本准备都已经做好,之后需要考虑的,就是游戏逻辑的处理,主要考虑一下几个方面:

1 判断方块是否已经落下停止,并下落新的方块;

2 方块落下后,判断是否符合消行条件,进行消行;

3 根据下落或者消行进行计分。

这些判断,需要定时处理,因此这里需要使用到默认更新的update。

在初始化中,需要调用:

this->scheduleUpdate();

如果需要停止更新,可以调用:

this->unscheduleUpdate();

这样,就可以在void update(float delaty)函数中进行默认更新的处理。另外,还可以使用:

void schedule(cocos2d::SEL_SCHEDULE(my_update_func));
void schedule(cocos2d::SEL_SCHEDULE(my_update_func), float interval);
void schedule(cocos2d::SEL_SCHEDULE(my_update_func), float interval, unsigned int repeat, float delaty);

这三个重载函数可以调用自己定义的更新函数my_update_func,并且可以设置一些定时信息。

同样的,如果要取消可以使用:

this->unschedule(cocos2d::SEL_SCHEDULE(my_update_func));

这里,还有仅在一定时间后调用一次的方法:

this->scheduleOnce(cocos2d::SEL_SCHEDULE(my_update_func), float delaty);

开启update后,我们就可以在函数中进行我们的逻辑处理。

首先,是关于如何判断方块已经落下,我这里是判断其在连续的几次update中,y轴变化很微小,即判断其已经落下:

if(std::fabs(currentBlock->getPositionY() - lastPositionY) <= 0.5f && times >= 80)

同时,需要判断落下方块的位置,如果已经到达顶端,则game over:

if(currentBlock->getPositionX() >= visibleSize.width/2 - 50 && currentBlock->getPositionX() <= visibleSize.width/2 + 50 && currentBlock->getPositionY() >=visibleSize.height/2 + 220)
{
	auto newScene = GameOver::createScene(score);
	Director::getInstance()->replaceScene(CCTransitionFade::create(1.5, newScene));
}

然后,是判断是否达到消行条件,如果达到消行条件,就应当进行消行处理:

float yStart = visibleSize.height/2 - 250;
for(int i=0; i<20; i++)
{
	float area = 0;
	for(int j=0; j<blockSet->size(); j++)
	{
		BaseBlock * sprite = blockSet->at(j);
		area += sprite->calculaArea(yStart + 25*i, yStart + 25*(i+1));
	}

	if(area >= 6000)
	{
		Vector<BaseBlock *> * tempBlock = new Vector<BaseBlock *>();
		for(int k=0; k<blockSet->size(); k++)
		{
			BaseBlock * sprite = blockSet->at(k);
			Vector<BaseBlock *> * vecShapes = sprite->doubleLineCutting(yStart + 25*i, yStart + 25*(i+1));

			if(vecShapes != NULL)
			{
				if(vecShapes->size() == 1)
				{
					blockSet->erase(k);
					k--;

					this->removeChild(sprite);
				}
				else
				{
					blockSet->erase(k);
					k--;

					this->addChild(vecShapes->at(0), 2);
					tempBlock->pushBack(vecShapes->at(0));

					this->addChild(vecShapes->at(1), 2);
					tempBlock->pushBack(vecShapes->at(1));

					this->removeChild(sprite);
				}
			}
		}

		for(int k=0; k<tempBlock->size(); k++)
		{
			blockSet->pushBack(tempBlock->at(k));
		}

		if(scoreBase == 0) scoreBase = 1;
		else scoreBase *= 2;
	}
}

最后,就是关于如何计分。我这里计分方式是,每次下落+10分,每次消行,根据一次性消除的多少,计100、200、400、800...分。

因此,在判断方块落下时,添加代码:

score += 10;

在消行成功时:

score = score + scoreBase * 100;

最终将更新的分数显示在得分栏:

char * scoreStringTemp = new char[256];
std::sprintf(&scoreStringTemp[0], "%d", score);
std::string scoreString = scoreStringTemp;

scoreLabel->setString(scoreString);

同时这里需要生成新的下落的方块:

//产生下一个方块
void GameView::buildNextBlock()
{
	//TODO
	Size visibleSize = Director::getInstance()->getVisibleSize();
	Vec2 origin = Director::getInstance()->getVisibleOrigin();

	if(nextBlock == NULL)
	{
		currentBlock = randomBuildBlock();
	}
	else
	{
		currentBlock = nextBlock;
	}

	currentBlock->setPosition(origin.x + visibleSize.width/2, origin.y + visibleSize.height/2 + 220);
	currentBlock->getPhysicsBody()->setEnable(true);
	nextBlock = randomBuildBlock();
	nextBlock->setPosition(origin.x + 415, visibleSize.height/2 + 200);
	nextBlock->getPhysicsBody()->setEnable(false);
}

关于制作游戏相关其他博客的目录,我放在利用Cocos2dx3.2制作重力版俄罗斯方块(Crazy
Tetris)

时间: 2024-08-05 02:35:35

Cocos2dx3.2 Crazy Tetris update 定时更新 游戏逻辑处理的相关文章

Cocos2dx3.2 Crazy Tetris 游戏输入(键盘事件,重力事件,触摸屏事件)

游戏基本的逻辑功能之前已经完成,之后的问题就是如何去控制游戏中的方块.在电脑上,很显然就是使用键盘最为直接,而在手机上,考虑上要让操作方便,这里采用的是用重力感应控制左右移动,点击屏幕进行方块的旋转. 下面,就是加入这些事件的方法: 加入键盘事件,需要重写方法: virtual void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event); virtual void onKeyReleased(

Cocos2dx3.2 Crazy Tetris 绘制不规则方块 遮罩(ClippingNode的使用)

前面已经思考了可能遇到的消除和面积判定问题,那么接下来的问题就是如何显示这些由于消除可能引出的不规则图形. 在这里,我使用了ClippingNode(遮罩).关于ClippingNode网上的介绍都非常仔细,因此我在这里只是简单的说一下: 正如他的名字一样,他本身也是一个节点,因此可以参考我的最开始的一篇关于节点树的博文,使用他时,需要将其添加到另外一个节点中. 使用时需要注意的是要向其中添加模板(stencil)和底板.Stencil的意思就是类似模具一样的东西,可以想象,如果我们将模具的形状

Cocos2dx3.2 Crazy Tetris 由于遮罩引起的部分手机白屏

上一章是说明使用ClipplingNode制作遮罩,以显示不规则图形.但是这样一直到Android端,却在部分手机中发生了问题. 具体问题表现为:白屏,只有边界(右上角)有矩形色块. 这里其实是框架对Android手机引用OennGL时,设置上没有启用stencil buff的问题. 解决方案,在onCreateView构造函数中添加: Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); glSurface

linux下svn定时更新项目

方法一.用shell脚本定时更新项目 1.进入网站的根目录,假设项目位置放在/var/www/test cd /var/www/test 2.建立脚本文件update.sh,分两步进行.首先利用touch命令创建,之后使用vim进行编辑. touch update.sh vim update.sh 输入以下内容 #!/bin/sh while true do svn update --username 你的svn用户名 --password 你的svn密码 sleep 60 done 这里我设置

Mysql命令详细汇总[未完][不定时更新]

先从最最最基础的开始 一.登录/退出 登录:mysql -h hostname -u username -p 退出:exit; 二.导入/导出[注意:这是在shell下直接敲命令,不用也不能登录mysql] 导入:mysql -hostname -u username -p < filepath/filename.sql 导出:mysqldump -hostname -u username -p > filepath/filename.sql 同时也可以登录mysql使用source命令 导入

创建yum本地仓库,将阿里仓库同步到本地,并定时更新

很多时候为了加速自己内部的rpm包安装速度,都会搭建自己的yum源仓库,而使用系统光盘自带的源,由于软件版本比较落后,所以不太适用,而大家都在用的阿里仓库比较好用,所以就想到了把阿里仓库的rpm全部拉到本地,并做yum仓库的定时更新.这样既能保证软件包是最新的,也能保证软件的安装速度.那么下面来具体实施,搭建自己的yum本地仓库,并定时从阿里仓库同步过来. 第一步:下载阿里镜像的repo安装包,centos6就下载6的,7的就下载7的地址:https://mirrors.aliyun.com/r

iOS 属性修饰符记录 --不定时更新

重新审视了一下OC在属性修饰符,特意记录一下来.以后不定时更新 > retain:只有在非ARC下才会有效,所有如果在ARC下使用了retain修饰也白搭 如以下的data属性用retain修饰: #import <UIKit/UIKit.h> @interface MyView : UIView @property(nonatomic, retain) NSMUtableArray* data; @end 在对应的setter方法中,会以如下代码实现: if (_data != new

Android学习笔记(不定时更新)

在很久之前,我就想写写博客,不过本人比较懒,这几天心血来潮,决定开写博客,因为学习,实习,面试关系,不会定时更新,以下是我所学的知识,总结分享一下,如有不正确,希望各位轻喷. QQ:545662362.欢迎交流,因为第一次写博客,格式什么的也不是特别好.好了,学习目录如下 1.Android 开发环境搭建 2.Android 应用程序 3.Android 常用基本控件 4.Android 常用高级控件 5.Android 消息与广播 6.Service 后台服务 7.Android 数据存储与服

即日起,博客将不定时更新技术内容

Hello,everybody!这是我新开的博客,以后我会将我收藏的资源以及修改之后的资源发布到这里,希望对大家有所帮助. 同时,本人的个人贴吧也开通了,欢迎有志之士加入我这个大家庭,帮助更多开发者,共同学习,共同进步. 贴吧链接 吕昌辉吧 即日起,博客将不定时更新技术内容,布布扣,bubuko.com