void Enemy::Tick(Player* player) { if (name == "goblin3") { Item* meat = dynamic_cast<Item*>(player->currentRoom->extractItem("meat")); if (meat != NULL) { cout << "The big GOBLIN jumps out of his hole and eats the rotten MEAT. He stands in front of you and it's still hungry...\n"; attackPoints = 25; defensePoints = 4; lifePoints -= meat->usePoints; if (meat->usePoints > 0) cout << "The POISON of the MEAT hurts the GOBLIN, it loses " << meat->usePoints << " points. Now it has " << lifePoints << " points of life.\n"; description = "A big GOBLIN that doesn't seem to be your friend.\n"; delete (meat); } cout << endl << "The GOBLIN attacks you.\n"; attackPlayer(player); } else if (name == "boss") { cout << "The huge MONSTER attacks you.\n"; attackPlayer(player); } }
bool BulletSmash::update( ) { _exist_time++; if ( _exist_time < WAIT_TIME ) { return true; } Matrix mat = Matrix::makeTransformRotation( Vector( 0, 0, 1 ), PI2 / PARTICLE ); Vector radius_dir = Vector( 0, 1, 0 ); attackEnemy( _pos, _power ); for ( int i = 0; i < PARTICLE; i++ ) { radius_dir = mat.multiply( radius_dir ); for ( int j = 1; j < RADIUS + 1; j++ ) { Vector pos = _pos + radius_dir * j; attackPlayer( pos, _power ); } } return false; }
void calculateEnemyMove(Entity* enemy){ if((abs(enemy->position.x - player.position.x) == 1 && enemy->position.y - player.position.y == 0) || (abs(enemy->position.y - player.position.y) == 1 && enemy->position.x - player.position.x == 0)){ attackPlayer(enemy); return; } Position playerPos = player.position; Position enemyPos = enemy->position; int enemyX = enemyPos.x; int enemyY = enemyPos.y; // int best = 1000000000; Position up = (Position){enemyX, enemyY-1}; Position right = (Position){enemyX+1, enemyY}; Position down = (Position){enemyX, enemyY+1}; Position left = (Position){enemyX-1, enemyY}; if(isFreeSpace(up) && hamiltonDistance(up, playerPos) < hamiltonDistance(enemyPos, playerPos)){ unchanged[enemyY*MAP_WIDTH + enemyX] = FALSE; unchanged[(enemyY-1) * MAP_WIDTH + enemyX] = FALSE; moveEnemy(enemy, EVENT_MOVE_UP); }else if(isFreeSpace(right) && hamiltonDistance(right, playerPos) < hamiltonDistance(enemyPos, playerPos)){ unchanged[enemyY*MAP_WIDTH + enemyX + 1] = FALSE; unchanged[enemyY*MAP_WIDTH + enemyX] = FALSE; moveEnemy(enemy, EVENT_MOVE_RIGHT); }else if(isFreeSpace(down) && hamiltonDistance(down, playerPos) < hamiltonDistance(enemyPos, playerPos)){ unchanged[(enemyY+1)*MAP_WIDTH + enemyX] = FALSE; unchanged[enemyY*MAP_WIDTH + enemyX] = FALSE; moveEnemy(enemy, EVENT_MOVE_DOWN); }else if(isFreeSpace(left) && hamiltonDistance(left, playerPos) < hamiltonDistance(enemyPos, playerPos)){ unchanged[enemyY*MAP_WIDTH + enemyX-1] = FALSE; unchanged[enemyY*MAP_WIDTH + enemyX] = FALSE; moveEnemy(enemy, EVENT_MOVE_LEFT); } }
void Enemy::update(sf::Time timeElapsed) { sf::Vector2f velocity(0, 0); // Cause the enemies to go back to the top of the screen when hitting the bottom if (this->sprite.getPosition().y > GAME_HEIGHT + 200) { this->sprite.setPosition(sprite.getPosition().x, -200); this->hasFired = false; } // Only execute once if (order < 4) { if (moveTimer.getElapsedTime().asSeconds() > 0.005f) { moveTimer.restart(); switch (order) { case (0) : amplitude = 200; period = 1.0f; if (point_num == 0) { center_x = this->sprite.getPosition().x; center_y = this->sprite.getPosition().y; } sprite.setPosition(point_x, point_y); if (point_num <= 90) { moveSequence(timeElapsed, velocity, point_num, SINUSOID, 90, -2 * 360); break; } order++; point_num = 0; theta = 90; case (1) : semi_axis_x = 350; semi_axis_y = 200; // Use sprite's current position to start sequence (only for starting point) if (point_num == 0) { center_x = this->sprite.getPosition().x - (semi_axis_x * std::cos(theta * (PI / 180))); center_y = this->sprite.getPosition().y - (semi_axis_y * std::sin(theta * (PI / 180))); } if (point_num <= 30) { //moveSequence(this->shape2, timeElapsed, velocity, point_num, ELLIPSE, 30, 90); moveSequence(timeElapsed, velocity, point_num, ELLIPSE, 30, 90); sprite.setPosition(point_x, point_y); //moveSequence(timeElapsed, velocity, point_num, ELLIPSE, 15, 90); break; } // Move onto next sequence order++; point_num = 0; // Reset counter theta = 180; // New initial theta center_x -= (semi_axis_x - radius); // Move shape case (2) : radius = 200; point_x = center_x + (radius * std::cos(theta * (PI / 180))); point_y = center_y + (radius * std::sin(theta * (PI / 180))); sprite.setPosition(point_x, point_y); if (point_num <= 60) { //moveSequence(this->shape3, timeElapsed, velocity, point_num, CIRCLE, 60, 270); moveSequence(timeElapsed, velocity, point_num, CIRCLE, 60, 270); break; } // Move onto next sequence order++; point_num = 0; theta = 90; center_y -= (semi_axis_x - radius); case (3) : semi_axis_x = 200; semi_axis_y = 350; point_x = center_x + (semi_axis_x * std::cos(theta * (PI / 180))); point_y = center_y + (semi_axis_y * std::sin(theta * (PI / 180))); sprite.setPosition(point_x, point_y); if (point_num <= 30) { //moveSequence(this->shape4, timeElapsed, velocity, point_num, ELLIPSE, 30, 90); moveSequence(timeElapsed, velocity, point_num, ELLIPSE, 30, 90); break; } // Reset values order++; point_num = 0; theta = 0; // Go from position into grid formation //moveToFormation(timeElapsed); } } } // Execute other animations when not doing movement sequence else { // Break position and attack player after a certain amount of time if (moveTimer.getElapsedTime().asSeconds() > 5.0f) { attackPlayer(timeElapsed); } else { if (idleAnimateTimer.getElapsedTime().asSeconds() > 0.5f) { idleAnimateTimer.restart(); hasWingsOpen = !hasWingsOpen; idleAnimation(); } // Execute idle movement pattern if (idleMovementTimer.getElapsedTime().asSeconds() > 0.7f) { idleMovementTimer.restart(); isEnemyMovingRight = !isEnemyMovingRight; } if (isEnemyMovingRight) velocity.x = ENEMY_SPEED / 2; else if (!isEnemyMovingRight) velocity.x = -ENEMY_SPEED / 2; sprite.move(velocity * timeElapsed.asSeconds()); } } }