
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;