【问题标题】:Glitch drawing 2D textures毛刺绘制 2D 纹理
【发布时间】:2017-11-11 10:34:03
【问题描述】:

我在绘制额外纹理时遇到问题。
世界应该是这样的:红色方块 = 玩家,绿色部分 = 泥土。

这就是世界的样子:

如您所见,有一些额外的纹理(它们没有碰撞或它们只是在屏幕上绘制的任何东西)

这是我的污垢精灵表:

这是我的绘图代码:

public void DrawStatics(Block[,] blocks)
{

    spriteBatch.Begin(WorldManager.Instance.currentWorld.camera, SpriteSortMode.Deferred, samplerState: SamplerState.PointClamp);
    foreach (Block block in blocks)
    {
        if (block == null || block.id == BlockID.Air) continue;
        spriteBatch.Draw(texture: block.texture, position: block.position, color: Color.White, sourceRectangle: new Rectangle(block.index * 20, 0, block.index * 20 + 20, 20));
    }
    spriteBatch.End();
}

【问题讨论】:

  • 您是否多次绘制东西?比如hitbox?我认为您的 DrawStatics method 没有任何问题会导致这种行为。

标签: c# xna 2d monogame


【解决方案1】:

您根本没有重新绘制蓝色背景;您应该像前景一样经常重新绘制它。

以下 sn-p 暗示了对您的代码的一些假设。

public void DrawStatics(Block[,] blocks)
{
    spriteBatch.Begin(
        WorldManager.Instance.currentWorld.camera,
        SpriteSortMode.Deferred,
        samplerState: SamplerState.PointClamp
    );
    foreach (Block block in blocks)
    {
        if (block != null)
        {
            // Not ignoring BlockID.Air
            spriteBatch.Draw(
                texture: block.texture, // There should be a texture for BlockID.Air...
                position: block.position,
                color: Color.White, // ...or a block.color could be saved as a fallback.
                sourceRectangle: new Rectangle(
                    block.index * 20, 0, block.index * 20 + 20, 20)
            );
        }
    }
    spriteBatch.End();
}

关于编码风格的注意事项:

  • continue 语句会使代码流更难理解;通常不鼓励使用它,如果没有它,您的代码实际上会更短。
  • 长代码行使代码更难阅读。
  • 我建议将 20 放在一个常量 (const int tileSideInPX = 20;) 中:这样可以更轻松地立即编辑,让您的代码更具可读性,而且完全不会影响性能。

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2012-12-20
    • 2015-02-15
    相关资源
    最近更新 更多