——吃食物和长身体
蛇绕着食物跑啊跑,转啊转,就是吃不到,它都要崩溃了~
~(>_<)~~
好吧,我们来帮帮它吧
如何让蛇可以吃到食物呢,其实很简单嘛。既然蛇头有行列坐标,那么食物也有行列坐标。所以当蛇头的行列坐标和食物的行列坐标相等时,让食物的坐标改变,这不就是吃到了吗,对吧。
if(head->row == food->row && head->col == food->col)
{
//改变食物的位置
food->col = rand()%10;
food->row = rand()%10;
food->setPosition(Vec2(food->col*GAME_TILED_WIDTH , food->row*GAME_TILED_HEIGHT));
}
现在蛇已经可以吃到食物了,但是不能光吃不长吧,所以吃饱了应该长身体。
由于身体有很多很多很多。。。。
我们就用一个集合来保存身体先定义一个集合Vector
//第一种,让身体的方向跟着头的方向即可
if(allBody.size() == 0) //当没有身体的时候
{
nowbd->dir = head->dir; //身体的方向跟着头
switch(nowbd->dir)
{
case UP:
nowbd->row = head->row - 1;
nowbd->col = head->col;
break;
case DOWN:
nowbd->row = head->row +1;
nowbd->col = head->col;
break;
case LEFT:
nowbd->row = head->row;
nowbd->col = head->col +1;
break;
case RIGHT:
nowbd->row = head->row;
nowbd->col = head->col -1;
break;
default:
break;
}
}
//第二种,让新的身体的方向跟着原来的最后一截身体的方向
else //当有身体的时候
{
auto lastbd = allBody.at(allBody.size() - 1);
nowbd->dir = lastbd->dir;
switch(nowbd->dir)
{
case UP:
nowbd->row = lastbd->row - 1;
nowbd->col = lastbd->col;
break;
case DOWN:
nowbd->row = lastbd->row +1;
nowbd->col = lastbd->col;
break;
case LEFT:
nowbd->row = lastbd->row;
nowbd->col = lastbd->col +1;
break;
case RIGHT:
nowbd->row = lastbd->row;
nowbd->col = lastbd->col -1;
break;
default:
break;
}
}
//添加到allBody中
allBody.pushBack(nowbd);
//设置坐标
nowbd->setPosition(Vec2(nowbd->col*GAME_TILED_WIDTH, nowbd->row*GAME_TILED_HEIGHT));
//添加到节点中
this->getChildByTag(TAG_BG)->addChild(nowbd);
最后让身体也移动起来
if(allBody.size() > 0)
{
for(long i = allBody.size()-1 ; i >= 0; i--)
{
auto nowBody = allBody.at(i);
switch(nowBody->dir)
{
case UP:
nowBody->row++;
break;
case DOWN:
nowBody->row--;
break;
case LEFT:
nowBody->col--;
break;
case RIGHT:
nowBody->col++;
break;
}
nowBody->setPosition(Vec2(nowBody->col*GAME_TILED_WIDTH , nowBody->row*GAME_TILED_HEIGHT));
if(i > 0)
{
nowBody->dir = allBody.at(i - 1 )->dir;
}
else
{
nowBody->dir = head->dir;
}
}
}
OK,这样蛇就可以自由的吃东西长身体了。
当然,这个游戏还没有做完,还差最后一点点。
未完待续。。
————9秒学院学习日志