1. 程式人生 > >熱血傳奇Tile地圖繪製方法分析及平滑繪製分析

熱血傳奇Tile地圖繪製方法分析及平滑繪製分析

眾所周知熱血傳奇的地圖繪製是不平滑的。因為其繪製間隔是以遊戲中的X,Y座標為單位進行繪製間隔。而一個X座標.和Y座標 在遊戲內表示 48,32 個畫素點。

   而遊戲中的房屋等元素在我看來更是坑爹。因為房屋這些元素的繪製並不是以左上角為基點進行繪製 而是以左下角。也就意味著 如果一長房屋的圖片長度如果和螢幕差不多大。    則在獲取房屋圖片的索引時 需要迴圈兩個螢幕的高度。而且這經常出現。比如盟重的石墓。 如果不迴圈兩倍的螢幕高度。通常是15*32個

  for nY := -2 to ScreenHeigh div UNITY + 16 do

   則房屋會出現不完全的問題。

   我想改進這種繪製方法實現平滑繪製。

   想法是:先建立一個略大於螢幕寬度和高度的渲染目標。至少左右上下大於兩個座標單位。然後迴圈將Tile圖片畫在此渲染目標上。再將其需要顯示的區域畫在預設目標上。

   這裡需要注意的是傳奇的地磚分為大地磚(96*64個畫素) 和小地磚(48*32個畫素) 分別存放在Tiles 和Smtiles 檔案內。而傳奇的單位座標為 48*32個畫素。也就是說大地磚其實是  包括了4個座標單位的影象。如果渲染的目標座標X,Y並不是2的倍數的話。那麼大地磚就會被取消繪製。所以當碰到X Y為非2的倍數時候 畫大地磚之前一定要將X,Y便宜減小到最鄰近的2的倍數的XY座標 然後將其座標繪製出來。

 或者將畫地圖的單位大小作為2的倍數進行。

  對於MapObject來說 就是指房屋以及燈光這些效果的繪製。房屋的繪製在 TPlayScene.PlayScene 函式裡面。下面主要總結一下要點。

  首先對於繪製區域會執行兩次迴圈。為什麼是兩次 而不是一次?

第一次對於取出來每個座標的紋理會進行判斷 如果其寬高等於 48*32 那麼才會進行普通繪製

       第二次對於取出來每個座標的紋理會進行判斷 。如果其座標需要混合繪製。則不管紋理的大小進行混合繪製。如果紋理不需要混合繪製 那麼紋理寬或高必須不等於48或32

       決定紋理是否需要混合由如下決定

            ani := Map.m_MArr[I, j].btAniFrame;
              if (ani and $80) > 0 then begin
                blend := True; //最高位為1則需要混合繪製
                ani := ani and $7F;
              end;