home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / DELPHIX.ZIP / Samples / Sprite / Basic / Main.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-10-06  |  5.8 KB  |  254 lines

  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, ExtCtrls, Menus, DXClass, DXSprite, DXInput, DXDraws,
  8.   DXSounds;
  9.  
  10. type
  11.   TMainForm = class(TDXForm)
  12.     DXTimer: TDXTimer;
  13.     DXDraw: TDXDraw;
  14.     DXSpriteEngine: TDXSpriteEngine;
  15.     DXInput: TDXInput;
  16.     ImageList: TDXImageList;
  17.     DXWaveList: TDXWaveList;
  18.     DXSound: TDXSound;
  19.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  20.       Shift: TShiftState);
  21.     procedure DXDrawFinalize(Sender: TObject);
  22.     procedure DXDrawInitialize(Sender: TObject);
  23.     procedure FormCreate(Sender: TObject);
  24.     procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
  25.     procedure DXTimerActivate(Sender: TObject);
  26.     procedure DXTimerDeactivate(Sender: TObject);
  27.     procedure DXDrawClick(Sender: TObject);
  28.   private
  29.     FMoveMode: Boolean;
  30.   end;
  31.  
  32. var
  33.   MainForm: TMainForm;
  34.  
  35. implementation
  36.  
  37. {$R *.DFM}
  38.  
  39. type
  40.  
  41.   TMonoSprite = class(TImageSprite)
  42.   private
  43.     FCounter: Double;
  44.     FS: Integer;
  45.     procedure Hit;
  46.   public
  47.     procedure DoMove(MoveCount: Integer); override;
  48.   end;
  49.  
  50.   TPlayerSprite = class(TImageSprite)
  51.   protected
  52.     procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
  53.     procedure DoMove(MoveCount: Integer); override;
  54.   end;
  55.  
  56. procedure TMonoSprite.DoMove(MoveCount: Integer);
  57. begin
  58.   inherited DoMove(MoveCount);
  59.   PixelCheck := True;
  60.   FCounter := FCounter + (100/1000)*MoveCount;
  61.   X := X+Sin256(Trunc(FCounter))*(200/1000)*MoveCount;
  62.   Y := Y+Cos256(Trunc(FCounter))*(200/1000)*MoveCount;
  63.  
  64.   if not Collisioned then
  65.   begin
  66.     Inc(FS, MoveCount);
  67.     if FS>200 then Dead;
  68.   end;
  69. end;
  70.  
  71. procedure TMonoSprite.Hit;
  72. begin
  73.   Collisioned := False;
  74.  
  75.   Image := MainForm.ImageList.Items.Find('img1-2');
  76.   MainForm.DXWaveList.Items.Find('snd').Play(False);
  77.   MainForm.DXInput.Joystick.Effects.Find('eff1').Start;
  78. end;
  79.  
  80. procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
  81. begin
  82.   if Sprite is TMonoSprite then
  83.     TMonoSprite(Sprite).Hit;
  84.   Done := False;
  85. end;
  86.  
  87. procedure TPlayerSprite.DoMove(MoveCount: Integer);
  88. begin
  89.   inherited DoMove(MoveCount);
  90.  
  91.   if isUp in MainForm.DXInput.States then
  92.     Y := Y - (300/1000)*MoveCount;
  93.  
  94.   if isDown in MainForm.DXInput.States then
  95.     Y := Y + (300/1000)*MoveCount;
  96.  
  97.   if isLeft in MainForm.DXInput.States then
  98.     X := X - (300/1000)*MoveCount;
  99.  
  100.   if isRight in MainForm.DXInput.States then
  101.     X := X + (300/1000)*MoveCount;
  102.  
  103.   Collision;
  104.  
  105.   Engine.X := -X+Engine.Width div 2-Width div 2;
  106.   Engine.Y := -Y+Engine.Height div 2-Height div 2;
  107. end;
  108.  
  109. procedure TMainForm.DXTimerActivate(Sender: TObject);
  110. begin
  111.   Caption := Application.Title;
  112. end;
  113.  
  114. procedure TMainForm.DXTimerDeactivate(Sender: TObject);
  115. begin
  116.   Caption := Application.Title + ' [Pause]';
  117. end;
  118.  
  119. procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
  120. begin
  121.   if not DXDraw.CanDraw then exit;
  122.  
  123.   DXInput.Update;
  124.  
  125.   if FMoveMode then
  126.     LagCount := 1000 div 60;
  127.  
  128.   DXSpriteEngine.Move(LagCount); 
  129.   DXSpriteEngine.Dead;
  130.  
  131.   {  Description  }
  132.   DXDraw.Surface.Fill(0);
  133.   DXSpriteEngine.Draw;
  134.  
  135.   {  Frame rate display  }
  136.   with DXDraw.Surface.Canvas do
  137.   begin
  138.     Brush.Style := bsClear;
  139.     Font.Color := clWhite;
  140.     Font.Size := 12;
  141.     Textout(0, 0, 'FPS: '+inttostr(DXTimer.FrameRate));
  142.     Textout(0, 24, 'Sprite: '+inttostr(DXSpriteEngine.Engine.AllCount));
  143.     Textout(0, 48, 'Draw: '+inttostr(DXSpriteEngine.Engine.DrawCount));
  144.     if FMoveMode then                  
  145.       Textout(0, 72, 'Time mode: 60 FPS')
  146.     else
  147.       Textout(0, 72, 'Time mode: Real time');
  148.  
  149.     Release;
  150.   end;
  151.  
  152.   DXDraw.Flip;
  153. end;
  154.  
  155. procedure TMainForm.DXDrawFinalize(Sender: TObject);
  156. begin
  157.   DXTimer.Enabled := False;
  158. end;
  159.  
  160. procedure TMainForm.DXDrawInitialize(Sender: TObject);
  161. begin
  162.   DXTimer.Enabled := True;
  163. end;
  164.  
  165. procedure TMainForm.FormCreate(Sender: TObject);
  166. var
  167.   i: Integer;
  168.   PlayerSprite: TSprite;
  169. begin
  170.   Randomize;
  171.  
  172.   ImageList.Items.MakeColorTable;
  173.  
  174.   DXDraw.ColorTable := ImageList.Items.ColorTable;
  175.   DXDraw.DefColorTable := ImageList.Items.ColorTable;
  176.   DXDraw.UpdatePalette;
  177.  
  178.   with TBackgroundSprite.Create(DXSpriteEngine.Engine) do
  179.   begin
  180.     SetMapSize(1, 1);
  181.     Image := ImageList.Items.Find('background');
  182.     Z := -2;
  183.     Tile := True;
  184.   end;
  185.  
  186.   for i:=0 to 200 do
  187.     with TMonoSprite.Create(DXSpriteEngine.Engine) do
  188.     begin
  189.       Image := ImageList.Items.Find('img1');
  190.       X := Random(5000)-2500;
  191.       Y := Random(5000)-2500;
  192.       Z := 2;
  193.       Width := Image.Width;
  194.       Height := Image.Height;
  195.       FCounter := Random(MaxInt);
  196.     end;
  197.  
  198.   PlayerSprite := TPlayerSprite.Create(DXSpriteEngine.Engine);
  199.   with TPlayerSprite(PlayerSprite) do
  200.   begin
  201.     Image := ImageList.Items.Find('img2');
  202.     Z := 2;
  203.     Width := Image.Width;
  204.     Height := Image.Height;
  205.   end;
  206. end;
  207.  
  208. procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  209.   Shift: TShiftState);
  210. begin
  211.   {  Application end  }
  212.   if Key=VK_ESCAPE then
  213.     Close;
  214.  
  215.   {  Screen mode change  }
  216.   if (ssAlt in Shift) and (Key=VK_RETURN) then
  217.   begin
  218.     DXDraw.Finalize;
  219.  
  220.     if doFullScreen in DXDraw.Options then
  221.     begin
  222.       RestoreWindow;
  223.  
  224.       DXDraw.Cursor := crDefault;
  225.       BorderStyle := bsSizeable;
  226.       DXDraw.Options := DXDraw.Options - [doFullScreen];
  227.     end else
  228.     begin
  229.       StoreWindow;
  230.  
  231.       DXDraw.Cursor := crNone;
  232.       BorderStyle := bsNone;
  233.       DXDraw.Options := DXDraw.Options + [doFullScreen];
  234.     end;
  235.  
  236.     DXDraw.Initialize;
  237.   end;
  238. end;
  239.  
  240. procedure TMainForm.DXDrawClick(Sender: TObject);
  241. begin
  242.   FMoveMode := not FMoveMode;
  243.   if FMoveMode then
  244.   begin
  245.     DXTimer.Interval := 1000 div 60;
  246.   end else
  247.   begin
  248.     DXTimer.Interval := 0;
  249.   end;
  250. end;
  251.                      
  252. end.
  253.  
  254.