我目前正在研究XNA游戏原型。我正试图实现游戏世界的等轴测视图(或者它是否有影像?我不确定这个投影的正确术语 - 见图片)。世界应该是由立方形瓷砖制成的基于瓷砖的世界(例如类似于我的世界的世界),并且我试图通过使用精灵在2D中渲染它。XNA等距瓷砖渲染问题
所以我有一个精灵表,包括立方体的顶面,正面和侧面(可见面)。我使用3个不同的调用drawSprite,一个用于顶部,一个用于边,一个用于前部,使用源矩形来选取要绘制的面,并根据目标矩形在屏幕上设置位置转换为从3D世界坐标转换为等轴测图的公式(拼写?)。
(样品精灵: )
这工作好,只要我画脸,但如果我尝试绘制每个块的罚款边缘(如每片网格),我可以看到,我得到一种随机的渲染模式,其中一些线被面部本身覆盖而另一些线不覆盖。
请注意,对于我的世界表现形式,X从左到右,Y在屏幕内到屏幕外,Z从上到下。
在这个例子中,我只使用顶面的边缘。这是我得到的(图片)内容:
我不明白为什么有些线条的显示,有些则不是。 我使用的呈现代码是(注意在这个例子中我只绘制在每个维度的最上层):
/// <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-层试图第一个,所以我保持在第一个循环中的顶面绘图和第二个循环中的边缘高亮显示(我知道,这是低效的,我也应该避免有一个方法调用每个瓷砖绘制它,但我只是试图让它现在工作)。
结果在某种程度上更好,但仍然无法正常运行,顶行缺少,见图片:
的为什么我有这个问题的任何想法?在第一种方法中,它可能是一种z型战斗,但我正在按照精确的顺序绘制精灵,所以不应该覆盖已经存在的东西?
谢谢大家
你在做任何缩放吗? – 2010-11-30 22:33:25