5.死亡判定
前面已经讲完了元素块的消除,剩下最后就只有死亡判定了。
死亡判定是在什么时候判定呢?是不是应该在没有空白区域的时候判断,当没有空白区域,判断是否可以消除,若四个方向都不能消除,则游戏结束
先定义一个GameOver方法
void Game::GameOver()
{
//this->unschedule(schedule_selector(Game::logic));
auto gover = Label::createWithBMFont("font-issue1343-hd.fnt", "Game Over");
gover->setColor(Color3B(68, 163, 15));
gover->setScale(1.2);
auto menu_gover = MenuItemLabel::create(gover,CC_CALLBACK_1(Game::CallBack,this));
menu_gover->setPosition(Vec2(VisibleSize.width/2 , -300));
auto act = MoveTo::create(3, Vec2(VisibleSize.width/2 , VisibleSize.height/2));
menu_gover->runAction(act);
auto menu = Menu::create(menu_gover , NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu , 100);
// Director::getInstance()->pause();
}
void Game::CallBack(Ref * obj)
{
Director::getInstance()->replaceScene(LoadScene::createScene());
}
然后在创建新块的时候,就先对空白区域进行判断,有则创建,无则判断是否能消除,都不能则游戏结束
在addNewTiled()中
定义一个bool isOver,初始化为true
然后判断,能消除则为false
到判断结束根据isOver的值判断是否死亡
ok,直接上代码
if (allTiled.size() == 16) {
//死亡判定
bool isOver = true;
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 4; c++) {
auto nowNum = allTiled.at(map[r][c] - 1)->number;
//上
if (r + 1 < 4) {
auto obj = allTiled.at(map[r+1][c] - 1)->number;
if (nowNum == obj) {
isOver =false;
return;
}
}
//下
if (r - 1 >= 0) {
auto obj = allTiled.at(map[r-1][c] - 1)->number;
if (nowNum == obj) {
isOver = false;
return;
}
}
//左
if (c - 1 >= 0) {
auto obj = allTiled.at(map[r][c - 1] - 1)->number;
if (nowNum == obj) {
isOver = false;
return;
}
}
//右
if (c + 1 < 4) {
auto obj = allTiled.at(map[r][c+1] - 1)->number;
if (nowNum == obj) {
isOver = false;
return;
}
}
}
}
if (isOver) {
SimpleAudioEngine::getInstance()->playEffect("gameover.mp3");
GameOver();
}
ok,这个2048游戏到这就已经完成,一些细节的东西各位看官有兴趣可以自行添加,例如说元素块产生的动画、消除的动画、分数的添加、声音等等。
写的一般般,各位看官有什么建议可以提出来一起学习学习。
————9秒学院学习日志