AD商业广告自由选择
AD商业广告自由选择

增加小地图的第三种显示方式

正文概述 开源人   2026-04-08 01:40:37  
喜欢大部分引擎的大地图的方式。。。4os1234FCOM专注游戏工具及源码例子分享
4os1234FCOM专注游戏工具及源码例子分享
先改了一下客户端clmain.pas里的显示小地图的地方 就是改了按快捷键tab的。鼠标点的触发没有改。。。4os1234FCOM专注游戏工具及源码例子分享
原来的小地图有两种的,一种小的局部的。一个大点的全景的。。。分两个等级小地图。增加一个等级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;
其实就是一个很简单的框架来的。。4os1234FCOM专注游戏工具及源码例子分享
大地图居中不会。加边框也不会。。。。4os1234FCOM专注游戏工具及源码例子分享
还有就是最大的这种地图的中键寻路也不准确。。。。找到寻路的代码。暂时还不会改。。。4os1234FCOM专注游戏工具及源码例子分享
请各位大哥指教。
 


声明:本文系互联网搜索而收集整理,不以盈利性为目的,文字、图文资料源于互联网且共享于互联网。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。