小菜又来了!!!
本期实现的功能为变形以及左右移动的功能
首先说下我变形的原理 以这两个数组变化来控制旋转。
(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;
}