2010-11-30 103 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