?? uformmain.pas
字號:
unit uFormMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, DXDraws, DXClass, DXSprite, DXInput, ZLib, StdCtrls;
type
TGameScene = (
gsLogin,
gsMain,
gsGameOver
);
TMoveDir = (mdNone, mdUp, mdDown, mdLeft, mdRight); //無,上,下,左,右
TGoodsSprite = class(TImageSprite)
private
moveTimeOut: DWORD;
moveTo: Boolean;
protected
procedure DoDraw; override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
AddWhat: Integer; //加什么
constructor Create(AParent: TSprite); override;
end;
TButtonSprite = class(TImageSprite)
public
ObjName: string;
end;
TTile = record
TileIndex: Integer; //保存地表的信息
ObjIndex: Integer; //保存地表之上的處于人物之下的建筑或者物品
CanMove: Boolean; //可以移動的
CanDestroy: Boolean; //可以摧毀的
end;
TTileSprite = class(TImageSprite)
private
protected
procedure DoDraw; override;
public
BX, BY: Integer;
isBackground: boolean;
ShowZIndex: Boolean;
end;
TObjectSprite = class(TImageSprite)
private
protected
procedure DoDraw; override;
public
BX, BY: Integer;
Face: TImageSprite;
ShowZIndex: Boolean;
end;
TCursorSprite = class(TImageSprite);
TPlayerSprite = class(TImageSprite)
private
FShowDeadTiemOut: DWORD;
FSpeed: Double;
FDropBombTimeOut: DWORD;
FAnimTimeOut: DWORD;
FAnimTimeIndex: Integer;
FAnimRun: boolean;
OldX, OldY: double;
ShadowImg: TPictureCollectionItem;
OffsetX, OffsetY: Integer;
UCount, DCount, LCount, RCount: Integer;
BombList: TList;
function GetLeft: double;
function GetTop: double;
procedure SetLeft(value: double);
procedure SetTop(value: double);
procedure ModifyZIndex(x, y: Double);
function CanDropBomb(x, y: Double): boolean;
protected
procedure DoDraw; override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
gameOver: boolean;
ID: Integer;
MaxBombCount: integer;
BombCount: Integer;
Power: Integer;
Speed: Double;
OldDir, Dir: TMoveDir;
Face: TImageSprite;
BX, BY: Integer;
HP: Integer;
Exp: Integer;
ShowDead: Boolean;
constructor Create(AParent: TSprite); override;
property Left: double read GetLeft write SetLeft;
property Top: double read GetTop write SetTop;
procedure SetZIndex(Z: integer);
end;
//地圖遮照層
TBombTileSprite = class(TImageSprite);
//炸彈類
TBombSprite = class(TImageSprite)
private
FBombTimeOut: DWORD; //爆炸時間
protected
procedure DoDraw; override;
public
Face: TBombTileSprite;
RefPlayer: TPlayerSprite;
BX, BY: integer; //矩陣索引
newBomb: boolean; //新炸彈?可以越過
procedure DoMove(MoveCount: Integer); override;
constructor Create(AParent: TSprite; Player: TPlayerSprite);
procedure BuilderFire;
end;
TFireSprite = class(TImageSprite)
private
FFireTimeOut: DWORD;
protected
procedure DoDraw; override;
public
PlayerZ: integer; //保存玩家Z坐標(biāo)
Bx, By: Integer;
CanBreakObject: Boolean;
procedure DoMove(MoveCount: Integer); override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
constructor Create(AParent: TSprite); override;
end;
TMap = class
public
width, height, left, top: Integer;
end;
TFormMain = class(TDXForm)
DXDraw: TDXDraw;
DXInput: TDXInput;
DXSpriteEngine: TDXSpriteEngine;
DXTimer: TDXTimer;
DXImageList: TDXImageList;
Edit1: TEdit;
Edit2: TEdit;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormDestroy(Sender: TObject);
procedure DXDrawMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
MapTile: array[0..14, 0..12] of TTile;
PlayerArray: array[0..1] of TPoint;
Player1: TPlayerSprite;
Player2: TPlayerSprite;
FExitButton: TButtonSprite;
TileList: TStrings;
PlayerList: TStrings;
CursorSprite: TCursorSprite;
GameState: TGameScene;
procedure InitMap(Cnt_testMapName: string);
procedure InitMapTile;
procedure InitImageList;
procedure InitPlayer;
procedure InitScreen;
procedure InitSysCursor;
procedure InitUI;
procedure InitGameMapList;
procedure StartGame(lagcount: Integer);
// procedure UpdateMapView(LagCount: Integer);
function GetPlayerPos(playerID: Integer): TPoint;
public
{ Public declarations }
end;
const
Cnt_TileWidth = 40; //Tile 寬
Cnt_TileHeight = 40; //Tile 高
Cnt_TileWidthCount = 14; // 0..14 =15 ,屏幕列數(shù) ,寬度=600
Cnt_TileHeightCount = 12; //0..12 =13 ,屏幕行數(shù) ,高度=520
Cnt_HighTile = 56;
Cnt_MaxPlayer = 1; //0..1=2
Cnt_OffsetX = 20; //偏移坐標(biāo)x
Cnt_OffsetY = 40; //偏移坐標(biāo)y
Cnt_PlayerTop = 57 - Cnt_TileHeight; //修剪高度
Cnt_PlayerLeft = 48 - Cnt_TileWidth; //修剪寬度
Cnt_MapWidth = Cnt_TileWidthCount * Cnt_TileWidth;
Cnt_MapHeight = Cnt_TileHeightCount * Cnt_TileHeight;
Cnt_AnimTimeout = 100;
TestSpeed = 8000;
Cnt_BombTimeOut = 4000; //5秒
Cnt_FireTimeOut = 200; //0.3 秒
Cnt_DropBombTimeOut = 210; //一秒
Cnt_ModifyPlayerPosWidth = 20; //修正坐標(biāo)
Cnt_ShowDeadTimeOut = 6000; //顯示6秒
var
FormMain : TFormMain;
grx, gry : Integer;
implementation
{$R *.dfm}
{ Compress a stream }
procedure CompressStream(inpStream, outStream: TStream);
var
InpBuf, OutBuf : Pointer;
InpBytes, OutBytes: Integer;
begin
InpBuf := nil;
OutBuf := nil;
try
GetMem(InpBuf, inpStream.Size);
inpStream.Position := 0;
InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
outStream.Write(OutBuf^, OutBytes);
finally
if InpBuf <> nil then
FreeMem(InpBuf);
if OutBuf <> nil then
FreeMem(OutBuf);
end;
end;
{ Decompress a stream }
procedure DecompressStream(inpStream, outStream: TStream);
var
InpBuf, OutBuf : Pointer;
OutBytes, sz : Integer;
begin
InpBuf := nil;
OutBuf := nil;
sz := inpStream.Size - inpStream.Position;
if sz > 0 then
try
GetMem(InpBuf, sz);
inpStream.Read(InpBuf^, sz);
DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
outStream.Write(OutBuf^, OutBytes);
finally
if InpBuf <> nil then
FreeMem(InpBuf);
if OutBuf <> nil then
FreeMem(OutBuf);
end;
outStream.Position := 0;
end;
procedure TFormMain.InitMap(Cnt_testMapName: string);
var
MapFileName : string;
FileHandle : Integer;
ms1, ms2 : TMemoryStream;
begin
MapFileName := ExtractFilePath(Application.ExeName) + 'Map\' +
Cnt_testMapName;
fillChar(MapTile, SizeOf(MapTile), 0);
ms1 := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
try
try
ms1.LoadFromFile(MapFileName);
DecompressStream(ms1, ms2);
ms2.SaveToFile(MapFileName + '.tmp');
finally
ms1.Free;
end;
finally
ms2.Free;
end;
if FileExists(MapFileName + '.tmp') then
begin
FileHandle := FileOpen(MapFileName + '.tmp', fmOpenRead);
FileSeek(FileHandle, 0, 0);
FileRead(FileHandle, MapTile, SizeOf(MapTile));
FileRead(FileHandle, PlayerArray, SizeOf(PlayerArray));
FileClose(FileHandle);
DeleteFile(MapFileName + '.tmp');
end;
end;
procedure TFormMain.FormCreate(Sender: TObject);
begin
TileList := TStringList.Create;
PlayerList := TStringList.Create;
GameState := gsLogin;
Self.InitScreen;
Self.InitImageList;
Self.InitGameMapList;
Self.InitSysCursor;
end;
function TFormMain.GetPlayerPos(playerID: Integer): TPoint;
begin
Result.X := PlayerArray[playerID].X;
Result.Y := PlayerArray[playerID].Y;
end;
procedure TFormMain.InitImageList;
var
MapFileName : string;
FileHandle : Integer;
ms1, ms2 : TMemoryStream;
begin
MapFileName := ExtractFilePath(ParamStr(0)) + 'Data\gameRes.Dat';
ms1 := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
try
try
ms1.LoadFromFile(MapFileName);
DecompressStream(ms1, ms2);
ms2.SaveToFile(MapFileName + '.tmp');
finally
ms1.Free;
end;
finally
ms2.Free;
end;
if FileExists(MapFileName + '.tmp') then
begin
DXImageList.Items.LoadFromFile(MapfileName + '.tmp');
DeleteFile(MapFileName + '.tmp');
end;
// DXImageList.Items.LoadFromFile(ExtractFilePath(ParamStr(0)) +
// 'Data\gameRes.Dat');
DXImageList.Items.MakeColorTable;
DXDraw.ColorTable := DXImageList.Items.ColorTable;
DXDraw.DefColorTable := DXImageList.Items.ColorTable;
DXDraw.UpdatePalette;
end;
procedure TFormMain.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw.CanDraw then
Exit;
DXInput.Update;
DXDraw.Surface.Fill(0);
case GameState of
gsLogin:
begin
DXImageList.Items.Find('title').Draw(DxDraw.Surface, 0, 0, 0);
end;
gsMain: StartGame(lagcount);
gsGameOver:
begin
player1.gameOver := TRUE;
player2.gameOver := TRUE;
DXImageList.Items.FInd('dialog').Draw(DXDraw.Surface, 100, 100, 0);
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clRed;
Font.Size := 12;
if Player1.ShowDead then
begin
Textout(120, 130, Edit1.text + ' 失敗!');
DXImageList.Items.Find('flag').Draw(DXDraw.Surface, 120, 150, 1);
end
else
begin
Textout(120, 130, Edit1.text + ' 勝利!');
DXImageList.Items.Find('flag').Draw(DXDraw.Surface, 120, 150, 0);
end;
if Player2.ShowDead then
begin
Textout(120, 210, Edit2.text + ' 失敗!');
DXImageList.Items.Find('flag').Draw(DXDraw.Surface, 120, 230, 1);
end
else
begin
Textout(120, 210, Edit2.text + ' 勝利!');
DXImageList.Items.Find('flag').Draw(DXDraw.Surface, 120, 230, 0);
end;
Release;
end;
end;
end;
if gameState = gsMain then
if CursorSprite <> nil then
CursorSprite.DoDraw;
DXDraw.Flip;
end;
procedure TFormMain.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
bsR : TRect;
Pt : TPoint;
begin
if gameState = gsMain then
if CursorSprite <> nil then
begin
CursorSprite.X := X;
CursorSprite.Y := Y;
end;
if GameState = gsMain then
if FExitButton <> nil then
begin
BsR :=
Rect(
Trunc(FExitButton.X),
Trunc(FExitButton.Y),
Trunc(FExitButton.x) + FExitButton.Width,
Trunc(FExitButton.y) + FExitButton.Height
);
Pt.X := X;
Pt.Y := y;
if PtInRect(BsR, Pt) then
FExitButton.AnimStart := 3
else
FExitButton.AnimStart := 2;
end;
end;
procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i : integer;
begin
if (key = vk_return) and (gameState = gsGameOver) then
begin
gameState := gsLogin;
edit1.Visible := gamestate = gslogin;
edit2.Visible := gamestate = gslogin;
ComboBox1.visible := gamestate = gslogin;
for i := DXSpriteEngine.Engine.Count - 1 downto 0 do
if DXSPriteEngine.Engine.Items[i] is TSprite then
TSPrite(DXSpriteENgine.Engine.Items[i]).Free;
Self.TileList.Clear;
fillChar(Self.MapTile, SizeOf(MapTile), 0);
fillChar(Self.PlayerArray, sizeOf(PlayerArray), 0);
Self.InitSysCursor;
end;
{ Application end }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -