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

小菜又来了!!!

本期实现的功能为变形以及左右移动的功能

首先说下我变形的原理 以这两个数组变化来控制旋转。

(2,0)(2,1)(2,2)           (0,0)(1,0)(2,0)

(1,0)(1,1)(1,2)           (0,1)(1,1)(2,1)

(0,0)(0,1)(0,2)           (0,2)(1,2)(2,2)

 

首先为了旋转需要,设置保存一个图形的零点。

创建一个类,保存零点坐标

class ZeroPoint : public cocos2d::CCObject
{
public:

	cocos2d::CCPoint pp;

};

再在BlockManager::type(Picture picture )函数总每个类型都加入一个零点,如这样,所以之前所有有_newBlock->count()都要减1

case picture1:
		block1->row=12;
		block1->col=6;
		
		block2->row=13;
		block2->col=6;

		block3->row=13;
		block3->col=5;

		block4->row=13;
		block4->col=7;

		zeropoint->pp=ccp(12,5);

在主要的旋转函数

void BlockManager::changeBlock()
{
	mincol=15;
	minrow=15;
	num=0;
    dmincol=18;
	dmaxcol=0;
	dminrow=18;
	dmaxrow=0;
	a=0;
	b=0;
	bool flag=true;
	bool isin=true;

	for (int i=0;i<_newBlock->count()-1;i++)
	{
		Block *block=(Block *)_newBlock->objectAtIndex(i);
		if (dmincol>block->col)
		{
			dmincol=block->col;
		}
		if (dmaxcol<block->col)
		{
			dmaxcol=block->col;
		}
		if (dminrow>block->row)
		{
			dminrow=block->row;
		}
		if (dmaxrow<block->row)
		{
			dmaxrow=block->row;
		}
	}
	if (dmaxrow-dminrow>=dmaxcol-dmincol)
	{
		num=dmaxrow-dminrow+1;
	}else{
		num=dmaxcol-dmincol+1;
	}
	//求出一个能包住正方形的旋转数组,以为条形有点不一样就特殊出来不按照那个旋转原理,及有了下面num!=5的判断
	CCPoint **pp=new CCPoint *[num];
	for (int i=0;i<num;i++)
	{
		pp[i]=new CCPoint[num];
	}
	if (num!=5)
	{	
		for (int i=0;i<num;i++)
		{
			for (int j=0;j<num;j++)
			{
				pp[i][j]=ccp(num-1-j,i);
			}
		}
	}else{
		for (int i=0;i<num;i++)
		{
			pp[i][0]=ccp(0,i);
		}
		for (int j=0;j<num;j++)
		{
			pp[0][j]=ccp(j,0);
		}
	}
	//求出方块最低点
	for (int i=0;i<_newBlock->count()-1;i++)
	{
		Block *block=(Block*)_newBlock->objectAtIndex(i);
		if (minrow>block->row)
		{
			minrow=block->row;
		}
		if (mincol>block->col)
		{
			mincol=block->col;
		}
	}
	ZeroPoint *zeropoint=(ZeroPoint *)_newBlock->lastObject();
    //零点与最低点对比,再设置为零点  
	if (zeropoint->pp.x<minrow)
	{
		minrow=zeropoint->pp.x;
	}
	if (mincol>zeropoint->pp.y)
	{
		mincol=zeropoint->pp.y;
	}	
	sprintf(str,"minrow:%d",minrow);
	CCLOG(str);
	sprintf(str,"mincol:%d",mincol);
	CCLOG(str);
	for (int i=0;i<_newBlock->count()-1;i++)
	{
		Block *block=(Block*)_newBlock->objectAtIndex(i);
		a=pp[block->row-minrow][block->col-mincol].x;
		b=pp[block->row-minrow][block->col-mincol].y;
		if (b+mincol<0||b+mincol>11)
		{
			isin=false;
			break;
		}
		for (int j=0;j<_saveBlock->count();j++)
		{
			Block *saveblock=(Block*)_saveBlock->objectAtIndex(j);
			if (saveblock->row==a+minrow&&saveblock->col==b+mincol)
			{
				flag=false;
				break;
			}
		}
		if (flag==false)
		{
			break;
		}
	}
	for (int i=0;i<_newBlock->count()-1;i++)
	{
		Block *block=(Block*)_newBlock->objectAtIndex(i);
		if (block->change&&flag&&isin)
		{
			 a=pp[block->row-minrow][block->col-mincol].x;
			 b=pp[block->row-minrow][block->col-mincol].y;
			 block->row=a+minrow;
			 //获得旋转后的行
		 	 block->col=b+mincol;
			 //获得旋转后的列
			 block->change=false;
			 //旋转后避免再次旋转
		}

	}
	//全部重新设置为可以旋转
	for (int i=0;i<_newBlock->count()-1;i++)
	{
		Block *block=(Block *)_newBlock->objectAtIndex(i);
	    block->change=true;
	}
}

左右移动函数以及左右碰撞检测函数

//左右移动碰撞函数
bool BlockManager::ccTouchBegan( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent )
{
	//判断左右移动
	int colmax=pTouch->getLocation().x/32;
	int row=pTouch->getLocation().y/32;
	int colmin=12;
	int save=colmax;
	//是否能往下走
	bool move=true;
	//是否能往右走
	bool movex=true;
	//是否能往左走
	bool movey=true;

	for (int j=0;j<_newBlock->count()-1;j++)
	{
		Block *block1=(Block *)_newBlock->objectAtIndex(j);
		for (int k=0;k<_saveBlock->count();k++)
		{
			Block *block2=(Block *)_saveBlock->objectAtIndex(k);
			//向右是否有砖块碰到
			if (block1->row==block2->row&&block1->col+1==block2->col)
			{
				movex=false;
				break;
			}
			//向左是否有砖块碰到
			if (block1->row==block2->row&&block1->col-1==block2->col)
			{
				movey=false;
				break;
			}
		}
	}

	for (int i=0;i<_newBlock->count()-1;i++)
	{
		Block *block=(Block *)_newBlock->objectAtIndex(i);
		if (block->col>colmax)
		{
			//使得col一直都是最大的一个数
			colmax=block->col;
		}else if (block->col==11&&colmax==11)
		{
			movex=false;
		}
		if (row>11)
		{
			move=false;
		}
		if (block->col<colmin)
		{
			colmin=block->col;
		}
		
	}
//判断左右移动不会碰到相应的方块

	for (int j=0;j<_newBlock->count()-1;j++)
	{
		Block *block=(Block *)_newBlock->objectAtIndex(j);
		if (colmax==save&&colmax<12&&movex&&move)
		{
			block->col++;
		} 
		if(colmin>0&&colmax!=save&&move&&movey){
			block->col--;
		}
		
	}
	//是否可以左右移动,物体碰撞函数
	if (colmax==save&&colmax<12&&movex&&move){
		ZeroPoint *zeropoint=(ZeroPoint *)_newBlock->lastObject();
		zeropoint->pp.y++;
	} 
	if(colmin>0&&colmax!=save&&move&&movey){
		ZeroPoint *zeropoint=(ZeroPoint *)_newBlock->lastObject();
		zeropoint->pp.y--;
	}
	return true;
}


源码在http://download.csdn.net/detail/five50/5211710
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值