void GameLayer::initMembers() { std::vector<std::string> fileNames { "CardBlue.png", "CardRed.png", "CardGreen.png", "CardYellow.png", "CardPurple.png" }; std::vector<Character::Element> elements { Character::Element::Water, Character::Element::Fire, Character::Element::Wind, Character::Element::Holy, Character::Element::Shadow, }; for (int i = 0; i < fileNames.size(); i++) { //メンバー auto memberData = Character::create(); memberData->setMaxHp(200); memberData->setHp(200); memberData->setElement(elements[i]); _memberDatum.pushBack(memberData); //メンバーの表示 auto member = Sprite::create(fileNames[i].c_str()); member ->setPosition(Point(70 + i * 125, 598)); addChild(member, ZOrder::Char); //メンバーヒットポイントバー枠の表示 auto hpBg = Sprite::create("HpCardBackground.png"); hpBg->setPosition(Point(70 + i * 125, 554)); addChild(hpBg, ZOrder::CharHp); //メンバーヒットポイントバーの表示 auto hpBarForMember = ProgressTimer::create(Sprite::create("HpCardGreen.png")); hpBarForMember->setPosition(Point(hpBg->getContentSize().width / 2, hpBg->getContentSize().height / 2)); hpBarForMember->setType(ProgressTimer::Type::BAR); hpBarForMember->setMidpoint(Point::ZERO); hpBarForMember->setBarChangeRate(Point(1, 0)); hpBarForMember->setPercentage(memberData->getHpPercentage()); hpBg->addChild(hpBarForMember); //配列に格納 _members.pushBack(member); _hpBarForMembers.pushBack(hpBarForMember); } }
// メンバーの回復 void GameLayer::healMember(int healing) { for (int i = 0; i < _memberDatum.size(); i++) { // メンバーデータ取得 auto memberData = _memberDatum.at(i); // HPが0の場合は、回復しない if (memberData->getHp() <= 0) continue; // メンバーを回復する float preHpPercentage = memberData->getHpPercentage(); int afterHp = memberData->getHp() + healing; if (afterHp > memberData->getMaxHp()) afterHp = memberData->getMaxHp(); memberData->setHp(afterHp); // メンバーHPアニメーション auto act = ProgressFromTo::create(0.5, preHpPercentage, memberData->getHpPercentage()); _hpBarForMembers.at(i)->runAction(act); } }
void PlayLayer::update(float dt) { GameManager *instance = GameManager::getInstance(); auto bulletVector = instance->bulletVector; auto enemyVector = instance->enemyVector; auto towerVector = instance->towerVector; if(chooseTowerpanle != NULL ) { auto type = chooseTowerpanle->getChooseTowerType(); if( type == TowerType::ARROW_TOWER) { TowerBase* tower = ArrowTower::create(); tower->setPosition(towerPos); this->addChild(tower); instance->towerVector.pushBack(tower); type = TowerType::ANOTHER; chooseTowerpanle->setChooseTowerType(type); } } Vector<EnemyBase*> enemyNeedToDelete; Vector<Sprite*> bulletNeedToDelete; // 碰撞检测 for (int i = 0; i < bulletVector.size(); i++) { auto bullet = bulletVector.at(i); bullet->boundingBox(); auto bulletRect = Rect(bullet->getPositionX()+bullet->getParent()->getPositionX() - bullet->getContentSize().width / 2, bullet->getPositionY() +bullet->getParent()->getPositionY() - bullet->getContentSize().height / 2, bullet->getContentSize().width, bullet->getContentSize().height ); for (int j = 0; j < enemyVector.size(); j++) { auto enemy = enemyVector.at(j); auto enemyRect = enemy->sprite->boundingBox(); if (bulletRect.intersectsRect(enemyRect)) { auto currHp = enemy->getCurrHp(); currHp--; enemy->setCurrHp( currHp ); auto currHpPercentage = enemy->getHpPercentage(); auto offHp = 100 / enemy->getMaxHp(); currHpPercentage -= offHp; if(currHpPercentage < 0){ currHpPercentage = 0; } enemy->setHpPercentage(currHpPercentage); enemy->getHpBar()->setPercentage(currHpPercentage); if(currHp <= 0) { enemyNeedToDelete.pushBack(enemy); } bulletNeedToDelete.pushBack( bullet); } } for (EnemyBase* enemyTemp : enemyNeedToDelete) { enemyTemp->enemyExpload(); instance->enemyVector.eraseObject(enemyTemp); } enemyNeedToDelete.clear(); } for (const auto& bulletTemp : bulletNeedToDelete) { instance->bulletVector.eraseObject(bulletTemp); bulletTemp->removeFromParent(); } bulletNeedToDelete.clear(); }