void TentacleLogicCmp::checkPlayerInRange() { int nbr = 0; TentacleGearCmp* tmp = _start; PositionComponent* player = _boss->getPlayer()->GET_CMP(PositionComponent); PositionComponent* me = this->getEntity()->GET_CMP(PositionComponent); int xP = player->getX(); int yP = player->getY(); int xMe = me->getX(); int yMe = me->getY(); while (tmp != NULL) { tmp = tmp->getNext(); nbr++; } if (pow((pow((xP - xMe), 2) + pow((yP - yMe), 2)), 0.5) <= 64 * nbr) setInRange(true); else { _inRange = false; _hasBeenReset = false; } getBoss()->getPlayer(); }
void TentacleLogicCmp::update(float dt_) { TentacleGearCmp* tmp; _stateMachine->update(dt_); TentacleGearCmp* tmpDest; tmp = NULL; //this-> if (_start != NULL) _start->update(dt_, getBoss()->getPlayer(), _action);//uupdate recursivly the tentacle checkPlayerInRange();//check if player are in range and se true/false if (_start != NULL) if (_start->getLife() <= 0)//check if first tentacle should be dead { //std::cout << "starting destruction tentacle" << std::endl; //if (_start->getNext() == NULL) // std::cout << "alone" << std::endl; tmp = _start->getNext(); _start->getEntity()->setIsDead(true);//... if (tmp != NULL) { _start = tmp; _start->setPrev(NULL); } else _start = NULL; } tmp = _start; while (tmp != NULL && tmp->getNext() != NULL) { if (tmp->getNext()->getLife() <= 0)//check for every tentacle if their should be destroy { if (tmp->getNext()->getNext() != NULL) { tmp->getNext()->getNext()->setPrev(tmp); tmpDest = tmp->getNext()->getNext(); tmp->getNext()->getEntity()->setIsDead(true); tmp->setNext(tmpDest); } else { tmp->getNext()->getEntity()->setIsDead(true); tmp->setNext(NULL); } } tmp = tmp->getNext(); } }
void CColossNormal::run() { getInput(); scaleButtons(); drawButtons(); if(!getBoss()) { drawScore(); } tweenBlock(); // Check for block collision hasBlockFinished(); glGraphics->Draw(this); CColoss::run(); // Call to super function // Boss interface functionality manageBossInterface(); }
bool CColossNormal::hasBlockStarted(int _layer) { bool blocked = false; float fDistance; int red; int green; int blue; int alpha; for(unsigned int i = 0; i < getProjectileVector().size(); i++) { switch(_layer) { case TOP_COLOSS: if((m_vLayerCollision[0].Collides(getProjectileVector()[i]->getCollisionObject()) || getProjectileVector()[i]->getCollisionObject()->Collides(&m_vLayerCollision[0])) && !getProjectileVector()[i]->getDead() && !getProjectileVector()[i]->getBounced() && getProjectileVector()[i]->getBlocked() == -1) // Check if small object collides with big one and the other way round { // Play sound if(CLevelData::getCurrentLevelString() == "darkage") { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer0")), 0); } else { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer0_future")), 0); } // Calculate animation speed so block will be at correct position startBlockAnimation(m_vBlockCollision[0].getPosition().x, getProjectileVector()[i]->getPosition().x, getProjectileVector()[i]->GetStartVelocity().x, 0); m_bTopBlock_active = true; // Distance to center fDistance = pwHelper::math::sqrt(pow((getProjectileVector()[i]->getPosition().x - m_vLayerCollision[0].getPosition().x), 2) + pow((getProjectileVector()[i]->getPosition().y - m_vLayerCollision[0].getPosition().y), 2)); // Button color red = (int)((fDistance/50 * 255) > 255 ? 255 : (fDistance/50 * 255)); green = (int)(200 + (55 - (fDistance/150 * 55))); blue = 0; alpha = 200; m_vButton[0].setColor(sf::Color(red, green, blue, alpha)); m_vButton[0].SetCurrentAnimation(C_ANIM_BUTTON_NORMAL); m_vButton[0].RestartAnimation(); if(!getBoss()) { calculateScore(fDistance, 0); } else { if(m_vLayerCollision[0].getPosition().x > getProjectileVector()[i]->getPosition().x) { getProjectileVector()[i]->setBlockDistance(-fDistance); } else { getProjectileVector()[i]->setBlockDistance(fDistance); } } // Projectile blocked getProjectileVector()[i]->setBlocked(0); blocked = true; if(!getBoss()) { modBlocked(1); modSteps(1); } } break; case MIDDLE_HIGHER_COLOSS: if((m_vLayerCollision[1].Collides(getProjectileVector()[i]->getCollisionObject()) || getProjectileVector()[i]->getCollisionObject()->Collides(&m_vLayerCollision[1])) && !getProjectileVector()[i]->getDead() && !getProjectileVector()[i]->getBounced() && getProjectileVector()[i]->getBlocked() == -1) { if(CLevelData::getCurrentLevelString() == "darkage") { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer1")), 1); } else { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer1_future")), 1); } startBlockAnimation(m_vBlockCollision[1].getPosition().x, getProjectileVector()[i]->getPosition().x, getProjectileVector()[i]->GetStartVelocity().x, 1); m_bMiddleHigherBlock_active = true; fDistance = pwHelper::math::sqrt(pow((getProjectileVector()[i]->getPosition().x - m_vLayerCollision[1].getPosition().x), 2) + pow((getProjectileVector()[i]->getPosition().y - m_vLayerCollision[1].getPosition().y), 2)); red = (int)((fDistance/50 * 255) > 255 ? 255 : (fDistance/50 * 255)); green = (int)(200 + (55 - (fDistance/150 * 55))); blue = 0; alpha = 200; m_vButton[1].setColor(sf::Color(red, green, blue, alpha)); m_vButton[1].SetCurrentAnimation(C_ANIM_BUTTON_NORMAL); m_vButton[1].RestartAnimation(); if(!getBoss()) { calculateScore(fDistance, 1); } else { if(m_vLayerCollision[1].getPosition().x > getProjectileVector()[i]->getPosition().x) { getProjectileVector()[i]->setBlockDistance(-fDistance); } else { getProjectileVector()[i]->setBlockDistance(fDistance); } } getProjectileVector()[i]->setBlocked(1); blocked = true; if(!getBoss()) { modBlocked(1); modSteps(1); } } break; case MIDDLE_LOWER_COLOSS: if((m_vLayerCollision[2].Collides(getProjectileVector()[i]->getCollisionObject()) || getProjectileVector()[i]->getCollisionObject()->Collides(&m_vLayerCollision[2])) && !getProjectileVector()[i]->getDead() && !getProjectileVector()[i]->getBounced() && getProjectileVector()[i]->getBlocked() == -1) { if(CLevelData::getCurrentLevelString() == "darkage") { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer2")), 2); } else { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer2_future")), 2); } startBlockAnimation(m_vBlockCollision[2].getPosition().x, getProjectileVector()[i]->getPosition().x, getProjectileVector()[i]->GetStartVelocity().x, 2); m_bMiddleLowerBlock_active = true; fDistance = pwHelper::math::sqrt(pow((getProjectileVector()[i]->getPosition().x - m_vLayerCollision[2].getPosition().x), 2) + pow((getProjectileVector()[i]->getPosition().y - m_vLayerCollision[2].getPosition().y), 2)); red = (int)((fDistance/50 * 255) > 255 ? 255 : (fDistance/50 * 255)); green = (int)(200 + (55 - (fDistance/150 * 55))); blue = 0; alpha = 200; m_vButton[2].setColor(sf::Color(red, green, blue, alpha)); m_vButton[2].SetCurrentAnimation(C_ANIM_BUTTON_NORMAL); m_vButton[2].RestartAnimation(); if(!getBoss()) { calculateScore(fDistance, 2); } else { if(m_vLayerCollision[2].getPosition().x > getProjectileVector()[i]->getPosition().x) { getProjectileVector()[i]->setBlockDistance(-fDistance); } else { getProjectileVector()[i]->setBlockDistance(fDistance); } } getProjectileVector()[i]->setBlocked(2); blocked = true; if(!getBoss()) { modBlocked(1); modSteps(1); } } break; case BOTTOM_COLOSS: if((m_vLayerCollision[3].Collides(getProjectileVector()[i]->getCollisionObject()) || getProjectileVector()[i]->getCollisionObject()->Collides(&m_vLayerCollision[3])) && !getProjectileVector()[i]->getDead() && !getProjectileVector()[i]->getBounced() && getProjectileVector()[i]->getBlocked() == -1) { if(CLevelData::getCurrentLevelString() == "darkage") { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer3")), 3); } else { glAudio->PlaySound(glDataBox->GetSoundBuffer(data->GetString("layer3_future")), 3); } startBlockAnimation(m_vBlockCollision[3].getPosition().x, getProjectileVector()[i]->getPosition().x, getProjectileVector()[i]->GetStartVelocity().x, 3); m_bBottomBlock_active = true; fDistance = pwHelper::math::sqrt(pow((getProjectileVector()[i]->getPosition().x - m_vLayerCollision[3].getPosition().x), 2) + pow((getProjectileVector()[i]->getPosition().y - m_vLayerCollision[3].getPosition().y), 2)); red = (int)((fDistance/50 * 255) > 255 ? 255 : (fDistance/50 * 255)); green = (int)(200 + (55 - (fDistance/150 * 55))); blue = 0; alpha = 200; m_vButton[3].setColor(sf::Color(red, green, blue, alpha)); m_vButton[3].SetCurrentAnimation(C_ANIM_BUTTON_NORMAL); m_vButton[3].RestartAnimation(); if(!getBoss()) { calculateScore(fDistance, 3); } else { if(m_vLayerCollision[3].getPosition().x > getProjectileVector()[i]->getPosition().x) { getProjectileVector()[i]->setBlockDistance(-fDistance); } else { getProjectileVector()[i]->setBlockDistance(fDistance); } } getProjectileVector()[i]->setBlocked(3); blocked = true; if(!getBoss()) { modBlocked(1); modSteps(1); } } break; } // Blocked 15 projectiles in a row? Earn a modifier! if(getBlocked() >= m_iMultiplierDuration) { modModifier(1); setBlocked(0); } } return blocked; }