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)
首先为了旋转需要,设置保存一个图形的零点。
创建一个类,保存零点坐标
再在BlockManager::type(Picture picture )函数总每个类型都加入一个零点,如这样,所以之前所有有_newBlock->count()都要减1
在主要的旋转函数
左右移动函数以及左右碰撞检测函数
源码在http://download.csdn.net/detail/five50/5211710
本期实现的功能为变形以及左右移动的功能
首先说下我变形的原理 以这两个数组变化来控制旋转。
(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
相关文章推荐
- cocos2d-x【小菜在学习】做个小游戏俄罗斯方块(二)
- cocos2d-x【小菜在学习】做个小游戏俄罗斯方块(一)
- cocos2d-x 【小菜在学习】锚点与位置个人理解笔记
- cocos2d-x 学习笔记(4)cocos2d-x 小游戏类似打地鼠(含源码)
- 俄罗斯方块,我的java学习之路,小游戏
- cocos2d-x【小菜在学习】做mario小尝试
- 【cocos2D-x学习】12.第三个小游戏——五子棋
- cocos2d-x【小菜在学习】做个Towerdefend初期
- cocos2d-x【小菜在学习】如何增加光晕效果以及CCSpriteFrameCache使用
- Cocos2d-x学习笔记二_第一个小游戏
- 【cocos2D-x学习】12.第三个小游戏——五子棋
- Canvas学习,利用业余时间写了个小游戏,俄罗斯方块
- cocos2d-x学习笔记2:小游戏
- cocos2d-x【小菜在学习】体验之isBackgroundMusicPlaying对其影响
- Cocos2d-x学习笔记(六)实例——多层布景
- cocos2d-x学习笔记-CCNode
- [cocos2d-x 学习] 如何编译自己的项目(从win32交叉编译到android)
- 五毛的cocos2d-x学习笔记05-场景与场景动画,动作
- cocos2d-x-3.0rc1 学习笔记1