2010-11-30 99 views
0

我目前正在研究XNA遊戲原型。我正試圖實現遊戲世界的等軸測視圖(或者它是否有影像?我不確定這個投影的正確術語 - 見圖片)。世界應該是由立方形瓷磚製成的基於瓷磚的世界(例如類似於我的世界的世界),並且我試圖通過使用精靈在2D中渲染它。XNA等距瓷磚渲染問題

所以我有一個精靈表,包括立方體的頂面,正面和側面(可見面)。我使用3個不同的調用drawSprite,一個用於頂部,一個用於邊,一個用於前部,使用源矩形來選取要繪製的面,並根據目標矩形在屏幕上設置位置轉換爲從3D世界座標轉換爲等軸測圖的公式(拼寫?)。

(樣品精靈: Sprite

這工作好,只要我畫臉,但如果我嘗試繪製每個塊的罰款邊緣(如每片網格),我可以看到,我得到一種隨機的渲染模式,其中一些線被面部本身覆蓋而另一些線​​不覆蓋。

請注意,對於我的世界表現形式,X從左到右,Y在屏幕內到屏幕外,Z從上到下。

在這個例子中,我只使用頂面的邊緣。這是我得到的(圖片)內容:

alt text

我不明白爲什麼有些線條的顯示,有些則不是。 我使用的呈現代碼是(注意在這個例子中我只繪製在每個維度的最上層):

/// <summary> 
/// Draws the world 
/// </summary> 
/// <param name="spriteBatch"></param> 
public void draw(SpriteBatch spriteBatch) 
{ 
    Texture2D tex = null; 

    // DRAW TILES 
    for (int z = numBlocks - 1; z >= 0; z--) 
    { 
     for (int y = 0; y < numBlocks; y++) 
     { 
      for (int x = numBlocks - 1; x >=0 ; x--) 
      { 

       myTextures.TryGetValue(myBlockManager.getBlockAt(x, y, z), out tex); 
       if (tex != null) 
       { 
        // TOP FACE 
        if (z == 0) 
        { 
         drawTop(spriteBatch, x, y, z, tex); 
         drawTop(spriteBatch, x, y, z, outlineTexture); 
        } 

        // FRONT FACE 
        if(y == numBlocks -1) 
         drawFront(spriteBatch, x, y, z, tex); 

        // SIDE FACE 
        if(x == 0) 
         drawSide(spriteBatch, x, y, z, tex); 

       } 
      } 
     } 
    } 
} 


private void drawTop(SpriteBatch spriteBatch, int x, int y, int z, Texture2D tex) 
     { 
      int pX = OffsetX + (int)(x * TEXTURE_TOP_X_OFFRIGHT + y * TEXTURE_SIDE_X); 
      int pY = OffsetY + (int)(y * TEXTURE_TOP_Y + z * TEXTURE_FRONT_Y); 
      topDestRect.X = pX; 
      topDestRect.Y = pY; 
      spriteBatch.Draw(tex, topDestRect, TEXTURE_TOP_RECT, Color.White); 
     } 

我使用了不同的方法,創建嵌套for循環之後的第二3-層試圖第一個,所以我保持在第一個循環中的頂面繪圖和第二個循環中的邊緣高亮顯示(我知道,這是低效的,我也應該避免有一個方法調用每個瓷磚繪製它,但我只是試圖讓它現在工作)。

結果在某種程度上更好,但仍然無法正常運行,頂行缺少,見圖片:

alt text

的爲什麼我有這個問題的任何想法?在第一種方法中,它可能是一種z型戰鬥,但我正在按照精確的順序繪製精靈,所以不應該覆蓋已經存在的東西?

謝謝大家

+0

你在做任何縮放嗎? – 2010-11-30 22:33:25

回答

1

哇,對不起,我是白癡:)我開始與SpriteBatch.begin(SpriteSortMode.BackToFront)的批處理,但我沒有使用任何z值在繪製。 我應該使用SpriteSortMode.Deferred!它現在工作正常。感謝大家!

0

嘗試通過1首或2個像素調整您的源和目標矩形的尺寸。我有一個偷偷摸摸的懷疑,這與這些矩形的處理方式有關,它們被當作要渲染的區域的「輪廓」,以及某種錯綜複雜的問題。這不是專家的建議,只是一個編碼人的直覺。

0

看起來像是一個子像素精度或縮放問題。另外,請儘量確保您的紋理/貼圖寬度/高度是2(32,64,128等)的冪,因爲這可能會使效果不那麼糟糕。這些照片真的很難說。

我不知道如何縮放一切,但應儘量避免舍入(特別是在您的drawTop()方法中)。每次你繞一些位置/座標機會都很好時,你可能會增加誤差/隨機偏移量。嘗試使用double(或更好:float)座標而不是整數。

+0

現在我正在使用1:1的比例,如果我改變了它,我會在某些特定比例下運行某些工件(即塊「錯過」給定線中的某個像素),但是否則可以。它似乎也只能將矩形原點設置爲一個int值? – Marco83 2010-11-30 22:59:15