Untitled

 avatar
unknown
plain_text
a year ago
2.9 kB
2
Indexable
bool flag = false;
void Turret::Update(float deltaTime) {

  Sprite::Update(deltaTime);
  PlayScene *scene = getPlayScene();

     for (auto &it: scene->EnemyGroup->GetObjects()) {
         Enemy *enemy = dynamic_cast<Enemy *>(it);
         if (Engine::Collider::IsCircleOverlap(this->Position, this->CollisionRadius / 20, it->Position,
                                               enemy->CollisionRadius / 20)) {
             for (auto &it: scene->EnemyGroup->GetObjects()) {
                 Enemy *enemy = dynamic_cast<Enemy *>(it);
                 if (Engine::Collider::IsCircleOverlap(this->Position, this->CollisionRadius / 20, it->Position,
                                                       enemy->CollisionRadius / 20)) {
                     enemy->collideplant = true;
                     if (Position.x - it->Position.x > 40 && Position.x - it->Position.x < 45) {
                         Hit(enemy->hp);
                         enemy->collideplant = false;
                     }
                     return;
                 }

             }
         }
     }

           
	imgBase.Position = Position;
	imgBase.Tint = Tint;
	if (!Enabled)
		return;
	if (Target) {
		Engine::Point diff = Target->Position - Position;
		if (diff.Magnitude() > CollisionRadius) {
			Target->lockedTurrets.erase(lockedTurretIterator);
			Target = nullptr;
			lockedTurretIterator = std::list<Turret*>::iterator();
		}
	}
	if (!Target) {
		// Lock first seen target.
		// Can be improved by Spatial Hash, Quad Tree, ...
		// However simply loop through all enemies is enough for this program.
		for (auto& it : scene->EnemyGroup->GetObjects()) {
			if(it->Position.y == Position.y){
				Target = dynamic_cast<Enemy*>(it);
				Target->lockedTurrets.push_back(this);
				lockedTurretIterator = std::prev(Target->lockedTurrets.end());
				break;
			}
		}
	}
	if (Target) {
		Engine::Point originRotation = Engine::Point(cos(Rotation - ALLEGRO_PI / 2), sin(Rotation - ALLEGRO_PI / 2));
		Engine::Point targetRotation = (Target->Position - Position).Normalize();
		float maxRotateRadian = rotateRadian * deltaTime;
		float cosTheta = originRotation.Dot(targetRotation);
		// Might have floating-point precision error.
		if (cosTheta > 1) cosTheta = 1;
		else if (cosTheta < -1) cosTheta = -1;
		float radian = acos(cosTheta);
		Engine::Point rotation;
		if (abs(radian) <= maxRotateRadian)
			rotation = targetRotation;
		else
			rotation = ((abs(radian) - maxRotateRadian) * originRotation + maxRotateRadian * targetRotation) / radian;
		// Add 90 degrees (PI/2 radian), since we assume the image is oriented upward.
		Rotation = atan2(rotation.y, rotation.x) + ALLEGRO_PI / 2;
		// Shoot reload.
		reload -= deltaTime;
		if (reload <= 0) {
			// shoot.
			reload = coolDown;
			CreateBullet();
		}
	}
}
Editor is loading...
Leave a Comment