【问题标题】:Superposition problem with 2D Sprites (XNA)2D Sprites (XNA) 的叠加问题
【发布时间】:2011-01-02 15:52:33
【问题描述】:

这可能是一个菜鸟问题,但在这里......

我正在使用带有 XNA Framework (3.1) 的 Visual Studio,我只会为我的游戏绘制 2D 精灵,这里是主类中的 Draw Method:

GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
            background.Draw(this.spriteBatch);
            player1.Draw(this.spriteBatch);
            player2.Draw(this.spriteBatch);
            spriteBatch.End();
            base.Draw(gameTime);

问题是 player2 与 player1 重叠(因为他是在之后绘制的),我希望最后绘制 2 个玩家中最低的一个(按他们的位置)(以模拟深度)。

提前致谢! (对不起我的英语,我是法国人……)

【问题讨论】:

  • 我想你说的是 DepthBuffer?我真的不知道怎么用,我补充说: spriteBatch.GraphicsDevice.RenderState.DepthBufferEnable = true;它没有改变任何东西。我一定是用错了方法……

标签: xna 2d sprite


【解决方案1】:

SpriteBatch.Draw 方法有一个重载,它提供了一个“layerDepth”参数(从 0 表示正面,1 表示背面)。您可以设置单个精灵的 layerDepth 并在 SpriteBatch.Begin 方法中使用 spriteSortMode.BackToFront。

【讨论】:

  • 好的,我想这就是我要搜索的内容,但是如何访问/设置这个“layerDepth”?
  • 为每个精灵创建一个浮点变量,并将变量设置为您希望放置相关精灵的任何值(深度方向)。然后将此变量作为参数插入到 Draw() 方法的重载中。您用于设置变量的逻辑将取决于您的游戏设计需求,但是无论您想要在后面使用哪个精灵,都将其变量设置为接近 1,无论您想要哪个在前面,都将它们的变量设置为接近 0。不要忘记在 Begin() 方法中设置排序模式。
【解决方案2】:

好的,感谢史蒂夫,我做到了。 我刚刚将我的播放器 SpriteBatch.Draw 方法更改为 SpriteBatch.Draw(X,X,(...),layerDepth) layerDepth 会随着玩家的 Y 位置而更新。 不得不使用 spriteSortMode.FrontToBack:因为原点位于左上角,所以一切都颠倒了。 谢谢!

【讨论】:

  • 这应该是一条评论
【解决方案3】:

史蒂夫的答案可能是最简单的,但有时立即绘制是有利的。 另一种方法是根据 Y 轴对列表中的玩家和对象进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多