|
|
[传奇技术]增加小地图的第三种显示方式
喜欢大部分引擎的大地图的方式。。。
先改了一下客户端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;
复制代码 其实就是一个很简单的框架来的。。
大地图居中不会。加边框也不会。。。。
还有就是最大的这种地图的中键寻路也不准确。。。。找到寻路的代码。暂时还不会改。。。
请各位大哥指教。
|
|