第七节 放置食物及吃掉食物的判定
实现蛇的运动后我们就开始放置食物了,首先在GameLayer.h中添加
成员
Sprite* food;
Point lastbodyposi;
函数
void SetFood();
Point RandomPosition()
bool ifCollideBody(Point pos);
bool ifGetFood();
void AddBody();
首先是SetFood函数
代码如下
void GameLayer::SetFood(){
this->removeChild(food);
Point foodposi = RandomPosition();
Point headposi = head->getPosition();
while (foodposi==headposi||ifCollideBody(foodposi)) {
foodposi = RandomPosition();
}
food = Sprite::create("Food.png");
food->setPosition(foodposi);
this->addChild(food);
}
```
里面有用到RandomPosition和ifCollideBody两个函数,
先说RandomPosition,代码如下
Point GameLayer::RandomPosition(){
int x = (arc4random()%24);
int y = (arc4random()%16);
Point position = Point(x*20+10,y*20+10);
return position;
}
```
这个函数返回的是一个Point类型的随机点
再是ifCollideBody函数,代码如下
bool GameLayer::ifCollideBody(Point pos){
bool value = false;
Snake* node;
for (int i =0; igetPosition();
if(nodepos==pos){
value = true;
}
}
return value;
}
```
这个函数的作用主要是检查给定的位置是否与蛇的身体节点重合,重合返回true,不重合返回false。
回到SetFood这个函数,因为整个游戏画面上同时只能存在一个食物,因此,当每执行SetFood的时候,要把前面设置的食物从layer中移除,所以要执行一下removeChildh函数。
接下来先获取蛇头的位置,然后产生一个随机点,检查该随机点是否与蛇头和蛇身体重合,如果重合,则继续生成随机点,直到生成的随机点与蛇头蛇身不重合为止。然后设置食物的位置为该随机点,设置食物的步骤就结束了。
接下来我们判断食物是否被吃掉,用到的是ifGetFood这个函数
代码如下
bool GameLayer::ifGetFood(){
bool value = false;
if(food->getPosition() == head->getPosition()){
value = true;
}
return value;
}
```
非常简单吧
如果食物被吃掉,则调用AddBody函数代码如下
void GameLayer::AddBody(){
head->setPosition(food->getPosition());
Snake* node = Snake::create();
node->setNode(Sprite::create("Snake.png"));
node->setPosition(lastbodyposi);
body.pushBack(node);
this->addChild(node);
}
```
我们要在蛇的末尾加入一个身体节点,就要用到lastbodyposi这个成员了,这个成员保存的是上一步运动过程中,蛇的最后一个身体节点的位置。
这个lastbodyposi是在update函数中更新的,我们先来看一下update函数
void GameLayer::update(float dt){
MoveStep();
if(ifGetFood()){
AddBody();
SetFood();
}
lastbodyposi = body.at(body.size()-1)->getPosition();
}
```
第七节结束


