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

小小菜之Cocos2d-x游戏开发旅程——项目实例:2048(3)

2015-10-16 22:13 549 查看
3.元素块的移动

前面已经把元素块的创建实现了,现在需要实现的是元素块的移动。

在这之前,还需要做一件事情,在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秒学院学习日志
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: