Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
  }
}
Exemplo n.º 4
0
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());
		}
	}
}