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

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秒学院学习日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值