| 喜欢大部分引擎的大地图的方式。。。 先改了一下客户端clmain.pas里的显示小地图的地方 就是改了按快捷键tab的。鼠标点的触发没有改。。。 原来的小地图有两种的,一种小的局部的。一个大点的全景的。。。分两个等级小地图。增加一个等级3吧。 |
procedure TfrmMain.SwitchMiniMap(); //开关小地图
var
i: Integer;
szMapTitle: string;
pMapDescInfo: pTMapDescInfo;
begin
if not g_boViewMiniMap then
begin
if GetTickCount > g_dwQueryMsgTick then
begin
g_dwQueryMsgTick := GetTickCount + 3000;
frmMain.SendWantMiniMap;
g_nViewMinMapLv := 1;
g_boViewMiniMap := True;
DScreen.AddChatBoardString('等级1', clWhite, clBlue);
end;
end
else
begin
//增加一级
Inc(g_nViewMinMapLv);
DScreen.AddChatBoardString('等级+1', clWhite, clBlue);
if g_nViewMinMapLv = 2 then
begin
DScreen.AddChatBoardString('等级2', clWhite, clBlue);
//g_nViewMinMapLv := 0;
// g_boViewMiniMap := True;
end ;
if g_nViewMinMapLv > 3 then
begin
DScreen.AddChatBoardString('清空等级', clWhite, clBlue);
g_nViewMinMapLv := 0;
g_boViewMiniMap := False;
end;
end;
// 123456
g_xCurMapDescList.Clear;
for i := 0 to g_xMapDescList.count - 1 do
begin
szMapTitle := g_xMapDescList[i];
pMapDescInfo := pTMapDescInfo(g_xMapDescList.Objects[i]);
if (CompareText(g_xMapDescList[i], g_sMapTitle) = 0) and
(((pMapDescInfo.nFullMap = g_nViewMinMapLv) and
(pMapDescInfo.nFullMap = 1)) or ((g_nViewMinMapLv <> 1) and
(pMapDescInfo.nFullMap = 0))) then
begin
g_xCurMapDescList.AddObject(g_xMapDescList[i], TObject(pMapDescInfo));
end;
end;
end;然后修改playscn.pas 等级3显示一个400*400的大地图全景。。
//画迷你小地图
procedure TPlayScene.DrawMiniMap(Surface: TCustomCanvas);
var
D, dd : TCustomLockableTexture; //画布
v : Boolean;
mx, my, nX, nY, i : Integer;
Actor : TActor;
X, Y : Integer;
btColor : byte;
rx, ry, rrx, rry : Real;
S : string;
tMapPath : array of TPoint;
pMapDescInfo : pTMapDescInfo;
begin
//ih小地图索引小于0退出.
if g_nMiniMapIndex < 0 then Exit;
//地图索引. 大于300
if g_nMiniMapIndex >= 300 then begin
//读取 Data\NewopUI.data里的补丁.
D := g_opui.Images[g_nMiniMapIndex + 1]; //ASP注释
end else
//读取Data\mmap.data的数据.
D := g_WMMapImages.Images[g_nMiniMapIndex];
if D = nil then begin
//为空的话呢 画迷你地图为假...
g_DrawingMiniMap := False;
Exit;
end;
if g_nViewMinMapLv = 1 then begin
mx := (g_MySelf.m_nCurrX * 48) div 32;
my := g_MySelf.m_nCurrY;
//g_MiniMapRC 整数矩形 为IntRect
//左右上底部的坐标............., 细看很简单的...
g_MiniMapRC.Left := _MAX(0, mx - 60);
g_MiniMapRC.Top := _MAX(0, my - 60);
g_MiniMapRC.Right := _MIN(D.ClientRect.Right, g_MiniMapRC.Left + 120);
g_MiniMapRC.Bottom := _MIN(D.ClientRect.Bottom, g_MiniMapRC.Top + 120);
//画写混合为真.
if g_DrawMiniBlend then begin
// DrawBlend_Mix(Surface, (SCREENWIDTH - 120), 0, D, g_MiniMapRC.Left, g_MiniMapRC.Top, 120, 120, 0); //ASP注释
Surface.DrawAlpha((SCREENWIDTH - 120), 0, g_MiniMapRC, D, 120)
end else begin
Surface.Draw(SCREENWIDTH - 120, 0, g_MiniMapRC, D, False); //ASP注释
end;
g_DrawingMiniMap := True;
// 闪烁时间 +300 自身在地图上的小点..
if GetTickCount > m_dwBlinkTime + 300 then begin
m_dwBlinkTime := GetTickCount;
m_boViewBlink := not m_boViewBlink;
end;
if m_boViewBlink then begin
mx := (SCREENWIDTH - 120) + (g_MySelf.m_nCurrX * 48) div 32 - g_MiniMapRC.Left;
my := (g_MySelf.m_nCurrY * 32) div 32 - g_MiniMapRC.Top;
//向右填充
Surface.FillRect(IntRectBDS(mx - 1, my - 1, 1 + 2, 1 + 2), GetRGB(255));
end;
//历一次列表......演员列表...
for i := 0 to m_ActorList.Count - 1 do begin //opt
Actor := TActor(m_ActorList[i]);
//此演员的各种状态.. 正常的话...
if (Actor <> nil) and not Actor.m_boDeath and Actor.m_boVisible and Actor.m_boHoldPlace and (Actor <> g_MySelf) then begin
//找范围 再进行显示...
//演员与自身的x并Y 10距离的绝对值。。就是10*10范围吧。
if (abs(Actor.m_nCurrX - g_MySelf.m_nCurrX) <= 10) and (abs(Actor.m_nCurrY - g_MySelf.m_nCurrY) <= 10) then begin
//屏的高度-120+ 演员当前坐标*45/42-地图的左边
mx := (SCREENWIDTH - 120) + (Actor.m_nCurrX * 48) div 32 - g_MiniMapRC.Left;
//当前坐标-小地图上面坐标?
my := Actor.m_nCurrY - g_MiniMapRC.Top;
case Actor.m_btRace of //根据演员的race决定是什么色..
12, 24, 50: btColor := 250; //一些是紫色...
54, 55, 81: btColor := 0;
0: begin
if Actor.m_btNameColor = 255 then
btColor := 251
else
btColor := Actor.m_btNameColor;
{if Actor.m_btIsHero <> 0 then
btColor := 147
else
btColor := 251;}
end;
else
btColor := 249; //其它为249
end;
if Actor.m_btNameColor = 253 then btColor := 253;
//根据颜色处理小点...
Surface.FillRect(IntRectBDS(mx - 1, my - 1, 1 + 2, 1 + 2), GetRGB(btColor));
end;
end;
end;
//123456
//当前地图备注列表 确定显示名字。。。
for i := 0 to g_xCurMapDescList.Count - 1 do begin
pMapDescInfo := pTMapDescInfo(g_xCurMapDescList.Objects[i]);
mx := (SCREENWIDTH - 120) + (pMapDescInfo.nPointX * 48) div 32 - g_MiniMapRC.Left;
my := pMapDescInfo.nPointY - g_MiniMapRC.Top;
if (mx >= SCREENWIDTH - 120) and ((my >= 0) and (my <= 120)) then begin
if g_DrawMiniBlend then
Surface.BoldTextOut( mx, my, pMapDescInfo.nColor, FontBorderColor, pMapDescInfo.szPlaceName)
else
Surface.BoldTextOut( mx, my, pMapDescInfo.nColor, FontBorderColor, pMapDescInfo.szPlaceName)
end;
end;
//如果显示小地图坐标。画出坐标。
if g_ShowMiniMapXY then begin
rx := g_MySelf.m_nCurrX + (g_nMouseX - (SCREENWIDTH - (g_MiniMapRC.Right - g_MiniMapRC.Left)) - ((g_MiniMapRC.Right - g_MiniMapRC.Left) div 2)) * 2 / 3;
ry := g_MySelf.m_nCurrY + (g_nMouseY - (g_MiniMapRC.Bottom - g_MiniMapRC.Top) div 2);
if (rx >= 0) and (ry >= 0) then begin
S := Format('%s:%s', [IntToStr(Round(rx)), IntToStr(Round(ry))]);
with Surface do begin
try
TextOut(SCREENWIDTH - FontManager.Default.TextWidth(S) - 02, g_MiniMapRC.Bottom - g_MiniMapRC.Top - 14, IntToStr(Round(rx)) + ':' + IntToStr(Round(ry))); //ASP注释
finally
end;
end;
end;
end;
//地图路径不为空。。。 中键寻路 显示路径吧。。。
if g_MapPath <> nil then
if g_MoveStep <= High(g_MapPath) then
for i := g_MoveStep to High(g_MapPath) do begin
mx := (SCREENWIDTH - 120) + (g_MapPath[i].X * 48) div 32 - g_MiniMapRC.Left;
my := g_MapPath[i].Y - g_MiniMapRC.Top;
if (mx >= SCREENWIDTH - 120) and ((my >= 0) and (my <= 120)) then
Surface.FillRect(IntRectBDS(mx, my, 1, 1), GetRGB(224));
end;
//下面就是g_nViewMinMapLv >= 2的了。。。就是再变大一点的地图。。
end;
if g_nViewMinMapLv = 2 then
begin
g_MiniMapRC.Left := SCREENWIDTH - MINIMAPSIZE;
g_MiniMapRC.Top := 0;
g_MiniMapRC.Right := SCREENWIDTH;
g_MiniMapRC.Bottom := MINIMAPSIZE;
Surface.StretchDraw(g_MiniMapRC,d.ClientRect, d,true);
// if g_DrawMiniBlend then begin
// g_DsMiniMapPixel.StretchDraw(g_MapRect, D.ClientRect, D, False); //ASP注释
// DrawBlend_Mix(Surface, (SCREENWIDTH - MINIMAPSIZE), 0, g_DsMiniMapPixel, 0, 0, MINIMAPSIZE, MINIMAPSIZE, 0);
// end else
// Surface.StretchDraw(g_MiniMapRC, D.ClientRect, D, False);
g_DrawingMiniMap := True;
if GetTickCount > m_dwBlinkTime + 300 then begin
m_dwBlinkTime := GetTickCount;
m_boViewBlink := not m_boViewBlink;
end;
rx := D.Width / (MINIMAPSIZE * 1.5);
ry := D.Height / MINIMAPSIZE;
rrx := rx;
rry := ry;
if m_boViewBlink then begin
mx := g_MiniMapRC.Left + Round(g_MySelf.m_nCurrX / rx);
my := Round(g_MySelf.m_nCurrY / ry);
Surface.FillRect(IntRectBDS(mx - 1, my - 1, 1 + 2, 1 + 2), GetRGB(255));
end;
if g_boOpenAutoPlay and (g_APMapPath <> nil) then begin
nX := Round(12 / rx);
nY := Round(12 / ry);
SetLength(tMapPath, High(g_APMapPath) + 1);
for i := 0 to High(g_APMapPath) do begin
mx := Round(g_APMapPath[i].X / rx);
my := Round(g_APMapPath[i].Y / ry);
tMapPath[i] := Point(SCREENWIDTH - MINIMAPSIZE + mx, my);
Surface.FillRect(IntRectBDS(SCREENWIDTH - 200 + mx - 1, my - 1, 1 + 1, 1 + 1), GetRGB(249));
// with Surface.Canvas do begin //ASP注释
// if i = g_APStep then
// Pen.Color := clRed
// else
// Pen.Color := clLime;
// Brush.Color := clBlack;
// Brush.Style := bsClear;
// RoundRect((SCREENWIDTH - 200 + mx + nX), (0 + my + nY), (SCREENWIDTH - 200 + mx - nX), (0 + my - nY), nX * 2, nY * 2);
// Release;
// end;
end;
// with Surface.Canvas do begin //ASP注释
// Pen.Color := GetRGB(151);
// Brush.Color := clBlack;
// Brush.Style := bsClear;
// Polygon(tMapPath);
// Release;
// end;
end;
if g_MapPath <> nil then begin
if g_MoveStep <= High(g_MapPath) then
for i := g_MoveStep to High(g_MapPath) do begin
mx := SCREENWIDTH - 200 + Round(g_MapPath[i].X / rx);
my := Round(g_MapPath[i].Y / ry);
Surface.FillRect(IntRectBDS(mx, my, 1, 1), GetRGB(224));
end;
end;
//123456
for i := 0 to g_xCurMapDescList.Count - 1 do begin
pMapDescInfo := pTMapDescInfo(g_xCurMapDescList.Objects[i]);
mx := SCREENWIDTH - 200 + Round(pMapDescInfo.nPointX / rrx);
my := Round(pMapDescInfo.nPointY / rry);
if g_DrawMiniBlend then
Surface.BoldTextOut( mx, my, pMapDescInfo.nColor, FontBorderColor, pMapDescInfo.szPlaceName)
else
Surface.BoldTextOut( mx, my, pMapDescInfo.nColor, FontBorderColor, pMapDescInfo.szPlaceName)
end;
if g_ShowMiniMapXY then begin
rx := (g_nMouseX - g_MiniMapRC.Left) * (Map.m_MapHeader.wWidth / MINIMAPSIZE);
ry := g_nMouseY * (Map.m_MapHeader.wHeight / MINIMAPSIZE);
if (rx >= 0) and (ry >= 0) then begin
S := Format('%s:%s', [IntToStr(Round(rx)), IntToStr(Round(ry))]);
with Surface do begin
// Windows.SetBkMode(Handle, TRANSPARENT);
try
TextOut(SCREENWIDTH - FontManager.Default.TextWidth(S) - 2, MINIMAPSIZE - 14, S); //ASP注释
finally
// Release;
end;
end;
end;
end;
end;
if g_nViewMinMapLv = 3 then
begin
//这是第三种显示,大一点的...
//
//400*400
//
g_MiniMapRC.Left := SCREENWIDTH - 400;
g_MiniMapRC.Top := 0;
g_MiniMapRC.Right := SCREENWIDTH;
g_MiniMapRC.Bottom := 400;
Surface.StretchDraw(g_MiniMapRC,d.ClientRect, d,true);
// if g_DrawMiniBlend then begin
// g_DsMiniMapPixel.StretchDraw(g_MapRect, D.ClientRect, D, False); //ASP注释
// DrawBlend_Mix(Surface, (SCREENWIDTH - MINIMAPSIZE), 0, g_DsMiniMapPixel, 0, 0, MINIMAPSIZE, MINIMAPSIZE, 0);
// end else
// Surface.StretchDraw(g_MiniMapRC, D.ClientRect, D, False);
g_DrawingMiniMap := True;
if GetTickCount > m_dwBlinkTime + 300 then begin
m_dwBlinkTime := GetTickCount;
m_boViewBlink := not m_boViewBlink;
end;
rx := D.Width / (400*1.5);
ry := D.Height / 400;
rrx := rx;
rry := ry;
//查看闪烁
if m_boViewBlink then begin
mx := g_MiniMapRC.Left + Round(g_MySelf.m_nCurrX / rx);
my := Round(g_MySelf.m_nCurrY / ry);
Surface.FillRect(IntRectBDS(mx - 1, my - 1, 1 + 2, 1 + 2), GetRGB(255));
end;
if g_boOpenAutoPlay and (g_APMapPath <> nil) then begin
nX := Round(12 / rx);
nY := Round(12 / ry);
SetLength(tMapPath, High(g_APMapPath) + 1);
for i := 0 to High(g_APMapPath) do begin
mx := Round(g_APMapPath[i].X / rx);
my := Round(g_APMapPath[i].Y / ry);
tMapPath[i] := Point(SCREENWIDTH - 400 + mx, my);
Surface.FillRect(IntRectBDS(SCREENWIDTH - 400 + mx - 1, my - 1, 1 + 1, 1 + 1), GetRGB(249));
// with Surface.Canvas do begin //ASP注释
// if i = g_APStep then
// Pen.Color := clRed
// else
// Pen.Color := clLime;
// Brush.Color := clBlack;
// Brush.Style := bsClear;
// RoundRect((SCREENWIDTH - 200 + mx + nX), (0 + my + nY), (SCREENWIDTH - 200 + mx - nX), (0 + my - nY), nX * 2, nY * 2);
// Release;
// end;
end;
// with Surface.Canvas do begin //ASP注释
// Pen.Color := GetRGB(151);
// Brush.Color := clBlack;
// Brush.Style := bsClear;
// Polygon(tMapPath);
// Release;
// end;
end;
if g_MapPath <> nil then begin
if g_MoveStep <= High(g_MapPath) then
for i := g_MoveStep to High(g_MapPath) do begin
mx := SCREENWIDTH - 400 + Round(g_MapPath[i].X / rx);
my := Round(g_MapPath[i].Y / ry);
Surface.FillRect(IntRectBDS(mx, my, 1, 1), GetRGB(224));
end;
end;
//123456
for i := 0 to g_xCurMapDescList.Count - 1 do begin
pMapDescInfo := pTMapDescInfo(g_xCurMapDescList.Objects[i]);
mx := SCREENWIDTH - 400 + Round(pMapDescInfo.nPointX / rrx);
my := Round(pMapDescInfo.nPointY / rry);
if g_DrawMiniBlend then
Surface.BoldTextOut( mx, my, pMapDescInfo.nColor, FontBorderColor, pMapDescInfo.szPlaceName)
else
Surface.BoldTextOut( mx, my, pMapDescInfo.nColor, FontBorderColor, pMapDescInfo.szPlaceName)
end;
if g_ShowMiniMapXY then begin
rx := (g_nMouseX - g_MiniMapRC.Left) * (Map.m_MapHeader.wWidth / 400);
ry := g_nMouseY * (Map.m_MapHeader.wHeight / 400);
if (rx >= 0) and (ry >= 0) then begin
S := Format('%s:%s', [IntToStr(Round(rx)), IntToStr(Round(ry))]);
with Surface do begin
// Windows.SetBkMode(Handle, TRANSPARENT);
try
TextOut(SCREENWIDTH - FontManager.Default.TextWidth(S) - 2, 400 - 14, S); //ASP注释
finally
// Release;
end;
end;
end;
end;
end;
end;
| 其实就是一个很简单的框架来的。。 大地图居中不会。加边框也不会。。。。 还有就是最大的这种地图的中键寻路也不准确。。。。找到寻路的代码。暂时还不会改。。。 请各位大哥指教。 |
声明:本文系互联网搜索而收集整理,不以盈利性为目的,文字、图文资料源于互联网且共享于互联网。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。