📄 powerblaster.dpr
字号:
case Kind of
Ship:
begin
ImageName := 'Ship'+ IntToStr(Random(2));
CollideRadius := 40;
ScaleX := 0.7;
ScaleY := 0.8;
end;
SquareShip:
begin
ImageName := 'SquareShip' + IntToStr(Random(2));
CollideRadius := 30;
LookAt := True;
end;
AnimShip:
begin
ImageName := 'AnimShip' + IntToStr(Random(2));
CollideRadius := 25;
//ScaleX := 1.1;
//ScaleY := 1.1;
if ImageName = 'AnimShip1' then
SetAnim(ImageName, 0,8, 0.2, True, False, True);
if ImageName = 'AnimShip0' then
SetAnim(ImageName, 0, 4, 0.08, True, False, True);
end;
Mine:
begin
ImageName := 'Mine0';
CollideRadius := 16;
RotateSpeed := 0.04;
end;
end;
TempMoveSpeed := MoveSpeed;
Width := PatternWidth;
Height:= PatternHeight;
end;
end;
//create asteroids
for I := 0 to 500 do
with TAsteroids.Create(SpriteEngine) do
begin
ImageName := 'Roids' + IntToStr(Random(3));
AnimPos := Random(25);
PosX := Random(8000)-2500;
PosY := Random(8000)-2500;
Z := 4800;
Width := PatternWidth;
Height:= PatternHeight;
DrawMode := 1;
DoCenter := True;
SetAnim(ImageName, 0, PatternCount, 0.15, True, False, True);
if ImageName = 'Roids0' then AnimSpeed := 0.2;
if ImageName = 'Roids1' then AnimSpeed := 0.16;
if ImageName = 'Roids2' then AnimSpeed := 0.25;
case UserRefreshRate of
60: MoveSpeed := RandomFrom(RandNumber)*1.5;
75: MoveSpeed := RandomFrom(RandNumber)*1.25;
85: MoveSpeed := RandomFrom(RandNumber);
end;
Range := 150 + Random(200);
Step := (Random(1512));
Seed := 50 + Random(100);
Life := 6;
ScaleX := 1;
ScaleY := 1;
Collisioned := True;
if ImageName='Roids0' then CollideRadius := 32;
if ImageName='Roids1' then CollideRadius := 48;
if ImageName='Roids2' then CollideRadius := 50;
end;
//create player's ship
PlayerShip:= TPlayerShip.Create(SpriteEngine);
with PlayerShip do
begin
ImageName :='PlayerShip';
Width := PatternWidth;
Height:= PatternHeight;
ScaleX := 1.2;
ScaleY := 1.2;
DoCenter := True;
DrawMode := 1;
Decceleration := 0.02;
MinSpeed := 0;
case UserRefreshRate of
60:
begin
Maxspeed := 4.7;
Acceleration := 0.02*1.5;
end;
75:
begin
Maxspeed := 3.5;
Acceleration := 0.02*1.2;
end;
85:
begin
Maxspeed := 3;
Acceleration := 0.02;
end;
100: Maxspeed := 2.5;
120: Maxspeed := 1.5;
end;
Z := 5000;
Collisioned := True;
CollideRadius := 25;
end;
LoadMap('Level1.map');
CreateMap(-2500, -2500);
//create planet
for I := 0 to 100 do
begin
with TSprite.Create(SpaceLayer) do
begin
ImageName := 'Planet'+ InttoStr(Random(4));
Width := PatternWidth;
Height := PatternHeight;
X := (Random(25) * 300) - 2500;
Y := (Random(25) * 300) - 2500;
Moved := False;
end;
end;
//create a huge endless space
with TTileMapSprite.Create(SpaceLayer) do
begin
ImageName := 'Space';
Width := PatternWidth;
Height := PatternHeight;
SetMapSize(1, 1);
DoTile := True;
Moved := False;
end;
//create mist layer1
with TTileMapSprite.Create(MistLayer1) do
begin
ImageName := 'Mist';
Width := PatternWidth;
Height := PatternHeight;
BlendMode := Blend_Add2X;
SetMapSize(1, 1);
DoTile := True;
Moved := False;
end;
//create mist layer2
with TTileMapSprite.Create(MistLayer2) do
begin
ImageName := 'Mist';
X := 200;
Y := 200;
Width := PatternWidth;
Height := PatternHeight;
BlendMode := Blend_Add2X;
SetMapSize(1, 1);
DoTile := True;
Moved := False;
end;
end;
procedure TEnemy.DoMove(const MoveCount: Single);
begin
if (Life >= 1) and (ImageName <> 'Explosion2') then
BlendMode := Blend_Default;
if (InOffScreen) and (ImageName <> 'Explosion2') then
MoveSpeed := TempMoveSpeed;
if (Life <=0) or (not InOffScreen) then
MoveSpeed := 0;
if Trunc(AnimPos) >= 15 then Dead;
if (Trunc(AnimPos) >= 1) and (ImageName = 'Explosion2') then
Collisioned := False;
case Kind of
Ship:
begin
CollidePos := Point2(X + 64, Y + 64);
case Random(100) of
40..43:
begin
DestAngle := Random(255);
end;
51..52:
begin
DestAngle:=Trunc(
Angle256(Trunc(PlayerShip.X) - Trunc(Self.X),
Trunc(PlayerShip.Y) - Trunc(Self.Y))
);
end;
end;
RotateToAngle(DestAngle, RotateSpeed, MoveSpeed);
end;
SquareShip:
begin
CollidePos := Point2(X + 30, Y + 30);
case Random(100) of
40..45:
begin
DestX := Random(8000);
DestY := Random(6000)
end;
51..52:
begin
DestX := Trunc(PlayerShip.X);
DestY := Trunc(PlayerShip.Y);
end;
end;
CircleToPos(DestX, DestY, Trunc(PlayerShip.X), Trunc(PlayerShip.Y), RotateSpeed, MoveSpeed, LookAt);
end;
AnimShip:
begin
CollidePos := Point2(X + 20, Y + 20);
case Random(100) of
40..45:
begin
DestX := Random(8000);
DestY := Random(6000)
end;
51..54:
begin
DestX := Trunc(PlayerShip.X);
DestY := Trunc(PlayerShip.Y);
end;
end;
RotateToPos(DestX, DestY, RotateSpeed, MoveSpeed);
end;
Mine:
begin
CollidePos := Point2(X + 32, Y + 32);
case Random(300) of
150:
begin
DestX := Trunc(PlayerShip.X);
DestY := Trunc(PlayerShip.Y);
end;
200..202:
begin
DestX := Random(8000);
DestY := Random(8000);
end;
end;
Angle := Angle + RotateSpeed;
TowardToPos(DestX, DestY, MoveSpeed, False);
end;
end;
//enemy shoot bullet
if (Kind = Ship) or (Kind = SquareShip) then
begin
if InOffScreen then
begin
if Random(100) = 50 then
begin
Bullet := TBullet.Create(SpriteEngine);
Bullet.ImageName := 'BulletR';
case UserRefreshRate of
60: Bullet.MoveSpeed := 9;
75: Bullet.MoveSpeed := 7;
85: Bullet.MoveSpeed := 5;
end;
Bullet.X := Self.X + 1;
Bullet.Y := Self.Y;
Bullet.DestAngle := Angle * 40;
end;
end;
end;
inherited;
end;
function TEnemy.InOffScreen: Boolean;
begin
if (X > Engine.WorldX -50)and
(Y > Engine.WorldY - 50) and
(X < Engine.WorldX + 850) and
(Y < Engine.WorldY + 650) then
Result := True
else
Result := False;
end;
constructor TBullet.Create(const AParent: TSprite);
begin
inherited;
BlendMode := Blend_Add;
Z := 4000;
FCounter := 0;
DrawMode := 1;
Collisioned:= True;
if ImageName = 'Bulletr' then CollideRadius := 15;
if ImageName = 'BulletS' then CollideRadius := 12;
end;
procedure TBullet.DoMove;
begin
inherited;
CollidePos := Point2(X + 20, Y + 20);
TowardToAngle(Trunc(DestAngle), MoveSpeed, True);
Inc(FCounter);
if (Trunc(AnimPos) >= 15) and (ImageName = 'Explosion3') then Dead;
if FCounter > 150 then Dead;
end;
procedure TPlayerBullet.DoMove;
begin
inherited;
TowardToAngle(Trunc(Angle * 40), MoveSpeed, True);
CollidePos := Point2(X + 24, Y + 38);
Inc(FCounter);
if FCounter > 80 then
Dead;
if Trunc(AnimPos) >= 11 then
Dead;
Collision;
end;
procedure TPlayerBullet.DoCollision(const Sprite: TSprite);
var
I: Integer;
begin
if Sprite is TAsteroids then
begin
//MainForm.Music.Songs.Find('Hit').Play;
Collisioned := False;
MoveSpeed := 0;
SetAnim('Explosions', 0, 12, 0.3, False, False, True);
if Trunc(AnimPos) < 1 then
TAsteroids(Sprite).BlendMode := Blend_Bright;
TAsteroids(Sprite).Life := TAsteroids(Sprite).Life - 1;
if (TAsteroids(Sprite).Life <= 0) then
begin
//MainForm.Music.Songs.Find('Explode').Play;
TAsteroids(Sprite).MoveSpeed := 0;
for I := 0 to 128 do
with TExplosion.Create(SpriteEngine) do
begin
ImageName := 'Particles';
Width := PatternWidth;
Height := PatternHeight;
BlendMode := Blend_Add2X;
X := TAsteroids(Sprite).X+-Random(60);
Y := TAsteroids(Sprite).Y-Random(60);
Z := 4850;
PatternIndex := 7;
ScaleX := 3;
ScaleY := 3;
Red := 255;
Green := 50;
Blue := 50;
case UserRefreshRate of
60:
begin
Acceleration := 0.0252*1.2;
MinSpeed := 1*1.2;
MaxSpeed := -(0.21 + Random(2))*1.2;
end;
75:
begin
Acceleration := 0.0252*1.1;
MinSpeed := 1*1.1;
MaxSpeed := -(0.21 + Random(2))*1.1;
end;
85:
begin
Acceleration := 0.0252*1.2;
MinSpeed := 1*1.2;
MaxSpeed := -(0.21 + Random(2))*1.2;
end;
end;
Direction:= I * 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -