使用 XNA/Monogame 从 spritesheet 中绘制一个 sprite

Posted

技术标签:

【中文标题】使用 XNA/Monogame 从 spritesheet 中绘制一个 sprite【英文标题】:Drawing a sprite from a spritesheet using XNA/Monogame 【发布时间】:2018-03-14 04:10:34 【问题描述】:

我有一个包含 2 个精灵的精灵表。每个精灵是 40x60。图像的总尺寸为 40x120。 它看起来像这样(红线是第一个精灵的一部分)。稍后我会告诉你我为什么添加它。

似乎由于某种原因,当尝试绘制第二个精灵时,它总是会占用前一个精灵的最后一行。我画了那条红线来说明这一点。

这是我绘制第二个精灵的代码:

Rectangle rect = new Rectangle(0, 60, 40, 60); // Choose 2nd sprite
Vector2 pos = new Vector2(100, 100);
Vector2 origin = new Vector2(0, 0);

spriteBatch.Begin();
spriteBatch.Draw(mSpriteTexture, pos , rect, Color.White, 0.0f, origin, 6, SpriteEffects.None, 0.0f);
spriteBatch.End();

这就是我运行程序时的样子:

任何想法我做错了什么?

注意:在本例中,我使用的是 scale=6。我这样做是因为似乎当 scale > 1 时这个问题总会发生。如果 scale = 1,它似乎不会一直发生。

【问题讨论】:

在选择第二个精灵时,您是否尝试过在 Rectangle Y 位置使用 61? 那行不通。精灵重叠得更多。 这里讨论了这个问题并提供了一些可能的解决方案:gamedev.stackexchange.com/questions/45764/… 您是否尝试使用destinationRectangle 而非缩放来使用spriteBatch 进行绘制?不保证修复,只是建议您尝试一下,看看它是否有效。 Monacraft,感谢您的链接和建议。它提供了一些新的想法来尝试,但似乎作者从未找到解决方案。我已经尝试过其中的大部分。使用 PointClamp 改善了很多,但问题仍然时有发生。我最终添加了一些瓷砖空间,问题就消失了。不是最好的解决方案,但我现在修好了。 【参考方案1】:

有同样的问题。在我的 spriteBatch.Begin 中使用 SamplerState.PointClamp - 调用修复它

看起来像这样:(MonoGame 3.6 tho)

SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, viewMatrix);

【讨论】:

以上是关于使用 XNA/Monogame 从 spritesheet 中绘制一个 sprite的主要内容,如果未能解决你的问题,请参考以下文章

XNA,Monogame;有没有XACT的替代品?

在XNA / Monogame中使用Ray的视线

XNA(MonoGame)零异常

XNA(Monogame)我需要一种简短的碰撞方式

从原始 RGBa 数据创建 Sprite

有啥方法可以从 CSS 中使用 SVG Sprite?