已弃坑 最后居然拿了个音药奖??

前言

增加了以下功能

  1. 敌人波数
  2. 游戏暂停
  3. 音乐关闭
  4. 战斗开始

敌人波数

wave类

class Wave {
public:
    Vec2 pos;
    ProgressTimer* waveProgress;
    Layout* layout = Layout::create();
    string name1 = "img/flag1.png";
    string name2 = "img/flag2.png";
    vector<Sprite*> flags;
    bool waveFight = false;
    int nowWave = 0;
    int nextWave = 1;
    vector<bool> judge;
    bool bossWave = false;
    Sprite* cat;
    void checkWave();
    void setPosition(Vec2);
    void setFlag(int waveNum);
};
void Wave::setPosition(Vec2 pos) {
    layout->setContentSize(Size(250, 50));
    layout->setBackGroundColor(Color3B::BLACK);
    layout->setPosition(pos);
}
void Wave::setFlag(int waveNum) {
    auto wavebg1 = Sprite::create("img/wavebg1.png");
    wavebg1->setPosition(Vec2(0, 0));
    wavebg1->setAnchorPoint(Vec2(0, 0));
    layout->addChild(wavebg1);
    auto wavebg2 = Sprite::create("img/wavebg2.png");
    waveProgress = ProgressTimer::create(wavebg2);
    waveProgress->setType(ProgressTimer::Type::BAR);
    waveProgress->setPosition(Vec2(0, 0));
    waveProgress->setMidpoint(Point(0, 0.5));     //如果是从左到右的话,改成(1,0.5)即可
    waveProgress->setBarChangeRate(Point(1, 0));
    waveProgress->setPercentage(0);
    waveProgress->setAnchorPoint(Vec2(0, 0));
    layout->addChild(waveProgress);
    for (int i = 0; i < waveNum; i++) {
        auto flag = Sprite::create("img/flag1.png");
        flag->setPosition(Vec2(layout->getContentSize().width / (waveNum + 1) * (i + 1), waveProgress->getContentSize().height));
        flag->setTag(i);
        layout->addChild(flag);
        flags.push_back(flag);
        judge.push_back(false);
    }
    auto boss = Sprite::create("img/boss.png");
    boss->setPosition(Vec2(layout->getContentSize().width, waveProgress->getContentSize().height));
    boss->setTag(waveNum);
    layout->addChild(boss);
    flags.push_back(boss);
    judge.push_back(false);

    cat = Sprite::create("img/cat.png");
    cat->setAnchorPoint(Vec2(0, 0));

    layout->addChild(cat);
}
void Wave::checkWave() {
    cat->setPosition(waveProgress->getPercentage() / float(100) * layout->getContentSize().width - cat->getContentSize().width / 2, 0);
    for (int i = 0; i < flags.size(); i++) {
        if (!judge[i]) {
            if (flags[i]->getActionByTag(0) == nullptr) {
                if (cat->getBoundingBox().containsPoint(Vec2(flags[i]->getPosition().x, flags[i]->getPosition().y))) {
                    if (!waveFight) {
                        if (nowWave != nextWave) {
                            nowWave++;
                            waveFight = true;
                            judge[i] = true;
                            if (i == flags.size()) {
                                bossWave = true;
                            }
                        }
                    }
                }
            }
        }
        if (flags[i]->getPosition().y >= waveProgress->getContentSize().height + 10) {
            flags[i]->setTexture(name2);
        }
    }
}

回合的事件

void catTD::waveEvent() {
    if (!wave->waveFight) {
        wave->waveProgress->setPercentage(wave->waveProgress->getPercentage() + 0.1);
    } else {
        if (wave->nowWave == wave->nextWave) {
            if (enemys.size() == 0) {
                addEnemyNum(5);
                wave->nextWave++;
            }
        } else {
            if (enemys.size() == 0) {
                if (wave->bossWave) {

                }
                ActionInterval* move = MoveBy::create(0.2, Vec2(0, 10));
                Sprite* flag = (Sprite*)wave->layout->getChildByTag(wave->nowWave - 1);
                flag->setTag(0);
                flag->runAction(move);
                wave->waveFight = false;
            }
        }
    }
}

在游戏上方会显示波数,到达旗子后会一次性放出大量敌人

击败这一波的所有敌人后会升起旗子

游戏暂停

pauseBtn->addTouchEventListener([=](Ref* sender, Widget::TouchEventType type) {
        if (fightStart) {
            switch (type) {
                case ui::Widget::TouchEventType::ENDED:
                    if (gamePause) {
                        pauseBtn->loadTextureNormal("ui/stop.png");
                        gamePause = false;
                        Director::getInstance()->resume();
                        setBtnState();
                    } else {
                        pauseBtn->loadTextureNormal("ui/play.png");
                        gamePause = true;
                        Director::getInstance()->pause();
                        setBtnState();
                    }
                    break;
            }
        }
    });

防止暂停游戏后一些按钮继续响应点击事件

void catTD::setBtnState() {
    if (gamePause || !fightStart) {
        for (int i = 0; i < townBtns.size(); i++) {
            townBtns[i]->setEnabled(false);
        }
        for (int i = 0; i < skillBtns.size(); i++) {
            skillBtns[i]->setEnabled(false);
        }
    } else {
        for (int i = 0; i < townBtns.size(); i++) {
            townBtns[i]->setEnabled(true);
        }
        for (int i = 0; i < skillBtns.size(); i++) {
            skillBtns[i]->setEnabled(true);
        }
    }
}

效果

音乐暂停

musicBtn->addTouchEventListener([=](Ref* sender, Widget::TouchEventType type) {
        switch (type) {
            case ui::Widget::TouchEventType::ENDED:
                if (gameMusicState) {
                    AudioEngine::pauseAll();
                    AudioEngine::setEnabled(false);
                    gameMusicState = false;
                    musicBtn->loadTextureNormal("ui/musicoff.png");
                } else {
                    AudioEngine::setEnabled(true);
                    AudioEngine::resumeAll();
                    auto backgroundAudioID = AudioEngine::play2d("sound/bg.mp3", true);
                    gameMusicState = true;
                    musicBtn->loadTextureNormal("ui/musicon.png");
                }
                break;
        }
    });

战斗开始

void catTD::addFightBtn() {
    if (getChildByName("wave") != nullptr) {
        removeChildByName("wave");
        nextTurnData();
    } else {

    }
    wave = new Wave();
    wave->init(Vec2(WAVE_POS_X, WAVE_POS_Y), 0);
    wave->layout->setName("wave");
    addChild(wave->layout);

    auto fightBtn = Button::create("ui/fight.png");
    fightBtn->setPosition(Vec2(FIGHT_POS_X, FIGHT_POS_Y));
    fightBtn->addTouchEventListener([=](Ref* sender, Widget::TouchEventType type) {
        switch (type) {
            case ui::Widget::TouchEventType::ENDED:
                fightStart = true;
                Director::getInstance()->resume();
                removeChild(fightBtn);
                setBtnState();

                break;
        }
    });
    addChild(fightBtn);

    fightStart = false;
    Director::getInstance()->pause();
}

在击败最后一波敌人后进行调用

void catTD::waveEvent() {
    if (wave->bossWave) {
        addFightBtn();
    }
}

效果演示

Last modification:July 18th, 2020 at 01:14 pm