cocos2d-x【小菜在学习】做个小游戏俄罗斯方块(二)

小菜来继续小游戏俄罗斯方块啦!

有什么更好的做法,请大家给点意见,小菜会认真去思考学习

此集实现的是方块图像的下降以及下降后消行(左右移动在第三集)。

首先创建在之前创建的BlockManager中

头文件中定义

private:
	cocos2d::CCArray *_newBlock;  //上集就需要定义的
	cocos2d::CCArray *_saveBlock;
	cocos2d::CCArray *_isenough;

bool BlockManager::init()
{
	bool bRect=false;
	do 
	{
		CC_BREAK_IF(!CCLayer::init());
		 //初始化第一个图像                     
                 _newBlock=type(picture3);
		
		//下降定时器
		this->schedule(schedule_selector(BlockManager::DownUpdate),1.0f);
		//判断消行以及重排定时器
		this->schedule(schedule_selector(BlockManager::update));
		this->setTouchEnabled(true);
		bRect=true;
	} while (0);
	return bRect;
}
在DownUpdate函数中写

void BlockManager::DownUpdate( float t )
{
	int minblock=12;
	int outline=0;
	bool move=true;
	for (int j=0;j<_newBlock->count();j++)
	{
		Block *block1=(Block *)_newBlock->objectAtIndex(j);
		for (int k=0;k<_saveBlock->count();k++)
		{
			Block *block2=(Block *)_saveBlock->objectAtIndex(k);
			//下面是否有砖块
			if (block1->col==block2->col&&block1->row-1==block2->row)
			{
				move=false;
				break;
			}
		}
		if (minblock>block1->row)
		{
			//得出最下面的砖块的行数
			minblock=block1->row;
		}
	}

	for (int i=0;i<_newBlock->count();i++)
	{
		Block *block=(Block *)_newBlock->objectAtIndex(i);
		//最小的行数不为0而且下面没有砖块
		if (move&&minblock!=0)
		{		   
			--block->row;
		}else{
			_saveBlock->addObject(block);
			//当所有砖块都存入_saveBlock后
			if (i==_newBlock->count()-1)
			{
				//随即产生砖块
				Picture picture=Picture(rand()%7);
				_newBlock->removeAllObjects();
				_newBlock=type(picture);
				break;
			}
		}
	}
	//如果超过界限为游戏结束
	for(int i=0;i<_saveBlock->count();i++)
	{
	     Block *block=(Block*)_saveBlock->objectAtIndex(i);
		 if (outline<block->row)
		 {
			 outline=block->row;
		 }
		 if (outline>11)//及高度大于十二格的时候
		 {
			 _saveBlock->removeAllObjects();
		 }
	}

}
Update函数

void BlockManager::update( float date )
{
	int overrow=-1;
        //将十二行数每一个与固定在下面_saveBlock数组计数如果没一行有十二个数的话就删除
	for (int j=0;j<12;j++)
	{
		for (int i=0;i<_saveBlock->count();i++)
		{
			Block* block=(Block *)_saveBlock->objectAtIndex(i);
			if (block->row==j)
			{
				_isenough->addObject(block);		
			}
		         //是否满一行,消除
			if (_isenough->count()>11)
			{
			     _saveBlock->removeObjectsInArray(_isenough);
				 overrow=block->row;
				 break;
			}
		}

		_isenough->removeAllObjects();
	}
        //消行上面的方块全部下移
	if (overrow!=-1) 		
	{
	 	//消行后,要将上面的砖块往下移动
	 	for (int i=0;i<_saveBlock->count();i++)
	 	{
	 		Block* block=(Block *)_saveBlock->objectAtIndex(i);
	 		if(block->row>overrow){
	 			block->row--;
	 		}
	 	}
		overrow=-1;
	 }
	
}
这样就实现了下落消行下移的本集功能了。




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值