已弃坑 最后居然拿了个音药奖??
前言
增加了以下功能
- 敌人波数
- 游戏暂停
- 音乐关闭
- 战斗开始
敌人波数
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();
}
}
效果演示
Orz
Orz
越来越有趣了233333
然而弃坑了