Untitled
unknown
plain_text
a year ago
2.9 kB
3
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