熱血傳奇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;

 

     


             

   

   

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章