📄 mir2.~dpr
字号:
program Mir2;
{$R *.res}
uses
SysUtils,
Windows,
DirectDraw,
ClassCallback,
GameClass,
MirMap,
MirWil,
Globals,
Actor,
Assist,
DebugUnit,
DXFastBlt,
ObjFastBlt;
type
TGameEx = class(TGame)
private
FGraphicSurface: IDirectDrawSurface7;
FDefaultFont: HFont;
FStartTick: Cardinal; // 开始计数时间(用于 FPS)
FFrameCount: Cardinal; // 已画表面次数(用于 FPS)
FIsShowFPS: Boolean;
protected
function WMLButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
function WMLButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
function WMRButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
function WMRButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
function WMMouseMove(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
function ProcessNextFrame: Boolean; override;
function ReloadAllSurfaceImages: Boolean; override;
procedure CreateFonts;
public
IsLButtonDown: Boolean;
IsRButtonDown: Boolean;
IsShiftKeyDown: Boolean;
Map: TMirMap;
NewActor: THumanActor;
MySelf: THumanActor;
WalkLength: Integer;
MapX, MapY: Word;
constructor Create(ACaption: string; AFullScreen: Boolean;
AWidth, AHeight: Integer; ABackgroundColor: TColorRef); override;
destructor Destroy; override;
end;
var
Game: TGameEx;
{ TGameEx }
constructor TGameEx.Create(ACaption: string; AFullScreen: Boolean;
AWidth, AHeight: Integer; ABackgroundColor: TColorRef);
var
I: Integer;
DC: HDC;
begin
inherited Create(ACaption, AFullScreen, AWidth, AHeight, ABackgroundColor);
CreateFonts;
FIsShowFPS := True;
Map := TMirMap.Create(MAPSURFACE_WIDTH, MAPSURFACE_HEIGHT);
Map.FileName := G_MirMapPath + '地图.map';
NewActor := THumanActor.Create(Map);
NewActor.Appearance := 0;
NewActor.Weapon := 1;
NewActor.Sex := 1;
NewActor.Hair := 0;
NewActor.Job := 1;
NewActor.Direction := Random(100) mod 8;
NewActor.CurrentAction := HUMANACTION_WALK;
NewActor.ReCalcFrames;
MySelf := THumanActor.Create(Map);
MySelf.Job := 0;
MySelf.ReCalcFrames;
// 背景图片
// G_WilTile := TWilFile.Create(G_MirWilPath + 'Tiles', MainDirectDraw);
// G_WilTileSm := TWilFile.Create(G_MirWilPath + 'SmTiles', MainDirectDraw);
// 前景图片
// G_WilObjects[0] := TWilFile.Create(G_MirWilPath + 'Objects', MainDirectDraw);
ShuJi := TWilFile.Create(G_MirWilPath + '数据');
// G_WilObjects[2] := TWilFile.Create(G_MirWilPath + 'Objects3', MainDirectDraw);
// G_WilObjects[3] := TWilFile.Create(G_MirWilPath + 'Objects4', MainDirectDraw);
// G_WilObjects[4] := TWilFile.Create(G_MirWilPath + 'Objects5', MainDirectDraw);
// G_WilObjects[5] := TWilFile.Create(G_MirWilPath + 'Objects6', MainDirectDraw);
// G_WilObjects[6] := TWilFile.Create(G_MirWilPath + 'Objects7', MainDirectDraw);
// 人类角色图片
//G_WilHuman := TWilFile.Create(G_MirWilPath + '身体', MainDirectDraw);
//G_WilHair := TWilFile.Create(G_MirWilPath + '头发', MainDirectDraw);
//G_WilWeapon := TWilFile.Create(G_MirWilPath + '武器', MainDirectDraw);
//G_WilMagic := TWilFile.Create(G_MirWilPath + '刺杀', MainDirectDraw);
// 游戏界面图片
//G_WilPrgUse := TWilFile.Create(G_MirWilPath + '界面', MainDirectDraw);
// TODO:
{
// 生成调色板数据
DC := GetDC(0);
GetSystemPaletteEntries(DC, 0, 256, PaletteEntries);
ReleaseDC(0, DC);
for I := 10 to 245 do
RGBQuadToPaletteEntry(ShuJi.MainColorTable^[I], PaletteEntries[I]);
for I := 0 to 255 do
PaletteEntries[I].peFlags := $40;
// 设置调色板
if MainDirectDraw.CreatePalette(DDPCAPS_8BIT, @PaletteEntries, Palette, nil) <> DD_OK then
raise exception.Create('CreatePalette error!');
PrimarySurface.SetPalette(Palette);
//
if not LoadNearestIndex(NEARESTPALETTEINDEX_FILE) then
begin
BuildNearestIndex(ShuJi.MainColorTable^);
SaveNearestIndex(NEARESTPALETTEINDEX_FILE);
end;
}
ReloadAllSurfaceImages;
// MapX := 20; MapY := 16;
end;
destructor TGameEx.Destroy;
begin
// 清除地图
FreeAndNil(Map);
// 清除玩家角色
FreeAndNil(MySelf);
// 背景图片
// FreeAndNil(G_WilTile);
// FreeAndNil(G_WilTileSm);
// 前景图片
// FreeAndNil(G_WilObjects[0]);
FreeAndNil(ShuJi);
// FreeAndNil(G_WilObjects[2]);
// FreeAndNil(G_WilObjects[3]);
// FreeAndNil(G_WilObjects[4]);
// FreeAndNil(G_WilObjects[5]);
// FreeAndNil(G_WilObjects[6]);
// 人类角色图片
//FreeAndNil(G_WilHuman);
// FreeAndNil(G_WilHair);
//FreeAndNil(G_WilWeapon);
//FreeAndNil(G_WilMagic);
// 游戏界面图片
//FreeAndNil(G_WilPrgUse);
inherited Destroy;
end;
procedure TGameEx.CreateFonts;
var
lf: TLogFont;
DC: HDC;
begin
DC := GetDC(0);
FillChar(lf, SizeOf(lf), #0);
// TODO: MulDiv
lf.lfHeight := -MulDiv(9, GetDeviceCaps(DC, LOGPIXELSY), 72);
lf.lfWidth := 0;
lf.lfCharSet := DEFAULT_CHARSET;
lf.lfFaceName := '宋体';
FDefaultFont := CreateFontIndirect(lf);
end;
function TGameEx.ReloadAllSurfaceImages: Boolean;
begin
// FGraphicSurface := nil;
// FGraphicSurface := ShuJi.Surfaces[5680];
Result := True;
end;
function TGameEx.ProcessNextFrame: Boolean;
var
S: string;
Pt: TPoint;
I: Integer;
TickCount: Cardinal;
FPS: Integer;
DXFastBlt: TDxFastBlt;
begin
Result := True;
// 场景动画
if GetTickCount - Map.AniTick > 50 then
begin
Map.AniTick := GetTickCount;
Inc(Map.AniCount);
if Map.AniCount > 100000 then
Map.AniCount := 0;
end;
if not ClearBufferSurface then Exit;
if IsLButtonDown or IsRButtonDown or IsShiftKeyDown then
begin
GetCursorPos(Pt);
ScreenToClient(Self.MainWindow, Pt);
if Pt.X > MAPSURFACE_WIDTH div 2 then
Pt.X := Pt.X + MAPUNIT_WIDTH div 2 else
Pt.X := Pt.X - MAPUNIT_WIDTH div 2;
if Pt.Y > MAPSURFACE_HEIGHT div 2 then
Pt.Y := Pt.Y + MAPUNIT_HEIGHT div 2 else
Pt.Y := Pt.Y - MAPUNIT_HEIGHT div 2;
Pt.X := MySelf.MapX + (Pt.X - MAPSURFACE_WIDTH div 2) div MAPUNIT_WIDTH;
Pt.Y := MySelf.MapY + (Pt.Y - MAPSURFACE_HEIGHT div 2) div MAPUNIT_HEIGHT;
if IsShiftKeyDown then MySelf.Hit(Pt.X, Pt.Y) else
if IsLButtonDown then MySelf.Walk(Pt.X, Pt.Y) else
if IsRButtonDown then MySelf.Run(Pt.X, Pt.Y);
end;
NewActor.Run(MySelf.MapX - 2, MySelf.MapY);
NewActor.Hit(MySelf.MapX, MySelf.MapY);
NewActor.ProcessFrame;
MySelf.ProcessFrame;
//Map.DrawBackground(BufferSurface, MySelf.MapX, MySelf.MapY, MySelf.ShiftX, MySelf.ShiftY);
// BrightEffect(BufferSurface, 100, 100);
Map.DrawForeground(BackDxFastBlt, MySelf.MapX, MySelf.MapY, MySelf.ShiftX, MySelf.ShiftY, True);
Map.DrawForeground(BackDxFastBlt, MySelf.MapX, MySelf.MapY, MySelf.ShiftX, MySelf.ShiftY, False);
MySelf.Draw(BackDxFastBlt, MAPCENTER_X, MAPCENTER_Y, MAPSURFACE_WIDTH, MAPSURFACE_HEIGHT);
NewActor.Draw(BackDxFastBlt,
MAPCENTER_X + (NewActor.MapX - MySelf.MapX) * MAPUNIT_WIDTH + NewActor.ShiftX - MySelf.ShiftX,
MAPCENTER_Y + (NewActor.MapY - MySelf.MapY) * MAPUNIT_HEIGHT + NewActor.ShiftY - MySelf.ShiftY,
MAPSURFACE_WIDTH, MAPSURFACE_HEIGHT);
DXFastBlt := ShuJi.Surfaces[5680];
if DXFastBlt <> nil then
BackDxFastBlt.DrawC(DXFastBlt, 0, 349, 1.0);
// 显示 FPS
{if FIsShowFPS then
begin
TickCount := GetTickCount - FStartTick;
if TickCount < 1000 then
begin
Inc(FFrameCount);
if TickCount > 0 then
begin
FPS := FFrameCount * 1000 div TickCount;
S := Format('FPS: %d', [FPS]);
DrawSurfaceText(BufferSurface, S, 10, 10, FDefaultFont, RGB(255, 0, 0));
// if FPS > 100 then Sleep(1);
end;
end
else begin
FFrameCount := 0;
FStartTick := GetTickCount;
end;
end;
// 画地图大小
S := Format('对手位置 : (%d,%d)', [NewActor.MapX, NewActor.MapY]);
DrawSurfaceText(BufferSurface, S, 10, 420, FDefaultFont, RGB(255, 255, 255)); }
end;
function TGameEx.WMMouseMove(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
Result := 0;
end;
function TGameEx.WMLButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
IsLButtonDown := True;
if wParam and MK_SHIFT > 0 then IsShiftKeyDown := True;
Result := 0;
end;
function TGameEx.WMLButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
IsLButtonDown := False;
IsShiftKeyDown := False;
Result := 0;
end;
function TGameEx.WMRButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
// Inc(MySelf.MapX, 10);
// Inc(MySelf.MapY, 10);
IsRButtonDown := True;
Result := 0;
end;
function TGameEx.WMRButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
IsRButtonDown := False;
Result := 0;
end;
begin
Game := TGameEx.Create('Hello, Game Application!',
False, CLIENT_WIDTH, CLIENT_HEIGHT, RGB(0, 0, 0));
Game.Run;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -