小小菜之Cocos2d-x游戏开发旅程——项目实例:2048(3)
2015-10-16 22:13
549 查看
3.元素块的移动
前面已经把元素块的创建实现了,现在需要实现的是元素块的移动。
在这之前,还需要做一件事情,在GameScene中创建一个二维数组,用来存放网格信息。也就是当网格的某行某列产生元素块之后,在二维数组中的相同位置进行编号,这样就可以判断我们的网格还剩下多少空白区域。
在GameScene.h中定义一个二维数组 int map[4][4]
然后我们在init方法中初始化该数组
初始化完成之后,在创建元素块时,往map中添加编号,将当前allTiled集合的长度作为编号添加
因为allTiled的下标是从0开始的,所以在添加时需要加1,否则第一个添加到map中还是0,0就代表这个位置是没有块的。
ok,接下来我们对元素块进行移动的实现
既然要进行移动,那么就需要有触摸,先实现触摸
先定义一个枚举,用来保存块移动的方向
GameScene.h
实现触摸
首先,需要一个思路,怎么使块移动。
由于,矩阵是4*4的,我们以向上移动为例,从第2行开始往下判断,因为第3行是最顶上的一行(0~3行,总共4行)。判断是否有块,如果有块,
将其取出,再判断它的上一行是否有块,如果没有块,则向上移动。
ok,大致思路就是这样,接下来实现这个思路
这就是向上移动的逻辑了,既然向上的逻辑有了,那么其它三个方向就简单了吧。
未完待续。。。
————9秒学院学习日志
前面已经把元素块的创建实现了,现在需要实现的是元素块的移动。
在这之前,还需要做一件事情,在GameScene中创建一个二维数组,用来存放网格信息。也就是当网格的某行某列产生元素块之后,在二维数组中的相同位置进行编号,这样就可以判断我们的网格还剩下多少空白区域。
在GameScene.h中定义一个二维数组 int map[4][4]
然后我们在init方法中初始化该数组
//初始化地图标识map for (int r = 0; r < 4; r++) { for (int c = 0; c < 4; c++) { map[r][c] = 0; } }
初始化完成之后,在创建元素块时,往map中添加编号,将当前allTiled集合的长度作为编号添加
map[row][col] = allTiled.getIndex(newTiled) + 1;
因为allTiled的下标是从0开始的,所以在添加时需要加1,否则第一个添加到map中还是0,0就代表这个位置是没有块的。
ok,接下来我们对元素块进行移动的实现
既然要进行移动,那么就需要有触摸,先实现触摸
先定义一个枚举,用来保存块移动的方向
GameScene.h
enum DIR //块的滑动方向 { UP, DOWN, LEFT, RIGHT };
实现触摸
bool Game::onTouchBegan(Touch *t , Event *e) { px = t->getLocation().x; py = t->getLocation().y; return true; } void Game::onTouchEnded(Touch *t , Event *e) { int mx = std::abs(t->getLocation().x - px); int my = std::abs(t->getLocation().y - py); //判断滑动方向 if (mx>my) //左右滑动 { if(mx < 30) { return; } if (t->getLocation().x > px) //向右滑动 { this->dir = DIR::RIGHT; } else //向左 { this->dir = DIR::LEFT; } } else //上下滑动 { if (my < 30) { return ; } if (t->getLocation().y > py) //向上滑动 { this->dir = DIR::UP; } else //向下 { this->dir = DIR::DOWN; } } moveNowTiled(); //调用移动的方法 }
首先,需要一个思路,怎么使块移动。
由于,矩阵是4*4的,我们以向上移动为例,从第2行开始往下判断,因为第3行是最顶上的一行(0~3行,总共4行)。判断是否有块,如果有块,
将其取出,再判断它的上一行是否有块,如果没有块,则向上移动。
ok,大致思路就是这样,接下来实现这个思路
void Game::moveNowTiled() //移动所有的块 { SimpleAudioEngine::getInstance()->playEffect("moved.wav"); switch (this->dir) { case DIR::UP: for (int nowrow = 2 ; nowrow >= 0; nowrow--) { for (int nowcol = 0; nowcol < 4; nowcol++) { //移动nowrow行 ,nowcol列的块 if (map[nowrow][nowcol] > 0) { auto nowTiled = allTiled.at(map[nowrow][nowcol] - 1); //如果这个块前面没有块,则移动它 for (int row = nowrow + 1; row < 4; row++) { if (map[row][nowcol] == 0) { //如果这个块前面没有块,则移动它,并把移动到的地图标识,原来的地图置为0 map[row][nowcol] = map[row - 1][nowcol]; map[row - 1][nowcol] = 0; nowTiled->moveTiled(row , nowcol); } else { //判断是否可以消除 } } } } } } break; case DIR::DOWN: break; case DIR::LEFT: break; case DIR::RIGHT: break;
这就是向上移动的逻辑了,既然向上的逻辑有了,那么其它三个方向就简单了吧。
未完待续。。。
————9秒学院学习日志
相关文章推荐
- cocostudio 资源文件夹中目录中有标点的解决方法
- 小小菜之Cocos2d-x游戏开发旅程——项目实例:2048(2)
- 小小菜之Cocos2d-x游戏开发旅程——项目实例:2048(1)
- Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView
- 【cocos2d-js官方文档】十三、CCSAXParser.js
- 【cocos2d-js官方文档】十二、对象缓冲池
- 【cocos2d-js官方文档】十一、cc.path
- 【cocos2d-js官方文档】十、log
- 【cocos2d-js官方文档】八、cc.game
- 【cocos2d-js官方文档】七、CCFileUtils
- 【cocos2d-js官方文档】六、cc.async
- 【cocos2d-js官方文档】五、Cocos2d-JS v3.0的新Action API
- 【cocos2d-js官方文档】四、基础数据类型
- 【cocos2d-js官方文档】三、Bake功能使用说明
- 【cocos2d-js官方文档】二、资源管理器Assets Manager
- cocos2d-x 3.0 常用对象的创建方式
- cocos2dx - ActionManager内存泄露
- cocos2dx常用宏
- cocos2d之Box2D详细说明 鼠标联合实现
- Cocos2d-x3.2 使用物理引擎进行碰撞检测[转]