?? uformmain.pas
字號:
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;
if gameState = gsLogin then
DXDraw.Cursor := crDefault
else
DXDraw.Cursor := crNone;
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;
{ TPlayerSprite }
//檢查該坐標是否可以放炸彈
function TPlayerSprite.CanDropBomb(x, y: Double): boolean;
var
i, j, clientx, clienty: Integer;
ix : Integer;
begin
i := Trunc(X - cnt_OffsetX) div Cnt_TileWidth;
j := Trunc(Y - cnt_OffsetY) div Cnt_TileHeight;
clientX := i * Cnt_TileWidth + cnt_OffsetX;
clientY := j * Cnt_TileHeight + cnt_OffsetY;
if (X - clientX) > (cnt_TileWidth div 2) then
inc(i, 1);
if (Y - clientY) > (cnt_TileHeight div 2) then
inc(j, 1);
result := TRUE;
for ix := 0 to BombList.Count - 1 do
if BombList.Items[ix] <> nil then
begin
if (TBombSprite(BombList.Items[ix]).bx = i) and
(TBombSprite(BombList.Items[ix]).by = j) then
begin
Result := FALSE;
break;
end;
end;
end;
constructor TPlayerSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
BombList := TList.Create;
Face := TImageSprite.Create(AParent);
Face.Image := FormMain.DXImageList.Items.Find('player2');
Face.Width := Face.Image.Width;
Face.Height := Face.Image.Height;
Face.AnimCount := Face.Image.PatternCount;
Face.Z := 3;
Face.X := 0;
Face.Y := 0;
ShowDead := FALSE;
ShadowImg := FormMain.DXImageList.Items.Find('shadow');
FormMain.DXImageList.Items.Find('P').Transparent := FALSE;
Power := 1;
Image := FormMain.DXImageList.Items.Find('P');
Width := Image.Width - 4;
Height := Image.Height - 4;
ID := 0;
X := 0;
Y := 0;
Z := 1;
HP := 10;
EXP := 0;
PixelCheck := FALSE;
FAnimTimeOut := GetTickCount;
FDropBombTimeOut := GetTickCount;
FAnimTimeIndex := 0;
MaxBombCount := 1;
BombCount := 0;
OffsetX := Cnt_PlayerLeft div 2;
OffsetY := Cnt_PlayerTop div 2;
OldDir := mdNone;
Dir := mdNone;
end;
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
procedure ModifyPlayerPosition;
const
ChangePosWidth = Cnt_ModifyPlayerPosWidth;
begin
if not (Sprite is TObjectSprite) then
Exit;
case Dir of
mdUp, mdDown:
begin
if (Sprite as TObjectSprite) = nil then
Exit;
if ((X + Cnt_TileWidth - (Sprite as TObjectSprite).X) <=
ChangePosWidth) and ((X + Cnt_TileWidth - (Sprite as
TObjectSprite).X) >= 0) then
X := X - 3; //MoveTo(Left, 1);
if (((Sprite as TObjectSprite).X + (Sprite as TObjectSprite).Width -
X) <= ChangePosWidth) and (((Sprite as TObjectSprite).X + (Sprite
as
TObjectSprite).Width - X) >= 0) then
X := X + 3; //MoveTo(Right, 1);
end;
mdLeft, mdRight:
begin
if (Sprite as TObjectSprite) = nil then
Exit;
if (((Sprite as TObjectSprite).Y - (Face.Y + Cnt_TileHeight)) <=
ChangePosWidth + Cnt_PlayerTop + 10) and (((Sprite as
TObjectSprite).Y - (face.Y +
Cnt_TileHeight)) >= 0) then
Y := Y - 3; //MoveTo(UP, 1);
if ((((Sprite as TObjectSprite).Y + (Sprite as TObjectSprite).Height)
- Y) <= (ChangePosWidth + 10)) and ((((Sprite as
TObjectSprite).Y + (Sprite as TObjectSprite).Height)
- Y) >= 0) then
Y := Y + 3; //MoveTo(Down, 1);
end;
end;
end;
function CheckPlayerCollision(ix, iy: Integer): boolean;
var
i : Integer;
begin
result := FALSE;
for i := 0 to FormMain.PlayerList.Count - 1 do
if FormMain.PlayerList.Objects[i] <> nil then
if (TPlayerSprite(FormMain.PlayerList.Objects[i]).BX = ix) and
(TPlayerSprite(FormMain.PlayerList.Objects[i]).BY = iy) then
begin
result := TRUE;
break;
end;
end;
var
LocalTileIndex, LocalObjIndex: Integer;
LocalX, LocalY : Integer;
Os : TObjectSprite;
// I : Integer;
label
ModifyPos;
begin
inherited;
if (Sprite is TBombSprite) then
begin
if not (Sprite as TBombSprite).newBomb then
begin
X := OldX;
Y := OldY;
end;
goto ModifyPos;
end;
if not (Sprite is TObjectSprite) then
goto ModifyPos;
//可以移動
OS := Sprite as TObjectSprite;
if OS.FACE.Image.Name <> 'box' then
begin
if Os.Face.AnimStart <> 4 then
begin
X := OldX;
Y := OldY;
end;
goto ModifyPos;
end;
if not FormMain.MapTile[os.BX, os.BY].CanMove then
begin
if Os.Face.AnimStart <> 4 then
begin
X := OldX;
Y := OldY;
end;
goto ModifyPos;
end;
LocalTileIndex := FormMain.MapTile[os.BX, os.BY].TileIndex;
LocalObjIndex := FormMain.MapTile[os.BX, os.BY].ObjIndex;
LocalX := os.BX;
LocalY := os.BY;
case Dir of
mdUp:
if LocalY > 0 then
if FormMain.MapTile[localX, LocalY - 1].ObjIndex in [0, 5] then
Dec(Localy, 1); //如果為null或者是樹
mdDown:
if LocalY + 1 <= Cnt_TileHeightCount then
if FormMain.MapTile[localX, localY + 1].ObjIndex in [0, 5] then
Inc(LocalY, 1);
mdLeft:
if LocalX > 0 then
if FormMain.MapTile[localX - 1, Localy].ObjIndex in [0, 5] then
Dec(LocalX, 1);
mdRight:
if LocalX + 1 <= cnt_TileWidthCount then
if FormMain.MapTile[localX + 1, Localy].ObjIndex in [0, 5] then
Inc(LocalX, 1);
end;
if (localX <> Os.BX) or (localY <> os.BY) then
begin
FormMain.MapTile[os.BX, os.BY].ObjIndex := 0;
FormMain.MapTile[os.BX, os.BY].CanMove := false;
FormMain.MapTile[os.BX, os.BY].CanDestroy := false;
os.Face.Z := Face.Z - 4;
os.BX := localx;
os.by := localy;
Os.X := LocalX * Cnt_TileWidth + Cnt_OffsetX;
Os.Y := LocalY * Cnt_TileHeight + Cnt_OffsetY;
Os.Face.X := LocalX * Cnt_TileWidth + Cnt_OffsetX;
Os.Face.Y := LocalY * Cnt_TileHeight + Cnt_OffsetY -
(Os.Face.Image.Height - Cnt_TileHeight);
FormMain.MapTile[LocalX, LocalY].ObjIndex := LocalObjIndex;
FormMain.MapTile[LocalX, LocalY].TileIndex := LocalTileIndex;
FormMain.MapTile[LocalX, LocalY].CanMove := TRUE;
FormMain.MapTile[LocalX, LocalY].CanDestroy := TRUE;
end
else
begin
X := OldX;
Y := OldY;
end;
ModifyPos:
ModifyPlayerPosition;
Face.X := X - OffsetX;
Face.Y := y - cnt_PlayerTop;
bx := Trunc(x - cnt_Offsetx) div cnt_TileWidthCount;
by := Trunc(y - cnt_offsetY) div Cnt_TileHeightCount;
end;
procedure TPlayerSprite.DoDraw;
var
AniIndex : Integer;
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 not ShowDead then
begin
case Dir of
mdUp: AniIndex := 12;
mdDown: AniIndex := 0;
mdLeft: AniIndex := 8;
else
AniIndex := 4
end;
Face.AnimPos := AniIndex;
if Abs(FAnimTimeIndex - AniIndex) >= 4 then
FAnimTimeIndex := AniIndex;
if FAnimRun then
begin
Face.AnimPos := FAnimTimeIndex;
if (GetTickCount - FAnimTimeOut) > Cnt_AnimTimeOut then
if abs(FAnimTimeIndex - AniIndex) >= 4 then
begin
FAnimTimeIndex := AniIndex;
end
else
begin
Inc(FAnimTimeIndex, 1);
FAnimTimeOut := GetTickCount;
end;
end;
end
else
begin //死亡
if face.Image.Name <> 'dead' then
begin
Face.Image := FormMain.DXImageList.Items.Find('dead');
Face.AnimCount := 2;
Face.Width := Face.Image.Width;
Face.Height := Face.Image.Height;
Face.AnimLooped := TRUE;
Face.AnimStart := 0;
Face.AnimSpeed := 30 / 1000;
FShowDeadTiemOut := GetTickCount;
end;
end;
//繪制陰影
ShadowImg.DrawAlpha(engine.surface, r, imageIndex, 127);
// ShadowImg.Draw(Engine.Surface, Trunc(Face.X), Trunc(Face.y + 4), 0);
end;
procedure TPlayerSprite.DoMove(MoveCount: Integer);
var
TmpDir : TMoveDir;
isKeyChange : boolean;
Bomb : TBombSprite;
label
GotoRunBreak;
begin
if gameOver then
Exit;
if ShowDead then
begin
if ((GetTickCount - FShowDeadTiemOut) > Cnt_ShowDeadTimeOut) then
begin
Face.Dead;
Dead;
FormMain.GameState := gsGameOver;
end;
Exit;
end;
FSpeed := (Speed / 1000) * MoveCount;
OldX := X;
OldY := Y;
FAnimRun := FALSE;
TmpDir := Dir;
isKeyChange := FALSE;
if ID = 0 then //玩家一
begin
if FormMain.DXInput.Keyboard.Keys[Ord('R')] then
begin
Dir := mdUp;
isKeyChange := TRUE;
Y := Y - FSpeed;
if UCount <= 16 then
Inc(UCount)
else
UCount := 0;
if (Y) < Cnt_OffsetY then
Y := Cnt_OffsetY;
FAnimRun := TRUE;
goto GotoRunBreak;
end;
if FormMain.DXInput.Keyboard.Keys[Ord('F')] then
begin
Dir := mdDown;
isKeyChange := TRUE;
Y := Y + FSpeed;
if DCount <= 16 then
Inc(DCount)
else
DCount := 0;
if (Y) > (Cnt_MapHeight + Cnt_OffsetY) then
Y := Cnt_MapHeight + Cnt_OffsetY;
FAnimRun := TRUE;
goto GotoRunBreak;
end;
if FormMain.DXInput.Keyboard.Keys[Ord('D')] then
begin
Dir := mdLeft;
isKeyChange := TRUE;
X := X - FSpeed;
if LCount <= 16 then
Inc(LCount)
else
LCount := 0;
if X < Cnt_OffsetX then
X := Cnt_OffsetX;
FAnimRun := TRUE;
goto GotoRunBreak;
end;
if FormMain.DXInput.Keyboard.Keys[Ord('G')] then
begin
Dir := mdRight;
isKeyChange := TRUE;
X := X + FSpeed;
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
else //玩家二
begin
if isUp in FormMain.DxInput.States then
begin
Dir := mdUp;
isKeyChange := TRUE;
Y := Y - FSpeed;
if UCount <= 16 then
Inc(UCount)
else
UCount := 0;
if (Y) < Cnt_OffsetY then
Y := Cnt_OffsetY;
FAnimRun := TRUE;
goto GotoRunBreak;
end;
if isDown in FormMain.DxInput.States then
begin
Dir := mdDown;
isKeyChange := TRUE;
Y := Y + FSpeed;
if DCount <= 16 then
Inc(DCount)
else
DCount := 0;
if (Y) > (Cnt_MapHeight + Cnt_OffsetY) then
Y := Cnt_MapHeight + Cnt_OffsetY;
FAnimRun := TRUE;
goto GotoRunBreak;
end;
if isLeft in FormMain.DxInput.States then
begin
Dir := mdLeft;
isKeyChange := TRUE;
X := X - FSpeed;
if LCount <= 16 then
Inc(LCount)
else
LCount := 0;
if X < Cnt_OffsetX then
X := Cnt_OffsetX;
FAnimRun := TRUE;
goto GotoRunBreak;
end;
if isRight in FormMain.DxInput.States then
begin
Dir := mdRight;
isKeyChange := TRUE;
X := X + FSpeed;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -