您的位置:首页 > 移动开发 > Cocos引擎

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

2013-04-01 20:46 513 查看
小菜又来了!!!

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

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

(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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息