AstroMine
(*
Die Feindminen können mehrere States haben, die in der "Tag" Eigenschaft der
Objekte gespeichert sind (diese Eigenschaft steht dem Benutzer zur freien
Verfügung, muss aber nicht genutzt werden).
Die Bedeutungen sind:
0: Feind ist in Wartestellung, nicht sichtbar und wird eventuell von SpawnEnemy
   aktiviert
1: Feind macht sich auf den Weg die Erde zu zerstören - erreicht er das Bildschirmende
   hat man verloren, kollidiert der Spieler mit dem Feind, so explodiert dieser
2: Feind ist gerade dabei zu explodieren, nach erfolgter Explosion geht er
   wieder in Wartestellung :^)
*)
procedure ManageEnemies;
var v: TVec;
    i: integer;
    d: double;
    f: float;
begin
  SpawnEnemy;
  for i:=0 to MaxEnemies-1 do begin
    if Enemy[i].GetTag=1 then begin
      Enemy[i].RotateCoord(LastFrameTime*EnemyRotSpeed, LastFrameTime*EnemyRotSpeed, LastFrameTime*EnemyRotSpeed);
      Enemy[i].Move(0,-LastFrameTime*EnemySpeed,0);
      v := Enemy[i].GetPosv;
      if v.y < -0.9 then begin
        LoseGame;
      end;
      if Ship.SphereIntersect(Enemy[i]) then begin
        v := Enemy[i].GetPosv;
        SoundSetPos(Missile, v);
        SoundPlay(Missile);
        Points := Points + 1;
        Enemy[i].SetTag(2);
        Enemy[i].SetTransparency(Transparent);
        EnemyExplodeTime[i] := QueryTimer;
        MakeExplosionRS(EnemyRS[i]);
        EnemyExplosionColor[i] := Color3f(0.5*Random+0.5, 0.5*Random+0.5, Random);
      end;
    end
    else if Enemy[i].GetTag=2 then begin
      d := QueryTimer - EnemyExplodeTime[i];
      if d<1.0 then begin
        f := 1.0 + d*2;
        Enemy[i].SetScale(f,f,f);
        EnemyRS[i].SetColor(True, EnemyExplosionColor[i].r, EnemyExplosionColor[i].g, EnemyExplosionColor[i].b, 1.0 - d);
      end
      else begin
        Enemy[i].SetPos(0,1.3,-2);
        Enemy[i].SetCoordAngle(0,0,0);
        Enemy[i].SetScale(1,1,1);
        Enemy[i].SetTag(0);
        Enemy[i].SetTransparency(Opaque);
        MakeStandardRS(EnemyRS[i]);
      end;
    end;
  end;
end;