?? uformmain.pas
字號:
if RCount <= 16 then
Inc(RCount)
else
RCount := 0;
if (X) > (Cnt_OffsetX + Cnt_MapWidth) then
X := Cnt_OffsetX + Cnt_MapWidth;
FAnimRun := TRUE;
goto GotoRunBreak;
end;
end;
GotoRunBreak:
if isKeyChange and (TmpDir <> Dir) then
begin
OldDir := TmpDir;
end;
ModifyZIndex(x, y);
Collision;
if ID = 0 then
begin
if FormMain.DXInput.Keyboard.Keys[Ord('A')] then
begin
if CanDropBomb(x, y) and ((GetTickCount - FDropBombTimeOut) >
Cnt_DropBombTimeOut) and (BombCount < MaxBombCount) then
begin
FDropBombTimeOut := GetTickCount;
Bomb := TBombSprite.Create(FormMain.DXSpriteEngine.Engine,
FormMain.Player1);
//去掉其他的新炸彈
// for i := 0 to BombList.Count - 1 do
// TBombSprite(BombList.Items[i]).newBomb := FALSE;
BombList.Add(Bomb);
end;
end;
end
else //玩家二
begin
if FormMain.DXInput.Keyboard.Keys[Ord('/')] then
begin
if CanDropBomb(x, y) and ((GetTickCount - FDropBombTimeOut) >
Cnt_DropBombTimeOut) and (BombCount < MaxBombCount) then
begin
FDropBombTimeOut := GetTickCount;
Bomb := TBombSprite.Create(FormMain.DXSpriteEngine.Engine,
FormMain.Player2);
//去掉其他的新炸彈
// for i := 0 to BombList.Count - 1 do
// TBombSprite(BombList.Items[i]).newBomb := FALSE;
BombList.Add(Bomb);
end;
end;
end;
//formMain.Caption := inttostr(Integer(Dir)) + ':' + inttostr(Integer(OldDIr));
end;
procedure TFormMain.InitPlayer;
var
PerY : Integer;
begin
Player1 := TPlayerSprite.Create(DXSpriteEngine.Engine);
Player1.Face.Image := DXImageList.Items.Find('player2');
Player1.Face.Width := Player1.Face.Image.Width;
Player1.Face.Height := Player1.Face.Image.Height;
Player1.Face.AnimCount := Player1.Face.Image.PatternCount;
Player1.Power := 1;
Player1.Speed := 2000;
Player1.MaxBombCount := 1;
Player1.X := GetPlayerPos(0).X + Cnt_OffsetX;
if Player1.Image.PatternHeight > Cnt_TileHeight then
PerY := Player1.Image.PatternHeight - Cnt_TileHeight
else
PerY := 0;
Player1.Y := GetPlayerPos(0).Y + Cnt_OffsetY - PerY;
Player1.ID := 0;
Player1.gameOver := false;
PlayerList.AddObject('Player1', Player1);
Player2 := TPlayerSprite.Create(DXSpriteEngine.Engine);
Player2.Face.Image := DXImageList.Items.Find('player1');
Player2.Face.Width := Player2.Face.Image.Width;
Player2.Face.Height := Player2.Face.Image.Height;
Player2.Face.AnimCount := Player2.Face.Image.PatternCount;
Player2.Power := 2;
Player2.Speed := 1500;
Player2.MaxBombCount := 1;
Player2.gameOver := false;
Player2.X := GetPlayerPos(1).X + Cnt_OffsetX;
if Player2.Image.PatternHeight > Cnt_TileHeight then
PerY := Player2.Image.PatternHeight - Cnt_TileHeight
else
PerY := 0;
Player2.Y := GetPlayerPos(1).Y + Cnt_OffsetY - PerY;
Player2.ID := 1;
PlayerList.AddObject('Player2', Player2);
Player1.HP := 10;
Player2.HP := 10;
end;
procedure TFormMain.InitScreen;
begin
DXDraw.Finalize;
if not (doFullScreen in DXDraw.Options) then
begin
StoreWindow;
DXDraw.Cursor := crDefault;
BorderStyle := bsNone;
DXDraw.Options := DXDraw.Options + [doFullScreen];
end;
DXDraw.Initialize;
end;
function TPlayerSprite.GetLeft: double;
begin
result := x;
end;
function TPlayerSprite.GetTop: double;
begin
result := y;
end;
procedure TPlayerSprite.ModifyZIndex(x, y: Double);
var
L : integer;
begin
y := Y - cnt_PlayerTop + 1;
L := Trunc(Y / Cnt_TileHeight) + 1;
if L = 0 then
Inc(l, 1);
L := L * 2 + 1;
Z := 0;
Face.Z := L;
end;
procedure TPlayerSprite.SetLeft(value: double);
begin
x := value;
end;
procedure TPlayerSprite.SetTop(value: double);
begin
y := value;
end;
procedure TFormMain.InitMapTile;
var
ix, iy, PerY : Integer;
TileImg, ObjImage, ObjImg1, ObjImg2: TPictureCollectionItem;
ClientX, ClientY : Integer;
iZ : Integer;
ts : TTileSprite;
os : TObjectSprite;
label
setZIndex;
begin
// 600 X 520 的圖像大小,塊大小為40像素
TileImg := DXImageList.Items.Find('tile');
ObjImg1 := DXImageList.Items.Find('building');
ObjImg2 := DXImageList.Items.Find('box');
for ix := 0 to Cnt_TileWidthCount do
begin
iZ := 0;
for iy := 0 to Cnt_TileHeightCount do
begin
ClientX := iX * Cnt_TileWidth + Cnt_OffsetX;
ClientY := iY * Cnt_TileHeight + Cnt_OffsetY;
if mapTile[ix, iy].TileIndex > 0 then
begin
ts := TTileSprite.Create(DXSpriteEngine.Engine);
with ts do
begin
Image := TileImg;
Width := Image.Width;
Height := Image.Height;
X := ClientX;
Y := ClientY;
Z := -1;
Tile := TRUE;
isBackground := TRUE;
ShowZIndex := FALSE;
AnimStart := mapTile[ix, iy].TileIndex - 1;
BX := ix;
BY := iy;
end;
TileList.AddObject('ts', ts);
end;
Inc(Iz, 2);
if mapTile[ix, iy].ObjIndex < 1 then
goto SetZIndex;
if mapTile[iX, iy].CanDestroy and (mapTile[ix, iy].ObjIndex <> 5) then
//能摧毀的則是箱子之類的建筑
ObjImage := ObjImg2
else
ObjImage := objImg1;
//調整顯示的坐標位置
if ObjImage.PatternHeight > Cnt_TileHeight then
PerY := ObjImage.PatternHeight - Cnt_TileHeight
else
PerY := 0;
os := TObjectSprite.Create(DXSpriteEngine.Engine);
with os do
begin
Face := TImageSprite.Create(DXSpriteEngine.Engine);
Face.Image := ObjImage;
Face.Width := Face.Image.Width;
Face.Height := Face.Image.Height;
Face.X := ClientX;
Face.Y := ClientY - PerY;
if (mapTile[ix, iy].ObjIndex = 5) then
Face.Z := iZ + 1
else
Face.Z := iZ;
Face.AnimStart := mapTile[ix, iy].ObjIndex - 1;
Image := DXImageList.Items.Find('P');
Width := Image.Width - 4;
Height := Image.Height - 4;
X := ClientX;
Y := ClientY; // - PerY;
Z := 0;
Tile := TRUE;
BX := ix;
BY := iy;
end;
TileList.AddObject('os', os);
SetZIndex:
end;
end;
end;
{ TTileSprite }
procedure TTileSprite.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);
Image.Draw(Engine.Surface, r.Left, r.Top, ImageIndex);
if ShowZIndex then
with Engine.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clBlue;
Font.Size := 12;
TextOut(Trunc(X), Trunc(y), Inttostr(Z));
Release;
end;
end;
procedure TPlayerSprite.SetZIndex(Z: integer);
begin
Face.Z := Z;
end;
{ TObjectSprite }
procedure TObjectSprite.DoDraw;
begin
//屏蔽繪圖過程
if ShowZIndex then
FormMain.Caption := FloatToStr(X) + ',' + FloatToStr(Y);
end;
{ TBomb }
procedure TBombSprite.BuilderFire;
procedure SetObjectDead(ix, iy: Integer);
var
i : Integer;
// oi : Integer;
begin
with formMain do
for i := TileList.Count - 1 downto 0 do
if TileList.Objects[i] <> nil then
if TileList.Strings[i] = 'os' then
if TileList.Objects[i] is TObjectSprite then
if ((TileList.Objects[i] as TObjectSprite).BX = ix) and
((TileList.Objects[i] as TObjectSprite).BY = iy) then
begin
if MapTile[ix, iy].CanDestroy or (MapTile[ix, iy].ObjIndex = 5)
then
begin
//oi := MapTile[ix, iy].ObjIndex;
//建立寶物
if (TileList.Objects[i] as TObjectSprite).Face.Image.Name =
'box' then
begin
Randomize;
if (Max(Abs(Random(999)), 1) mod 2) = 0 then
begin
with TGoodsSprite.Create(Engine) do
begin
X := (TileList.Objects[i] as TObjectSprite).Face.X;
Y := (TileList.Objects[i] as TObjectSprite).Face.Y;
Z := (TileList.Objects[i] as TObjectSprite).Face.Z;
end;
end;
end;
MapTile[ix, iy].ObjIndex := 0;
MapTile[ix, iy].CanDestroy := TRUE;
(TileList.Objects[i] as TObjectSprite).Face.Dead;
(TileList.Objects[i] as TObjectSprite).Dead;
TileList.Objects[i] := nil;
//TileList.Delete(i);
{ if oi = 4 then
Continue; }
//break;
end;
end;
end;
var
I : integer;
FireSprite : TFireSprite;
MaxPower : integer;
aniIndex : integer;
Ix, iY : integer;
ZIndex : integer;
begin
for i := RefPlayer.BombList.Count - 1 downto 0 do
if RefPlayer.BombList.Items[i] <> nil then
if (TBombSprite(RefPlayer.BombList.Items[i]).BX = bx) and
(TBombSprite(RefPlayer.BombList.Items[i]).BY = by) then
begin
RefPlayer.BombList.Delete(i);
break;
end;
Face.Dead;
Dead;
RefPlayer.BombCount := refPlayer.BombCount - 1;
ZIndex := 999;
MaxPower := refPlayer.Power;
//炸彈中心
FireSprite := TFireSprite.Create(Parent);
FireSprite.X := X;
FireSprite.Y := Y;
FireSprite.AnimStart := 0;
FireSprite.Z := ZIndex;
//draw Up
Ix := bx;
iY := by;
for i := 1 to MaxPower do
begin
if iy - i >= 0 then
begin
if FormMain.MapTile[ix, (iy - i)].ObjIndex > 0 then
if not FormMain.MapTile[ix, (iy - i)].CanDestroy then //如果是墻
break
else //如果能銷毀則讓碰撞事件處理
begin
SetObjectDead(ix, (iy - i));
break;
end;
end
else
Break; //墻邊
FireSprite := TFireSprite.Create(Parent);
FireSprite.X := X;
FireSprite.Y := Y - (i * Cnt_TileHeight);
if i < MaxPower then
aniIndex := 1
else
aniIndex := 5;
FireSprite.AnimStart := aniIndex;
FireSprite.Z := ZIndex;
FireSprite.DoDraw;
end;
//draw Down
for i := 1 to MaxPower do
begin
if iy + i <= Cnt_TileHeightCount then
begin
if FormMain.MapTile[ix, (iy + i)].ObjIndex > 0 then
if not FormMain.MapTile[ix, (iy + i)].CanDestroy then //如果是墻
break
else //如果能銷毀則讓碰撞事件處理
begin
SetObjectDead(ix, (iy + i));
break;
end;
end
else
Break; //墻邊
FireSprite := TFireSprite.Create(Parent);
FireSprite.X := X;
FireSprite.Y := Y + (i * Cnt_TileHeight);
if i < MaxPower then
aniIndex := 1
else
aniIndex := 4;
FireSprite.AnimStart := aniIndex;
FireSprite.Z := ZIndex;
FireSprite.DoDraw;
end;
//draw Left
for i := 1 to MaxPower do
begin
if ix - i >= 0 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 := 7;
FireSprite.AnimStart := aniIndex;
FireSprite.Z := ZIndex;
FireSprite.DoDraw;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -