?? uformmain.pas
字號:
end;
//draw Right
for i := 1 to MaxPower do
begin
if ix + i <= Cnt_TileWidthCount then
begin
if FormMain.MapTile[(ix + i), iy].ObjIndex > 0 then
if not FormMain.MapTile[(ix + i), iy].CanDestroy then //如果是墻
break
else //如果能銷毀則讓碰撞事件處理
begin
SetObjectDead((ix + i), iy);
break;
end;
end
else
Break; //墻邊
FireSprite := TFireSprite.Create(Parent);
FireSprite.X := X + (i * Cnt_TileWidth);
FireSprite.Y := Y;
if i < MaxPower then
aniIndex := 2
else
aniIndex := 6;
FireSprite.AnimStart := aniIndex;
FireSprite.Z := Zindex;
FireSprite.DoDraw;
end;
end;
constructor TBombSprite.Create(AParent: TSprite; Player: TPlayerSprite);
var
i, j, clientx, clienty: integer;
begin
inherited Create(AParent);
// RefPlayer := FormMain.Player;
Image := FormMain.DXImageList.Items.Find('p');
Width := Cnt_TileWidth - 4;
Height := Cnt_TileHeight - 4;
refPlayer := Player;
i := Trunc(refPlayer.X - cnt_OffsetX) div Cnt_TileWidth;
j := Trunc(refPlayer.Y - cnt_OffsetY) div Cnt_TileHeight;
clientX := i * Cnt_TileWidth + cnt_OffsetX;
clientY := j * Cnt_TileHeight + cnt_OffsetY;
refPlayer.BombCount := refPlayer.BombCount + 1;
if (refPlayer.X - clientX) > (cnt_TileWidth div 2) then
begin
inc(i, 1);
clientX := clientX + cnt_TileWidth;
end;
if (refPlayer.Y - clientY) > (cnt_TileHeight div 2) then
begin
inc(j, 1);
clientY := clientY + cnt_TileHeight;
end;
BX := i;
BY := j;
X := clientX;
Y := clientY;
Z := 0;
PixelCheck := FALSE;
Tile := TRUE;
newBomb := True;
Face := TBombTileSprite.Create(AParent);
Face.Image := formMain.DXImageList.Items.Find('boom');
Face.Width := Face.Image.Width;
Face.Height := Face.Image.Height;
Face.X := clientX - 2;
Face.Y := clientY - 2;
Face.Z := refPlayer.Z + 1;
Face.AnimCount := Face.Image.PatternCount - 1;
Face.AnimLooped := True;
Face.AnimSpeed := 35 / 1000;
Face.PixelCheck := FALSE;
FBombTimeOut := GetTickCount;
end;
procedure TBombSprite.DoDraw;
begin
if (GetTickCount - FBombTimeOut) > Cnt_BombTimeOut then
begin
BuilderFire;
end;
end;
procedure TBombSprite.DoMove(MoveCount: Integer);
begin
inherited;
// Exit;
//如果炸彈不和玩家在同一位置,則newBomb 屬性為 FALSE,(永遠為false)
if NewBomb then //如果newBomb =true
begin
//玩家所在位置
if (Abs(refPlayer.X - X) > (cnt_TileWidth + 2)) or
(Abs(refPlayer.Y - y) > (cnt_TileHeight + 2)) then
NewBomb := FALSE;
exit;
end;
end;
{ TFireSprite }
constructor TFireSprite.Create(AParent: TSprite);
begin
inherited;
Image := FormMain.DXImageList.Items.Find('boob');
Width := Cnt_TileWidth;
Height := Cnt_TileHeight;
FFireTimeOut := GetTickCount;
end;
procedure TFireSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
//var
// ix, iy : integer;
begin
inherited;
if Sprite is TBombSprite then
begin
(Sprite as TBombSprite).BuilderFire;
(Sprite as TBombSprite).dead;
end;
if Sprite is TPlayerSprite then
begin
Self.Z := (Sprite as TPlayerSprite).Z - 1;
(Sprite as TPlayerSprite).HP := (Sprite as TPlayerSprite).HP - 1;
if (Sprite as TPlayerSprite).hp <= 0 then
(Sprite as TPlayerSprite).ShowDead := TRUE;
Dead;
end;
end;
procedure TFireSprite.DoDraw;
begin
inherited;
if (GetTickCount - FFireTimeOut) > Cnt_FireTimeOut then
Dead;
end;
procedure TFireSprite.DoMove(MoveCount: Integer);
begin
inherited;
Collision;
end;
procedure TFormMain.FormDestroy(Sender: TObject);
begin
TileList.free;
PlayerList.Free;
end;
procedure TFormMain.InitSysCursor;
begin
if gameState = gsMain then
DXDraw.Cursor := crNone
else
DXDraw.Cursor := crDefault;
CursorSprite := TCursorSprite.Create(DXSpriteEngine.Engine);
CursorSprite.Image := DXImageList.Items.Find('cursor');
CursorSprite.Z := 9999;
end;
{ TGoodsSprite }
constructor TGoodsSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := FormMain.DXImageList.Items.Find('goods');
Width := Image.Width;
Height := Image.Height;
Randomize;
AddWhat := Max(Abs(Random(4)), 1);
Self.AnimCount := 2;
moveTimeOut := getTickCount;
case AddWhat of
1: Self.AnimStart := 0;
2: Self.AnimStart := 6;
3: Self.AnimStart := 8;
end;
Self.AnimSpeed := 40 / 1000;
Self.AnimLooped := TRUE;
end;
procedure TGoodsSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
inherited;
if (Sprite is TPlayerSprite) then
begin
case AddWhat of
1:
begin
(Sprite as TPlayerSprite).MaxBombCount := (Sprite as
TPlayerSprite).MaxBombCount + 1;
end;
2:
begin
(Sprite as TPlayerSprite).Power := (Sprite as TPlayerSprite).Power +
1;
end;
3:
begin
(Sprite as TPlayerSprite).Speed := (Sprite as TPlayerSprite).Speed +
500;
end;
end;
if AddWhat in [1, 2, 3] then
begin
(Sprite as TPlayerSprite).Exp := (Sprite as TPlayerSprite).Exp + 1;
(Sprite as TPlayerSprite).HP := (Sprite as TPlayerSprite).HP + AddWhat;
end;
Dead;
end;
end;
procedure TGoodsSprite.DoDraw;
var
ImageIndex : Integer;
r : TRect;
begin
ImageIndex := SELF.AnimStart + Trunc(SELF.AnimPos);
r := Rect(Trunc(Self.WorldX), Trunc(Self.WorldY), Trunc(Self.WorldX) +
Image.Width, Trunc(Self.WorldY) + Image.Height);
if ((GetTickCount - moveTimeOut) > 800) then
begin
if MoveTo then
begin
Image.Draw(Engine.Surface, r.Left, r.Top - 3, ImageIndex);
MoveTo := not MoveTo;
end
else
begin
Image.Draw(Engine.Surface, r.Left, r.Top + 3, ImageIndex);
MoveTo := not MoveTo;
end;
moveTimeOut := GetTickCount;
end
else
Image.Draw(Engine.Surface, r.Left, r.Top, ImageIndex);
end;
procedure TGoodsSprite.DoMove(MoveCount: Integer);
begin
inherited;
Collision;
end;
procedure TFormMain.InitUI;
begin
edit1.Visible := gamestate = gslogin;
edit2.Visible := gamestate = gslogin;
ComboBox1.visible := gamestate = gslogin;
if GameState = gsMain then
begin
FExitButton := TButtonSprite.Create(DXSpriteEngine.Engine);
with FExitButton do
begin
ObjName := 'exit';
Image := DxImageList.Items.Find('button');
Width := Image.Width;
Height := Image.Height;
AnimCount := 4;
AnimLooped := false;
AnimSpeed := 0;
AnimStart := 2;
X := 660;
Y := 555;
z := 999;
end;
end;
if GameState = gsLogin then
begin
end;
end;
procedure TFormMain.DXDrawMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
bsR : TRect;
Pt : TPoint;
begin
if GameState = gsMain 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
Self.Close;
end;
if GameState = gsLogin then
begin
BsR :=
Rect(
Trunc(580),
Trunc(440),
Trunc(580) + 80,
Trunc(440) + 80
);
Pt.X := X;
Pt.Y := y;
if PtInRect(BsR, Pt) then
begin
if edit1.Text = '' then
begin
Application.MessageBox('請輸入《玩家一》的姓名', '提示', mb_ok or
mb_IconInformation);
if edit1.CanFocus then
Edit1.SetFocus;
Edit1.SelectAll;
exit;
end;
if edit2.Text = '' then
begin
Application.MessageBox('請輸入《玩家二》的姓名', '提示', mb_ok or
mb_IconInformation);
if edit2.CanFocus then
Edit2.SetFocus;
Edit2.SelectAll;
exit;
end;
gameState := gsMain;
Self.InitSysCursor;
Self.InitMap(ComBoBox1.Items.Strings[ComboBox1.ItemIndex] + '.map');
Self.InitMapTile;
Self.InitPlayer;
Self.InitUI;
end;
end;
end;
procedure TFormMain.StartGame(lagcount: Integer);
begin
if GameState <> gsMain then
begin
GameState := gsMain;
Exit;
end;
if GameState = gsMain then
begin
DXImageList.Items.Find('Frame').Draw(DXDraw.Surface, 0, 0, 0);
// UpdateMapView(LagCount);
DXSpriteEngine.Move(lagcount);
DxSpriteEngine.Draw;
DxSpriteEngine.Dead;
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font := FormMain.Font;
Font.Color := clWhite;
Textout(150, 2, 'FPS: ' + inttostr(DXTimer.FrameRate) +
' ESC 退出 ALT+ENTER 全屏幕/窗口切換');
Textout(150, 15, 'P1按鍵: 上(R) 下(F) 左(D) 右(G) 放雷(A)' +
' P2按鍵: 上(↑) 下(↓) 左(←) 右(→) 放雷(/)');
Textout(50, 577, 'chinasf@hotmail.com');
textOut(300, 577, 'By Delphi 7 and DelphiX');
Release;
end;
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font := FormMain.Font;
Font.Color := clBlue;
Pen.Width := 1;
Pen.Color := clBlack;
Rectangle(Trunc(Player1.Face.X - 1), Trunc(Player1.Face.Y - 11),
Trunc(Player1.Face.X + Player1.HP * 2 + 1), Trunc(Player1.Face.Y - 11 +
4));
Pen.Color := clRed;
Rectangle(Trunc(Player1.Face.X), Trunc(Player1.Face.Y - 10),
Trunc(Player1.Face.X + Player1.HP * 2), Trunc(Player1.Face.Y - 10 + 2));
Textout(Trunc(Player1.Face.X), Trunc(Player1.Face.Y - 9 - 13),
'HP:' + Inttostr(Player1.HP));
Release;
end;
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font := FormMain.Font;
Font.Color := clBlue;
Pen.Width := 1;
Pen.Color := clBlack;
Rectangle(Trunc(Player2.Face.X - 1), Trunc(Player2.Face.Y - 11),
Trunc(Player2.Face.X + Player2.HP * 2 + 1), Trunc(Player2.Face.Y - 11 +
4));
Pen.Color := clRed;
Rectangle(Trunc(Player2.Face.X), Trunc(Player2.Face.Y - 10),
Trunc(Player2.Face.X + Player2.HP * 2), Trunc(Player2.Face.Y - 10 + 2));
Textout(Trunc(Player2.Face.X), Trunc(Player2.Face.Y - 9 - 13),
'HP:' + Inttostr(Player2.HP));
Release;
end;
end;
end;
procedure TFormMain.InitGameMapList;
var
fpath : string;
fs : TsearchRec;
begin
ComboBox1.items.Clear;
fpath := ExtractFilePath(ParamStr(0)) + 'Map\*.map';
if findfirst(fpath, faAnyFile, fs) = 0 then
begin
if (fs.Name <> '.') and (fs.Name <> '..') then
if (fs.Attr and faDirectory) = faDirectory then
else
comboBox1.Items.Add(ChangeFileExt(ExtractFileName(fs.Name), ''));
while findnext(fs) = 0 do
begin
if (fs.Name <> '.') and (fs.Name <> '..') then
if (fs.Attr and faDirectory) = faDirectory then
else
comboBox1.Items.Add(ChangeFileExt(ExtractFileName(fs.Name), ''));
end;
end;
findclose(fs);
if ComboBox1.Items.Count > 0 then
ComboBox1.itemINdex := 0;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -