sm
服务器租用 996 无法下载点击此处反馈
/
查看: 1065|回复: 0

Delphi传奇地图平滑移动代码 [传奇3源码]

[复制链接]

826

主题

37

回帖

23万

积分

霸王教主

积分
237197
发表于 2023-2-26 10:54:48 | 显示全部楼层 |阅读模式
  1. var
  2.     x, y, xoff, yoff: Integer;
  3.     surface: TTexture;
  4. begin
  5.     for y := m_clientRect.Top to m_clientRect.Bottom + MAP_GRID_HEIGHT * 2 do begin
  6.         for x := m_clientRect.Left - 4 to m_clientRect.Right + 4 do begin
  7.             surface := Map.GetTextureAtLayer(x, y, layer, xoff, yoff);
  8.             if surface <> nil then begin
  9.                 surface.Draw((x - m_clientRect.Left) * UNITX + xoff - g_MySelf.m_nShiftX,
  10.                     (y - m_clientRect.Top) * UNITY + yoff - g_MySelf.m_nShiftY);
  11.             end;
  12.         end;
  13.     end;
  14. end;

  15. procedure TPlayScene.DrawObjLayer;
  16. var
  17.     x, y, i, j, px, py, xoff, yoff: Integer;
  18.     actor: TActor;
  19.     surface: TTexture;
  20.     ev: TEvent;
  21.     meff: TMagicEff;
  22.     list: TList;
  23.     dropItem: pTDropItem;
  24.     showItem: PTShowItem;
  25.     name: string;
  26.     rect: TRect;
  27.     width, height: Integer;
  28. begin
  29.     for y := m_clientRect.Top to m_clientRect.Bottom + MAP_GRID_HEIGHT * 2 do begin
  30.         { 渲染建筑 }
  31.         for x := m_clientRect.Left - 4 to m_clientRect.Right + 4 do begin
  32.             surface := Map.GetTextureAtLayer(x, y, ML_OBJ, xoff, yoff);
  33.             if surface <> nil then begin
  34.                 surface.Draw((x - m_clientRect.Left) * UNITX + xoff - g_MySelf.m_nShiftX,
  35.                     (y - m_clientRect.Top) * UNITY + yoff - g_MySelf.m_nShiftY);
  36.             end;
  37.         end;

  38.         { 渲染事件 }
  39.         g_eventRenderMgr.Render(y);
  40.         
  41. //        for i := 0 to EventMan.EventList.Count - 1 do begin
  42. //            ev := TEvent(EventMan.EventList<i>);
  43. //            if ev.m_nY = y then begin
  44. //                ev.DrawEvent(m_ObjSurface,
  45. //                    (ev.m_nX - m_clientRect.Left) * UNITX,
  46. //                    (ev.m_nY - m_clientRect.Top) * UNITX
  47. //                );
  48. //            end;
  49. //        end;

  50.         { 渲染掉落物品 }
  51.         if g_boDrawDropItem then begin
  52.             g_DropedItemList.Lock;
  53.             try
  54.                 for i := 0 to g_DropedItemList.Count - 1 do begin
  55.                     list := TList(g_DropedItemList<i>);
  56.                     if list.Count <= 0 then Break;

  57.                     dropItem := pTDropItem(list[0]);
  58.                     if (dropItem = nil) or (y <> (dropItem.Y)) then Continue;

  59.                     if  dropItem.Looks in [1, 2, 3] then
  60.                         surface := g_dropitems.Images['掉落_' + RES_BOOKS[dropItem.Looks - 1]]
  61.                     else
  62.                     if dropItem.Name = g_sGoldName then
  63.                         surface := g_dropitems.Images['掉落_金币大.png']
  64.                     else
  65.                         surface := g_dropitems.Images['掉落_' + dropItem.Name + '.png'];

  66.                     if surface = nil then Continue;

  67.                     px := (dropItem.X - m_ClientRect.Left) * UNITX - surface.Width div 2 - g_MySelf.m_nShiftX - HALFX;
  68.                     py := (dropItem.Y - m_ClientRect.Top) * UNITY - surface.Height div 2 - g_MySelf.m_nShiftY - HALFY;
  69.                     
  70.                     surface.Draw(px, py);

  71.                     {显示掉落物品名}
  72.                     if g_boDropItemFlash then begin
  73.                         width := TextWidth(dropItem.Name) + 4;
  74.                         height := TextHeight(dropItem.Name) + 2;
  75.                         
  76.                         rect.Left := px + (surface.Width - width) div 2;
  77.                         rect.Top := py - height - 4;
  78.                         rect.Right := rect.Left + width;
  79.                         rect.Bottom := rect.Top + height;

  80.                         surface.FillRectAlpha(rect, $00004C4C, 125);
  81.                         ImageDraw.TextOut(rect.Left + 2, rect.Top + 1, dropItem.Name);
  82.                     end;
  83.                 end
  84.             finally
  85.                 g_DropedItemList.UnLock;
  86.             end;
  87.         end;

  88.         { 渲染生物 }
  89.         for i := 0 to m_actorList.Count - 1 do begin
  90.             actor := TActor(m_ActorList.Items<i>);

  91.             if (actor.m_nRy = y) then begin
  92.                 if actor = g_AttackLockActor{g_MagicLockActor} then
  93.                 begin
  94.                     if not g_AttackLockActor.m_boDeath then begin
  95.                        DrawSelEffect(actor);
  96.                     end else begin
  97.                        g_AttackLockActor := nil;
  98.                     end;
  99.                 end;

  100.                 if (not g_boDrawMonsterDead) and actor.m_boDeath then Continue;
  101.                
  102.                 actor.Render(
  103.                       (actor.m_nRx - m_ClientRect.Left) * UNITX + actor.m_nShiftX - g_MySelf.m_nShiftX,
  104.                       (actor.m_nRy - m_ClientRect.Top) * UNITY + actor.m_nShiftY - g_MySelf.m_nShiftY
  105.                       );
  106.             end;
  107.         end;

  108.         { 绘制生物特效 }
  109.         for i := 0 to m_ActorList.Count - 1 do begin
  110.             Actor := m_ActorList<i>;
  111.             Actor.DrawEff(m_ObjSurface,
  112.                 (Actor.m_nRx - m_ClientRect.Left) * UNITX,
  113.                 (Actor.m_nRy - m_ClientRect.Top - 1) * UNITY);
  114.         end;
  115.     end;

  116.     { 绘制武功特效 }
  117.     for i := 0 to m_EffectList.Count - 1 do begin
  118.         meff := TMagicEff(m_EffectList<i>);
  119.         meff.DrawEff(m_ObjSurface);
  120.     end;

  121.     { 渲染飞行特效 }
  122.     for i := 0 to m_FlyList.Count - 1 do begin
  123.         meff := TMagicEff(m_FlyList.Items<i>);
  124.         if j = (meff.ry - Map.BlockTop) then begin
  125.             meff.DrawEff(m_ObjSurface);
  126.         end;
  127.     end;

  128. //    if g_NewStatus = sConfusion then begin
  129. //        msgstr := Format('You are confused, will return to normal in %d seconds. ', [g_NewStatusDelayTime]);
  130. //        with m_ObjSurface do begin
  131. //            FontSize := MainForm.Canvas.Font.Size;
  132. //            MainForm.Canvas.Font.Size := 18;
  133. //            m_ObjSurface.BoldTextOut((SCREENWIDTH - m_ObjSurface.TextWidth(msgstr)) div 2, (SCREENHEIGHT - 600) + 200, msgstr,
  134. //              clRed, clWhite);
  135. //            MainForm.Canvas.Font.Size := FontSize;
  136. //        end;
  137. //    end;
  138. end;

  139. function TPlayScene.calcShowActorNameY(actor: TActor; var iShowY: Integer) : Integer;
  140. begin
  141.   //计算Y坐标 用于显示 人物名
  142.   if g_boShowNameOnHead then begin
  143.     Result := iShowY;
  144.   end else begin
  145.     Result := actor.m_nSayY + actor.SayOff div 2;
  146.   end;
  147. end;

  148. procedure TPlayScene.DrawActorInfo;
  149. var
  150.     i: Integer;
  151.     actor: TActor;
  152.     name: string;
  153.     color: TColor;
  154.     iShowNameY, iTmp: Integer;
  155.     iShowNameX: Integer;
  156. begin
  157.     for i := 0 to m_ActorList.Count - 1 do begin
  158.         actor := TActor(m_ActorList<i>);
  159.         iShowNameY := actor.m_nSayY;
  160.         if not actor.m_boDeath then begin

  161.             if g_NewStatus = sBlind then Continue;

  162.             { 绘制血条 }
  163.             if not (actor.m_btRace in [RCC_MERCHANT, RC_DAIKATANAGUARD]) then
  164.               actor.RenderHealth(iShowNameY);

  165.             {NPC 只显示名字}
  166.             if (actor.m_btRace in [RCC_MERCHANT, RC_DAIKATANAGUARD, RC_ARROWGUARD]) then begin
  167.               if g_boExtrudeNPC then
  168.                 color := clLime
  169.               else color := actor.m_nNameColor;
  170.               actor.NameTextOut(actor.m_sUserName, actor.m_nSayX, calcShowActorNameY(actor, iShowNameY), color);

  171.               if (actor.m_btRace <> RC_ARROWGUARD) then Continue; //跳过,下一角色
  172.             end;

  173.             if{怪物} (actor.m_btRace <> 0) and (actor.m_btRace <> 1) then begin
  174.                if g_boDrawMonsterName then begin
  175.                   if g_boExtrudeMonsterName then begin
  176.                     if actor.m_btRace in [RC_SKULLPET, RC_DEITYPET]{道士宠物} then
  177.                      color := clLime
  178.                     else color := clRed;
  179.                   end else color := actor.m_nNameColor;
  180.                   actor.NameTextOut(actor.m_sUserName, actor.m_nSayX, calcShowActorNameY(actor, iShowNameY), color);
  181.                end;
  182.             end
  183.             else {玩家} if (actor.m_btRace = RCC_USERHUMAN{男}) or (actor.m_btRace = 1{女}) then begin
  184.                 if (Actor = g_MySelf) and g_boExtrudeSelf then
  185.                   color := clLime
  186.                 else color := actor.m_nNameColor;

  187.                 {角色名}
  188.                 iTmp := 0;
  189.                 name := '';        {鼠标指向角色 - 显示名称}
  190.                 if g_boDrawName or ((actor <> g_MySelf) and (actor = g_FocusCret)){其他玩家} or
  191.                  ((actor = g_MySelf) and IsSelectMyself(g_nMouseX, g_nMouseY)) {自己} then begin
  192.                   name := actor.m_sUserName;
  193.                 end;
  194.                 if name <> '' then begin
  195.                   //iTmp为人名显示Y坐标 - 16   iShowNameY - 为头顶坐标
  196.                   iTmp := actor.NameTextOut(name, actor.m_nSayX, calcShowActorNameY(actor, iShowNameY), color);
  197.                   if g_boShowNameOnHead then iShowNameY := iTmp;
  198.                 end;

  199.                 {行会名}
  200.                 if g_boShowNameOnHead then begin
  201.                   if (iTmp = 0) then iTmp := iShowNameY;
  202.                   if not g_boShowGuildNickNameOnHead then iTmp := actor.m_nSayY + actor.SayOff div 2;
  203.                 end else begin
  204.                   if g_boShowGuildNickNameOnHead then iTmp := iShowNameY
  205.                   else if iTmp = 0 then iTmp := actor.m_nSayY + actor.SayOff div 2;
  206.                 end;
  207.                 name := '';
  208.                 if (g_boDrawGuildName) and (actor.m_sDescGuildName <> '') then begin
  209.                   if actor.m_sDescRankName = '' then
  210.                     name := actor.m_sDescGuildName + '\' + name
  211.                   else
  212.                     name := actor.m_sDescGuildName + '[' + actor.m_sDescRankName + ']' + '\' + name;
  213.                 end;
  214.                 if name <> '' then begin
  215.                   iTmp := actor.NameTextOut(name, actor.m_nSayX, iTmp, color);
  216.                   if g_boShowGuildNickNameOnHead then iShowNameY := iTmp;
  217.                 end;

  218.                 {摆摊:商铺名}
  219.                 if actor.m_boStartStore then begin
  220.                   iShowNameX :=  actor.m_nSayX - (TextWidth(actor.m_sMyStoreName) + g_UIStoreName.Width + 2) div 2;
  221.                   g_UIStoreName.Draw(iShowNameX, iShowNameY - 5);

  222.                  ImageDraw.TextOut(iShowNameX + g_UIStoreName.Width + 2,
  223. iShowNameY, actor.m_sMyStoreName, clLime, ColorContour);
  224.                   Dec(iShowNameY, 23);
  225.                 end;
  226.             end;

  227.             { 绘制生命改变 攻击/毒等扣血值}
  228.             if g_boDrawHurtNum and (g_NewStatus <> sBlind) then begin
  229.                 Actor.ShowHealthStatus;
  230.             end;
  231.         end;
  232.         
  233.         { 显示角色说话文字 }
  234.         if g_NewStatus <> sBlind then begin
  235.             Actor.ShowSayMsg(m_ObjSurface, iShowNameY);
  236.         end;
  237.     end;

  238.     if (g_nAreaStateValue and $04) <> 0 then begin
  239.         m_ObjSurface.BoldTextOut(SCREENWIDTH div 2 - 60, 0, '[攻城区]');
  240.     end;

  241.     if (g_nAreaStateValue and $05) <> 0 then begin
  242.         m_ObjSurface.BoldTextOut(SCREENWIDTH div 2 - 20, 0, '[决斗区]');
  243.     end;

  244.     if (g_nAreaStateValue and $06) <> 0 then begin
  245.         m_ObjSurface.BoldTextOut(SCREENWIDTH div 2 - 50, 0, '[安全区]');
  246.     end;
  247. end;

  248. procedure TPlayScene.ClearDropItem;
  249. var
  250.     I, II: Integer;
  251.     List: TList;
  252.     DropItem: pTDropItem;
  253. begin
  254.     {
  255.     if not CanDraw then Exit;
  256.     }
  257.     g_DropedItemList.Lock;
  258.     try
  259.         for I := g_DropedItemList.Count - 1 downto 0 do begin
  260.             List := TList(g_DropedItemList.Items[I]);
  261.             if List.Count > 0 then begin
  262.                 DropItem := List.Items[0];
  263.                 if (abs(DropItem.X - g_MySelf.m_nCurrX) > 30) and (abs(DropItem.Y - g_MySelf.m_nCurrY) > 30) then begin
  264.                     for II := 0 to List.Count - 1 do begin
  265.                         DropItem := List.Items[II];
  266.                         Dispose(DropItem);
  267.                     end;
  268.                     List.Free;
  269.                     g_DropedItemList.Delete(I);
  270.                 end;
  271.             end;
  272.         end;
  273.     finally
  274.         g_DropedItemList.UnLock;
  275.     end;
  276. end;

  277. procedure TPlayScene.Run(RunSelf: Boolean);
  278. var
  279.     I, k: Integer;
  280.     movetick: Boolean;
  281.     evn: TEvent;
  282.     Actor: TActor;
  283.     meff: TMagicEff;
  284.     effectRender: TEffectRender;

  285.     dwCheckTime, dwTestCheckTime: LongWord;
  286.     nIdx: Integer;
  287.     boCheckTimeLimit: Boolean;
  288.     dwStepMoveTime: LongWord;
  289.     dwTickTime: LongWord;
  290. begin
  291.     if (g_MySelf = nil) then Exit;
  292.                  
  293.     g_boDoFastFadeOut := False;

  294.     {
  295.       m_nAniCount: 控制动画渲染 ? ? ?
  296.     }
  297.     if GetTickCount - m_dwAniTime >= 50 then begin
  298.         m_dwAniTime := GetTickCount;
  299.         Inc(m_nAniCount);
  300.         if m_nAniCount > 100000 then m_nAniCount := 0;
  301.     end;
  302.    
  303.     { Ryan - Some Serious Problem Here I Think, Needs Looking Into }
  304.     try
  305.         nIdx := 0;
  306.         dwCheckTime := g_sysTimeTick;
  307.         boCheckTimeLimit := False;
  308.         while True do begin
  309.             if nIdx >= m_ActorList.Count then Break;
  310.             Actor := TActor(m_ActorList.Items[nIdx]);

  311.             if (not RunSelf) and (Actor = g_MySelf) then begin
  312.                 Inc(nIdx);
  313.                 Continue;
  314.             end;

  315.             dwTestCheckTime := g_sysTimeTick;
  316.             movetick := Actor.CanMove;

  317.             if movetick then begin
  318.                 Actor.m_boLockEndFrame := False;
  319.             end;

  320.             if not Actor.m_boLockEndFrame then begin
  321.                 Actor.ProcMsg;
  322.                 Actor.Run;
  323.                 if movetick then begin
  324.                     if Actor.Move(Actor.m_nMoveStepCount) then begin
  325.                         Inc(nIdx);
  326.                         Continue;
  327.                     end;
  328.                 end;
  329.                 if Actor <> g_MySelf then
  330.                     Actor.ProcHurryMsg;
  331.             end;

  332.             if Actor = g_MySelf then Actor.ProcHurryMsg;

  333.             if Actor.m_nWaitForRecogId <> 0 then begin
  334.                 if Actor.IsIdle then begin
  335.                     DelChangeFace(Actor.m_nWaitForRecogId);

  336.                    NewActor(Actor.m_nWaitForRecogId, Actor.m_nCurrX,
  337. Actor.m_nCurrY, Actor.m_btDir, Actor.m_nWaitForFeature,
  338. Actor.m_nWaitForStatus);
  339.                     Actor.m_nWaitForRecogId := 0;
  340.                     Actor.m_boDelActor := True;
  341.                 end;
  342.             end;

  343.             if Actor.m_boDelActor then begin
  344.                 m_ActorList.Delete(nIdx);
  345.                 UpDataFreeActorList(Actor);
  346.                 if g_TargetCret = Actor then g_TargetCret := nil;
  347.                 if g_FocusCret = Actor then g_FocusCret := nil;
  348.                 if g_MagicTarget = Actor then g_MagicTarget := nil;
  349.                 if g_MyHero = Actor then g_MyHero := nil;
  350.                 if g_SerieTarget = Actor then g_SerieTarget := nil;
  351.             end
  352.             else begin
  353.                 Inc(nIdx);
  354.             end;
  355.         end;
  356.     except
  357.         DebugOutStr('Error 1: PlayerSence.Run');
  358.     end;

  359.     try
  360.         { 处理地面特效 }
  361.         nIdx := 0;
  362.         while True do begin
  363.             if nIdx >= m_GroundEffectList.Count then Break;
  364.             meff := m_GroundEffectList[nIdx];
  365.             if meff.m_boActive then begin
  366.                 if not meff.Run then begin
  367.                     m_GroundEffectList.Delete(nIdx);
  368.                     meff.Free;
  369.                     Continue;
  370.                 end;
  371.             end;
  372.             Inc(nIdx);
  373.         end;
  374.               
  375.         { 处理特武功效 }
  376.         nIdx := 0;
  377.         while True do begin
  378.             if nIdx >= m_effectRenderList.Count then Break;
  379.             effectRender := m_effectRenderList[nIdx];
  380.             if not effectRender.Running then begin
  381.                 effectRender.Free;
  382.                 m_effectRenderList.Delete(nIdx);
  383.             end;
  384.             Inc(nIdx);
  385.         end;

  386.         { 处理特武功效 }
  387.         nIdx := 0;
  388.         while True do begin
  389.         if nIdx >= m_EffectList.Count then Break;
  390.             meff := m_EffectList[nIdx];
  391.             if meff.m_boActive then begin
  392.                 if not meff.Run then begin
  393.                     meff.Free;
  394.                     m_EffectList.Delete(nIdx);
  395.                     Continue;
  396.                 end;
  397.             end;
  398.             Inc(nIdx);
  399.         end;
  400.               
  401.         { 处理飞行特效 }
  402.         nIdx := 0;
  403.         while True do begin
  404.             if nIdx >= m_FlyList.Count then Break;
  405.             meff := m_FlyList[nIdx];
  406.             if meff.m_boActive then begin
  407.                 if not meff.Run then begin
  408.                     meff.Free;
  409.                     m_FlyList.Delete(nIdx);
  410.                     Continue;
  411.                 end;
  412.             end;
  413.             Inc(nIdx);
  414.         end;

  415.         { 执行事件逻辑 }
  416.         g_eventRenderMgr.Update;
  417.         EventMan.Execute;
  418.     except
  419.         DebugOutStr('Error 2: PlayerSence.Run');
  420.     end;

  421.     try
  422.         { 清除超过显示范围的物品数据 }
  423.         ClearDropItem();

  424.         { 清除超过显示范围的魔法数据 }
  425.         for k := 0 to EventMan.EventList.Count - 1 do begin
  426.             evn := TEvent(EventMan.EventList[k]);
  427.             if (abs(evn.m_nX - g_MySelf.m_nCurrX) > 30) and (abs(evn.m_nY - g_MySelf.m_nCurrY) > 30) then begin
  428.                 evn.Free;
  429.                 EventMan.EventList.Delete(k);
  430.                 Break;
  431.             end;
  432.         end;
  433.         
  434.         { 播放烟花声音 }
  435.         for k := 0 to EventMan.EventList.Count - 1 do begin
  436.             evn := TEvent(EventMan.EventList[k]);
  437.             if (abs(evn.m_nX - g_MySelf.m_nCurrX) <= 15) and (abs(evn.m_nY - g_MySelf.m_nCurrY) <= 15) then begin
  438.                 if evn.m_nEventType in [ET_FIREFLOWER_1..ET_FIREFLOWER_8] then begin
  439.                     if TFlowerEvent(evn).m_nExplosionSound > 0 then begin
  440.                         PlaySound(TFlowerEvent(evn).m_nExplosionSound);
  441.                         TFlowerEvent(evn).m_nExplosionSound := -2;
  442.                     end;
  443.                 end;
  444.             end;
  445.         end;
  446.     except
  447.         DebugOutStr('Error 3: PlayerSence.Run');
  448.     end;
  449.    
  450.     g_dwRefreshMessagesTick := g_sysTimeTick;
  451. end;

  452. procedure TPlayScene.PlayScene(MSurface: TTexture);
  453. var
  454.     msgstr: string;
  455.     nSnowX, nSnowY: Integer;
  456.     FontSize: Integer;
  457.     surface: TTexture;
  458.     mode: Integer;
  459.     rect: TRect;
  460.     width, height, i: Integer;
  461.     s,s1: Int64;
  462. begin
  463.     { 角色加载中 }
  464.     if (g_MySelf = nil) then begin
  465.         Exit;
  466.     end;
  467.     if Assigned(g_PlugInfo.HookPlayScene) then begin
  468.         if g_PlugInfo.HookPlayScene(MSurface) then Exit;
  469.     end;
  470.     Run(True);

  471.     { 失明状态 }
  472.     if g_NewStatus = sBlind then begin
  473.         msgstr := Format('你已进入失明状态,持续%d秒...', [g_NewStatusDelayTime]);
  474.         with MSurface do begin
  475.             FontSize := MainForm.Canvas.Font.Size;
  476.             MainForm.Canvas.Font.Size := 18;
  477.             BoldTextOut((SCREENWIDTH - TextWidth(msgstr)) div 2, (SCREENHEIGHT - 600) + 200, msgstr);
  478.             MainForm.Canvas.Font.Size := FontSize;
  479.         end;
  480.         Exit;
  481.     end;

  482.     { 画面震动 }
  483.     if g_boVibration then begin
  484.         g_nVibrationX := g_nVibrationX + g_VibrationValue[g_nVibrationPos].X;
  485.         g_nVibrationY := g_nVibrationY + g_VibrationValue[g_nVibrationPos].Y;
  486.         Inc(g_nVibrationPos);

  487.         if g_nVibrationPos >= Length(g_VibrationValue) then begin
  488.             g_nVibrationPos := 0;
  489.             Inc(g_nVibrationCount);
  490.         end;
  491.         g_boVibration := g_nVibrationCount < g_nVibrationTotal;
  492.     end;

  493.     { 客户端窗口定位 }
  494.     with m_clientRect do begin
  495.         Top := g_MySelf.m_nRy - (SCREENHEIGHT div UNITY + 1) div 2;
  496.         Left := g_MySelf.m_nRx - (SCREENWIDTH div UNITX + 1) div 2;
  497.         Right := g_MySelf.m_nRx + (SCREENWIDTH div UNITX - 1) div 2;
  498.         Bottom := g_MySelf.m_nRy + (SCREENHEIGHT div UNITY - 1) div 2;
  499.     end;

  500.     m_nOldCurrX := m_nCurrX;
  501.     m_nOldCurrY := m_nCurrY;

  502.     m_nCurrX := g_MySelf.m_nShiftX;
  503.     m_nCurrY := g_MySelf.m_nShiftY;

  504.     if m_nCurrX < 0 then m_nCurrX := 0;
  505.     if m_nCurrY < 0 then m_nCurrY := 0;

  506.     nSnowX := m_nCurrX;
  507.     nSnowY := m_nCurrY;

  508.     { 更新地图块 }
  509.     Map.UpdateMapBlock(g_MySelf.m_nRx, g_MySelf.m_nRy);
  510.     Map.UpdateSceneMgr;

  511.     { 绘制地下表层 }
  512.     DrawMap(ML_GROUND);
  513.     { 绘制地表层 }
  514.     DrawMap(ML_SURFACE);
  515.     { 绘制上地表层 }
  516.     DrawMap(ML_TILE);
  517.     { 绘制对象层 }
  518.     DrawObjLayer;
  519.     { 绘制天空层 }
  520.     DrawMap(ML_SKY);

  521.     if (g_MySelf <> nil) and IsValidActor(g_MySelf) and (g_MySelf.m_nState and $00800000 = 0) then begin
  522.         g_MySelf.Render((g_MySelf.m_nRx - m_ClientRect.Left) * UNITX,
  523.             (g_MySelf.m_nRy - m_ClientRect.Top) * UNITY, True, 110);
  524.     end;

  525.     if (g_FocusCret <> nil) and IsValidActor(g_FocusCret) and (g_FocusCret <> g_MySelf) and
  526.         (g_FocusCret.m_nState and $00800000 = 0) then begin
  527.         g_FocusCret.Render(
  528.             (g_FocusCret.m_nRx - m_ClientRect.Left) * UNITX + g_FocusCret.m_nShiftX - g_MySelf.m_nShiftX,
  529.             (g_FocusCret.m_nRy - m_ClientRect.Top) * UNITY + g_FocusCret.m_nShiftY - g_MySelf.m_nShiftY,
  530.             True, 110
  531.         );
  532.     end;

  533.     if (g_MagicTarget <> nil) and IsValidActor(g_MagicTarget) and (g_MagicTarget <> g_MySelf) and
  534.         (g_MagicTarget.m_nState and $00800000 = 0) then begin
  535.         g_MagicTarget.Render(
  536.             (g_MagicTarget.m_nRx - m_ClientRect.Left) * UNITX + g_MagicTarget.m_nShiftX - g_MySelf.m_nShiftX,
  537.             (g_MagicTarget.m_nRy - m_ClientRect.Top) * UNITY + g_MagicTarget.m_nShiftY - g_MySelf.m_nShiftY,
  538.             True, 110
  539.         );
  540.     end;

  541.     {掉落物品名字}
  542.     if g_FocusItem <> nil then begin
  543.         if g_FocusItem.Looks in [1, 2, 3] then
  544.             surface := g_dropitems.Images['掉落_' + RES_BOOKS[g_FocusItem.Looks - 1]]
  545.         else
  546.             if g_FocusItem.Name = g_sGoldName then
  547.                 surface := g_dropitems.Images['掉落_金币大.png']
  548.             else
  549.                 surface := g_dropitems.Images['掉落_' + g_FocusItem.Name + '.png'];

  550.         if surface <> nil then begin
  551.             nSnowX := (g_FocusItem.X - m_ClientRect.Left) * UNITX - surface.Width div 2 - g_MySelf.m_nShiftX - HALFX;
  552.             nSnowY := (g_FocusItem.Y - m_ClientRect.Top) * UNITY - surface.Height div 2 - g_MySelf.m_nShiftY - HALFY;

  553.             surface.Draw(nSnowX, nSnowY);
  554.             surface.DrawEff(nSnowX, nSnowY, ceBright, 170);

  555.             width := TextWidth(g_FocusItem.Name) + 4;
  556.             height := TextHeight(g_FocusItem.Name) + 2;

  557.             rect.Left := nSnowX + (surface.Width - width) div 2;
  558.             rect.Top := nSnowY - height - 4;
  559.             rect.Right := rect.Left + width;
  560.             rect.Bottom := rect.Top + height;
  561.             
  562.             surface.FillRectAlpha(rect, $00004C4C, 125);
  563.             ImageDraw.TextOut(rect.Left + 2, rect.Top + 1, g_FocusItem.Name);
  564.         end;
  565.     end;
  566.    
  567.     { 绘制名字、血条等}
  568.     DrawActorInfo;
  569.     DrawTargetHP();

  570.     { 绘制武功特效 }
  571.     for i := 0 to m_effectRenderList.Count - 1 do begin
  572.         TEffectRender(m_effectRenderList<i>).Render;
  573.     end;

  574.     { 地图掩盖层 }
  575.     if (Map.Name = 'jjc') or (Map.Name = 'mq0') or (Map.Name = 'mz0') or (Map.Name = 'shatu') then begin
  576.         surface := nil;
  577.     end
  578.     else begin
  579.         surface := g_resUi.Images['map_mask.png'];
  580.     end;

  581.     if surface <> nil then begin
  582.         surface.Draw(0, 0);
  583.     end;

  584.     DrawBloodBox();
  585.     if g_jjrelive then begin
  586.        s := Round((GetTickCount - g_jjreliveTick) div 1000);
  587.        if s <= 10 then begin
  588.           ImageDraw.TextOut(100, 100, IntToStr(s));

  589.        end else begin
  590.          frmMain.SendMerchantDlgSelect(g_nCurMerchant, '@revivejjc');
  591.          g_jjrelive := False;
  592.        end;
  593.     end;
  594.     if g_startplay then begin
  595.          s1 := Round((GetTickCount - g_starttime) div 1000);
  596.         if s1 < 5 then begin
  597.            g_timepic[4-s1].Draw((SCREENWIDTH - g_timepic[4-s1].Width) div 2, (SCREENHEIGHT - g_timepic[4-s1].Height) div 2);
  598.         end else begin
  599.            if s1 = 5 then begin
  600.              g_timepic[s1].Draw((SCREENWIDTH - g_timepic[s1].Width) div 2, (SCREENHEIGHT - g_timepic[s1].Height) div 2);
  601.            end else begin
  602.               g_startplay := False;
  603.            end;

  604.         end;
  605.     end;
  606. end;</i></i></i></i></i></i></i></i>
复制代码






上一篇:传奇3加速外挂源代码EI3.0超级蓝海挂机Delphi源码
下一篇:Zircon传奇3源代码仿韩版黑龙逆向代码C#传奇3源码
回复

使用道具 举报

© 2001-2024 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2024-11-21 20:05 , Processed in 0.261141 second(s), 46 queries 手机版|美林GM论坛 ( 蜀ICP备2020030293号-2 )|网站地图

禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.如遇版权问题,请及时QQ联系

快速回复 返回顶部 返回列表