⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powerblaster.dpr

📁 完整的Delphi游戏开发控件
💻 DPR
📖 第 1 页 / 共 3 页
字号:
               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 + -