📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, DXClass, DXSprite, DXInput, DXDraws,
DXSounds;
type
TMainForm = class(TDXForm)
DXTimer: TDXTimer;
DXDraw: TDXDraw;
DXSpriteEngine: TDXSpriteEngine;
DXInput: TDXInput;
ImageList: TDXImageList;
DXWaveList: TDXWaveList;
DXSound: TDXSound;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXDrawFinalize(Sender: TObject);
procedure DXDrawInitialize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
procedure DXTimerActivate(Sender: TObject);
procedure DXTimerDeactivate(Sender: TObject);
procedure DXDrawClick(Sender: TObject);
private
FMoveMode: Boolean;
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
type
TMonoSprite = class(TImageSprite)
private
FCounter: Double;
FS: Integer;
procedure Hit;
public
procedure DoMove(MoveCount: Integer); override;
end;
TPlayerSprite = class(TImageSprite)
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
end;
procedure TMonoSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
PixelCheck := True;
FCounter := FCounter + (100/1000)*MoveCount;
X := X+Sin256(Trunc(FCounter))*(200/1000)*MoveCount;
Y := Y+Cos256(Trunc(FCounter))*(200/1000)*MoveCount;
if not Collisioned then
begin
Inc(FS, MoveCount);
if FS>200 then Dead;
end;
end;
procedure TMonoSprite.Hit;
begin
Collisioned := False;
Image := MainForm.ImageList.Items.Find('img1-2');
MainForm.DXWaveList.Items.Find('snd').Play(False);
MainForm.DXInput.Joystick.Effects.Find('eff1').Start;
end;
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TMonoSprite then
TMonoSprite(Sprite).Hit;
Done := False;
end;
procedure TPlayerSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if isUp in MainForm.DXInput.States then
Y := Y - (300/1000)*MoveCount;
if isDown in MainForm.DXInput.States then
Y := Y + (300/1000)*MoveCount;
if isLeft in MainForm.DXInput.States then
X := X - (300/1000)*MoveCount;
if isRight in MainForm.DXInput.States then
X := X + (300/1000)*MoveCount;
Collision;
Engine.X := -X+Engine.Width div 2-Width div 2;
Engine.Y := -Y+Engine.Height div 2-Height div 2;
end;
procedure TMainForm.DXTimerActivate(Sender: TObject);
begin
Caption := Application.Title;
end;
procedure TMainForm.DXTimerDeactivate(Sender: TObject);
begin
Caption := Application.Title + ' [Pause]';
end;
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw.CanDraw then exit;
DXInput.Update;
if FMoveMode then
LagCount := 1000 div 60;
DXSpriteEngine.Move(LagCount);
DXSpriteEngine.Dead;
{ Description }
DXDraw.Surface.Fill(0);
DXSpriteEngine.Draw;
{ Frame rate display }
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clWhite;
Font.Size := 12;
Textout(0, 0, 'FPS: '+inttostr(DXTimer.FrameRate));
Textout(0, 24, 'Sprite: '+inttostr(DXSpriteEngine.Engine.AllCount));
Textout(0, 48, 'Draw: '+inttostr(DXSpriteEngine.Engine.DrawCount));
if FMoveMode then
Textout(0, 72, 'Time mode: 60 FPS')
else
Textout(0, 72, 'Time mode: Real time');
Release;
end;
DXDraw.Flip;
end;
procedure TMainForm.DXDrawFinalize(Sender: TObject);
begin
DXTimer.Enabled := False;
end;
procedure TMainForm.DXDrawInitialize(Sender: TObject);
begin
DXTimer.Enabled := True;
end;
procedure TMainForm.FormCreate(Sender: TObject);
var
i: Integer;
PlayerSprite: TSprite;
begin
Randomize;
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable;
DXDraw.DefColorTable := ImageList.Items.ColorTable;
DXDraw.UpdatePalette;
with TBackgroundSprite.Create(DXSpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := ImageList.Items.Find('background');
Z := -2;
Tile := True;
end;
for i:=0 to 200 do
with TMonoSprite.Create(DXSpriteEngine.Engine) do
begin
Image := ImageList.Items.Find('img1');
X := Random(5000)-2500;
Y := Random(5000)-2500;
Z := 2;
Width := Image.Width;
Height := Image.Height;
FCounter := Random(MaxInt);
end;
PlayerSprite := TPlayerSprite.Create(DXSpriteEngine.Engine);
with TPlayerSprite(PlayerSprite) do
begin
Image := ImageList.Items.Find('img2');
Z := 2;
Width := Image.Width;
Height := Image.Height;
end;
end;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
{ Application end }
if Key=VK_ESCAPE then
Close;
{ Screen mode change }
if (ssAlt in Shift) and (Key=VK_RETURN) then
begin
DXDraw.Finalize;
if doFullScreen in DXDraw.Options then
begin
RestoreWindow;
DXDraw.Cursor := crDefault;
BorderStyle := bsSizeable;
DXDraw.Options := DXDraw.Options - [doFullScreen];
end else
begin
StoreWindow;
DXDraw.Cursor := crNone;
BorderStyle := bsNone;
DXDraw.Options := DXDraw.Options + [doFullScreen];
end;
DXDraw.Initialize;
end;
end;
procedure TMainForm.DXDrawClick(Sender: TObject);
begin
FMoveMode := not FMoveMode;
if FMoveMode then
begin
DXTimer.Interval := 1000 div 60;
end else
begin
DXTimer.Interval := 0;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -