?? main.pas
字號:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, DXClass, DXSprite, DXInput, DXDraws,
DXSounds, DIB;
type
TGameScene = (
gsNone,
gsTitle,
gsMain,
gsGameOver
);
TMainForm = class(TDXForm)
DXTimer: TDXTimer;
DXDraw: TDXDraw;
SpriteEngine: TDXSpriteEngine;
DXInput: TDXInput;
ImageList: TDXImageList;
DXWaveList: TDXWaveList;
DXSound: TDXSound;
MainMenu: TMainMenu;
GameMenu: TMenuItem;
GameStart: TMenuItem;
GamePause: TMenuItem;
GameExit: TMenuItem;
OptionMenu: TMenuItem;
OptionFullScreen: TMenuItem;
OptionSound: TMenuItem;
OptionShowFPS: TMenuItem;
N4: TMenuItem;
N3: TMenuItem;
N1: TMenuItem;
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 OptionFullScreenClick(Sender: TObject);
procedure DXDrawInitializing(Sender: TObject);
procedure GameStartClick(Sender: TObject);
procedure GamePauseClick(Sender: TObject);
procedure GameExitClick(Sender: TObject);
procedure OptionSoundClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure OptionShowFPSClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
FScene: TGameScene;
FNextScene: TGameScene;
FBlink: DWORD;
FBlinkTime: DWORD;
FEnemyAdventPos: Integer;
FFrame: Integer;
FScore: Integer;
procedure BlinkStart;
procedure BlinkUpdate;
procedure PlaySound(const Name: string; Wait: Boolean);
procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
procedure StartScene(Scene: TGameScene);
procedure StartSceneTitle;
procedure StartSceneMain;
procedure StartSceneGameOver;
procedure EndScene;
procedure EndSceneTitle;
procedure EndSceneMain;
procedure EndSceneGameOver;
procedure SceneTitle;
procedure SceneMain;
procedure SceneGameOver;
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
type
TPlayerSprite = class(TImageSprite)
private
FCounter: Integer;
FMode: Integer;
FTamaCount: Integer;
FOldTamaTime: Integer;
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
TTamaSprite = class(TImageSprite)
private
FPlayerSprite: TPlayerSprite;
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
destructor Destroy; override;
end;
TScrollBackground = class(TBackgroundSprite)
private
FSpeed: Double;
protected
procedure DoMove(MoveCount: Integer); override;
end;
TBakuhatu = class(TImageSprite)
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
TEnemy = class(TImageSprite)
private
FCounter: Integer;
FLife: Integer;
FMode: Integer;
procedure Hit; virtual;
protected
procedure HitEnemy(Deaded: Boolean); virtual;
end;
TEnemyTama = class(TEnemy)
private
FPlayerSprite: TSprite;
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
TEnemyUFO = class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
TEnemyAttacker = class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
TEnemyBoss = class(TEnemy)
private
FCounter: Integer;
FTamaF: Integer;
FTamaT: Integer;
FPutTama: Boolean;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
{ Enemy appearance table }
TSpriteClass = class of TSprite;
TEnemyAdvent = record
f: Integer; { Frame No }
c: TSpriteClass; { Class }
x: Integer; { X }
y: Integer; { Y }
end;
const
EnemyAdventTable: array[0..27] of TEnemyAdvent = (
(f: 100; c: TEnemyUFO; x: 0; y: 0),
(f: 100; c: TEnemyUFO; x: 0; y: 120),
(f: 100; c: TEnemyUFO; x: 0; y: 240),
(f: 100; c: TEnemyUFO; x: 0; y: 360),
(f: 200; c: TEnemyUFO; x: 0; y: 60),
(f: 200; c: TEnemyUFO; x: 0; y: 180),
(f: 200; c: TEnemyUFO; x: 0; y: 300),
(f: 200; c: TEnemyUFO; x: 0; y: 420),
(f: 300; c: TEnemyUFO; x: 0; y: -60),
(f: 300; c: TEnemyUFO; x: 0; y: 60),
(f: 300; c: TEnemyUFO; x: 0; y: 180),
(f: 300; c: TEnemyUFO; x: 0; y: 300),
(f: 400; c: TEnemyAttacker; x: 0; y: 100),
(f: 420; c: TEnemyAttacker; x: 0; y: 200),
(f: 440; c: TEnemyAttacker; x: 0; y: 300),
(f: 450; c: TEnemyAttacker; x: 0; y: 200),
(f: 455; c: TEnemyAttacker; x: 0; y: 100),
(f: 460; c: TEnemyUFO; x: 0; y: 240),
(f: 470; c: TEnemyUFO; x: 0; y: 240),
(f: 480; c: TEnemyUFO; x: 0; y: 240),
(f: 490; c: TEnemyUFO; x: 0; y: 240),
(f: 500; c: TEnemyUFO; x: 0; y: 240),
(f: 520; c: TEnemyAttacker; x: 0; y: 240),
(f: 530; c: TEnemyAttacker; x: 0; y: 240),
(f: 540; c: TEnemyAttacker; x: 0; y: 240),
(f: 550; c: TEnemyAttacker; x: 0; y: 240),
(f: 560; c: TEnemyAttacker; x: 0; y: 240),
(f: 600; c: TEnemyBoss; x: 0; y: 200)
);
{ TPlayerSprite }
constructor TPlayerSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Machine');
Width := Image.Width;
Height := Image.Height;
X := 20;
Y := 240-Height div 2;
Z := 2;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
end;
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TEnemy then
begin
MainForm.PlaySound('Explosion', False);
Collisioned := False;
FCounter := 0;
FMode := 1;
Done := False;
{ Image change }
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end;
end;
procedure TPlayerSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
{ Existing now }
if isUp in MainForm.DXInput.States then
Y := Y - (250/1000)*MoveCount;
if isDown in MainForm.DXInput.States then
Y := Y + (250/1000)*MoveCount;
if isLeft in MainForm.DXInput.States then
X := X - (250/1000)*MoveCount;
if isRight in MainForm.DXInput.States then
X := X + (250/1000)*MoveCount;
if X<0 then X := 0;
if X>640-Width then X := 640-Width;
if Y<0 then Y := 0;
if Y>480-Height then Y := 480-Height;
if isButton1 in MainForm.DXInput.States then
begin
{ Bounce launching }
if (FTamaCount<8) and (FCounter-FOldTamaTime>=100) then
begin
Inc(FTamaCount);
with TTamaSprite.Create(Engine) do
begin
FPlayerSprite := Self;
X := Self.X+Self.Width;
Y := Self.Y+Self.Height div 2-Height div 2;
Z := 10;
end;
FOldTamaTime := FCounter;
end;
end;
Collision;
end else if FMode=1 then
begin
{ death }
if FCounter>200 then
begin
FCounter := 0;
FMode := 2;
Visible := False;
end;
end else if FMode=2 then
begin
{ Game over!! }
if FCounter>1500 then
begin
MainForm.FNextScene := gsGameOver;
MainForm.PlaySound('SceneMov', False);
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
end;
end;
FCounter := FCounter + MoveCount;
end;
{ TTamaSprite }
constructor TTamaSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Bounce');
Z := 2;
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
end;
destructor TTamaSprite.Destroy;
begin
Dec(FPlayerSprite.FTamaCount);
inherited Destroy;
end;
procedure TTamaSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if (Sprite is TEnemy) and (not (Sprite is TEnemyTama)) then
begin
TEnemy(Sprite).Hit;
Dead;
end;
Done := False;
end;
procedure TTamaSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X+(800/1000)*MoveCount;
if X>=640 then Dead;
Collision;
end;
{ TScrollBackground }
procedure TScrollBackground.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(60/1000)*FSpeed;
end;
{ TBakuhatu }
constructor TBakuhatu.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
AnimPos := Random(AnimCount);
end;
procedure TBakuhatu.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
end;
{ TEnemyTama }
constructor TEnemyTama.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Bounce');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
end;
procedure TEnemyTama.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(600/1000);
if X<-Width then Dead;
end;
{ TEnemy }
procedure TEnemy.Hit;
begin
Dec(FLife);
if FLife<=0 then
begin
Collisioned := False;
HitEnemy(True);
end else
HitEnemy(False);
end;
procedure TEnemy.HitEnemy(Deaded: Boolean);
begin
if Deaded then
MainForm.PlaySound('Explosion', False);
end;
{ TEnemyUFO }
constructor TEnemyUFO.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-disk');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
end;
procedure TEnemyUFO.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
{ Image change }
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end;
end;
procedure TEnemyUFO.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
{ Existing now }
X := X - MoveCount*(300/1000);
Y := Y + Cos256(FCounter div 15)*2;
if X<-Width then Dead;
end else if FMode=2 then
begin
{ death }
X := X - MoveCount*(300/1000);
if FCounter>200 then
Dead;
end;
FCounter := FCounter + MoveCount;
end;
{ TEnemyAttacker }
constructor TEnemyAttacker.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
end;
procedure TEnemyAttacker.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
{ Image change }
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end;
end;
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
{ Existing now }
X := X - MoveCount*(300/1000)-FCounter div 128;
if X<-Width then Dead;
end else if FMode=2 then
begin
{ death }
X := X - MoveCount*(300/1000);
if FCounter>200 then
Dead;
end;
FCounter := FCounter + MoveCount;
end;
{ TEnemyBoss }
constructor TEnemyBoss.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-boss');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
Collisioned := False;
FLife := 20;
end;
procedure TEnemyBoss.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 100000);
end else
begin
MainForm.PlaySound('kan!!', False);
Inc(MainForm.FScore, 100);
end;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -