毛刺绘制2D纹理

时间:2017-11-11 10:34:03

标签: c# xna 2d monogame

我在绘制额外纹理时遇到问题。
这就是世界应该是这样的:红色方块=玩家,绿色部分=污垢 world in Paint.NET

这就是世界的样子:
world ingame

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

这是我的污垢精灵表:
dirt sprite sheet

这是我的绘图代码:

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();
}

1 个答案:

答案 0 :(得分:1)

您根本不会重新绘制蓝色背景;您应该尽可能多地重绘它。

以下代码段暗含一些有关您的代码的假设。

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;)中:它将使一次编辑变得更容易,它将使您的代码更具可读性,并且完全不会影响性能。