C# C:XNA4:X轴上的SpriteSortMode随机排序?

C# C:XNA4:X轴上的SpriteSortMode随机排序?,c#,xna-4.0,C#,Xna 4.0,我正在制作一个基于瓷砖/精灵的游戏,通过 public void Draw(SpriteBatch spriteBatch) { DrawBehind(spriteBatch); DrawEven(spriteBatch); DrawInFront(spriteBatch); } private void DrawBehind(SpriteBatch spriteBatch) { spriteBat

我正在制作一个基于瓷砖/精灵的游戏,通过

public void Draw(SpriteBatch spriteBatch)
    {
        DrawBehind(spriteBatch);
        DrawEven(spriteBatch);
        DrawInFront(spriteBatch);
    }

    private void DrawBehind(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin();
        ActiveMap.DrawAtDepth(spriteBatch, Player, 1);
        spriteBatch.End();
    }

    private void DrawEven(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin(SpriteSortMode.BackToFront, null);
        ActiveMap.DrawAtDepth(spriteBatch, Player, -1);
        Player.Draw(spriteBatch);
        spriteBatch.End();
    }

    private void DrawInFront(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin();
        ActiveMap.DrawAtDepth(spriteBatch, Player, 0);
        spriteBatch.End();
    }
正如预期的那样,DrawBehind和DrawInFront只是根据它们被调用的顺序进行绘制,在X和Y上都是稳定和良好的

DrawEven在Y轴上正确排序,但在X轴上,精灵似乎无缘无故地前后翻转

如果它是稳定的,我真的不在乎它按什么顺序排序。相反,每次我移动我的角色时,除了我的角色之外,所有精灵的位置都会闪烁和切换。有人知道这是什么原因或如何修复吗

按要求

编辑:

地图:

面积:

瓷砖:


此外,欢迎您提供相关的一般提示。我是一个非常新的程序员,风格设计技巧很受欢迎。

spritebatch Begin and End的想法是尽量减少对它的调用量,以提高性能,因此有一点很简单,即2个之间的所有内容都将按顺序绘制。将代码更改为:

spriteBatch.Begin();
DrawBehind(spriteBatch);
DrawEven(spriteBatch);
DrawInFront(spriteBatch); 
spriteBatch.End();
并删除这些函数中Begin和End的所有实例


如果这没有帮助,请检查ActiveMap.DrawAtDepth的工作原理,但在任何情况下都会提高您的程序效率。

我对最新的XNA 4不太熟悉,因此这可能不是正确的答案,但是:

从您描述的症状以及仅当您设置BackToFront SpriteSortMode时才会发生的事实来看,我认为您要么没有为抽屉中绘制的某些精灵设置深度坐标,要么没有使它们变得足够不同。因此,我认为它试图覆盖正常的延迟渲染顺序,但没有足够的深度信息,只是在每个帧中选择任意顺序,可能是因为浮点不准确?不确定,但似乎有可能

既然您提到它在Y轴上正确排序,那么假设您使用Y坐标作为层深度的输入,请尝试添加少量的X坐标。假设屏幕上有32×32个平铺,我会计算层深度浮点值,如下所示:

float depth = (someSprite.ScreenYCoord / 32) + (someSprite.ScreenXCoord / 1025);
spriteBatch.Draw(texture, position, sourceRect, color, rotation, origin, scale, spriteEffects, depth);
其中1025为32*32+1,以确保在排序时,Y方向上的1个分片的差异始终比X方向上的32个分片的差异更重要,并且假设屏幕坐标系为零,其中任何轴上的分片0到31上都可以有某些内容


据我所知,ActiveMap.DrawAtDepth不是XNA库函数。请给我们看一下代码,或者在其他任何地方给我们看一下对SpriteBatch.Draw的实际调用-这将帮助人们了解到底发生了什么,希望这意味着我们必须少猜一点。

谢谢您的回复。我之所以加入三个SpriteBatch,是为了让“Behind”和“InFront”调用不必使用SpriteSortMode,它们不需要排序,只需在后面和前面绘制即可。问题更多的是付款人的提款被错误地排序,或者看起来是随机的。效率很好~我添加了其余的代码。地图调用区域,这是九个当前活动的地图。Area精确计算要绘制的瓷砖,并要求所述标高在这些位置绘制瓷砖。一个关卡由多个图层组成,并且这些图层有一个由瓷砖组成的网格。添加一个小的X坐标值似乎确实解决了这个问题。多谢各位!很高兴听到你已经开始工作了!最后一点意见-如果问题再次出现在一个特别大的级别上,数千个瓦片乘以数千个瓦片,可能是深度值的精度不够,此时您可能必须切换到屏幕空间坐标,而不是世界空间。
public void Draw(SpriteBatch spriteBatch, Vector2 tile, Vector2 drawPosition, Color color, bool transparent = false)
    {
        if (_grid[(int)tile.X, (int)tile.Y] == null) return;
        _grid[(int)tile.X, (int)tile.Y].Draw(spriteBatch, drawPosition, color, transparent, (Depth != -1) ? Depth : Area.GetDepth(Level.Height + tile.Y));
    }
public override void Draw(SpriteBatch spriteBatch, Vector2 drawPosition, Color color, bool transparent = false, float depth = 0)
    {
        if (!GameMain.ScreenRectangle.Intersects(_sprite.Bounds)) return;

        if (transparent && _fade)
            color = new Color(255, 255, 255, 100);

        spriteBatch.Draw(
            _sprite,
            drawPosition,
            null,
            color,
            0,
            new Vector2(_sprite.Width / 2 - Width / 2, _sprite.Height),
            1,
            SpriteEffects.None,
            depth
            );
    }
spriteBatch.Begin();
DrawBehind(spriteBatch);
DrawEven(spriteBatch);
DrawInFront(spriteBatch); 
spriteBatch.End();
float depth = (someSprite.ScreenYCoord / 32) + (someSprite.ScreenXCoord / 1025);
spriteBatch.Draw(texture, position, sourceRect, color, rotation, origin, scale, spriteEffects, depth);