第八节 游戏结束的判定
贪食蛇里GameOver的原因只有2种,1是蛇头碰到身体,2是蛇头碰到墙壁
我们在GameLayer.h里添加
成员
bool ifgameover;
函数
bool OutofRange();
bool HeadCollideBody(Direction headdirec);
void GameOver();
void PauseGame();
void SetSnakeVisible(bool value);
先说OutofRange函数,代码如下
bool GameLayer::OutofRange(){
Point po = head->getPosition();
if (po.x < 0||po.x > visiblesize.width||po.y < 0||po.y > visiblesize.height) {
return true;
}
return false;
}
```
这个函数用来判断蛇头是否超出游戏区域。
接下来是HeadCollideBody,代码如下
bool GameLayer::HeadCollideBody(Direction headdirec){
float x = head->getPosition().x;
float y = head->getPosition().y;
bool iscollide = false;
switch (headdirec) {
case up:
y += 20;
break;
case down:
y -= 20;
break;
case left:
x -= 20;
break;
case right:
x += 20;
break;
default:
break;
}
Point headnextpos = Point (x,y);
iscollide = ifCollideBody(headnextpos);
return iscollide;
}
```
这个函数是用来判断蛇头下一步移动的位置是否与身体相撞。
再下来是GameOver函数,代码如下
void GameLayer::GameOver(){
PauseGame();
SetSnakeVisible(false);
playbutton->setPosition(Point(visiblesize.width/2,visiblesize.height/2-gameover->getContentSize().height));
gameover->setVisible(true);
ifgameover = true;
}
```
里面又用到了另外两个函数,PauseGame和SetSnakeVisible。
PauseGame函数的作用主要是用来停止游戏,代码如下
void GameLayer::PauseGame(){
this->pause();
SetSnakeVisible(false);
playbutton->setVisible(true);
}
```
SetSnakeVisible就是用来显示或隐藏蛇和食物的,代码如下
void GameLayer::SetSnakeVisible(bool val){
food->setVisible(val);
head->getNode()->setVisible(val);
for (int i =0; isetVisible(val);
}
}
```
回到GameOver函数,为了美观,我们需要调整一下开始按钮的位置,因为我们还要在开始按钮上面显示“GameOver!”的label,接着将ifgameover设置为true。
最后将update函数改为下面这个样子
void GameLayer::update(float dt){
if (!HeadCollideBody(head->getDirec()) && !OutofRange()) {
MoveStep();
if(ifGetFood()){
AddBody();
SetFood();
}
lastbodyposi = body.at(body.size()-1)->getPosition();
}
else{
GameOver();
}
}
```
第八节结束


