Untitled
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