void Arrow::removeBullet() { bool isMissed = true; auto instance = GameManager::getInstance(); auto bulletRect = Rect(this->getPositionX() +this->getParent()->getPositionX() - this->getContentSize().width /2, this->getPositionY() +this->getParent()->getPositionY() - this->getContentSize().height/2, this->sprite->getContentSize().width, this->sprite->getContentSize().height ); auto monsterVector = instance->monsterVector; for (int j = 0; j < monsterVector.size(); j++) { auto monster = monsterVector.at(j); auto monsterRect = monster->baseSprite->getBoundingBox(); if (monsterRect.intersectsRect(bulletRect) && monster->getAttackBySoldier()) { auto currHp = monster->getCurrHp(); currHp = currHp - this->getMaxForce() + monster->getArmor(); if(currHp <= 0){ currHp = 0; } monster->setCurrHp( currHp ); monster->getHpBar()->setPercentage((currHp/monster->getMaxHp())*100); monster->getHurt(); isMissed = false; if(currHp == 0){ monster->death(); } break; } } if(isMissed){ sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("decal_arrow.png")); sprite->runAction(Sequence::create(FadeOut::create(1.0f) ,CallFuncN::create(CC_CALLBACK_0(Bullet::removeFromParent, this)) , NULL)); }else{ this->removeFromParent(); } }
void EnemySpriteBase::updateHpBar() { if (getHpBar()) { getHpBar()->setPosition(this->getPosition() + cocos2d::Vec2(-7, -15)); getHpBar()->setPercentage(this->getHP()->getValue() / 10); } }
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(); }