我将在我的MonoGame项目中使用SpriteBatch来呈现一个瓦片地图。
以下是渲染代码:
如您所见,我正在使用
以下是渲染代码:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
SpriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, null, CameraManager.pInstance.pFinalTransform);
foreach( TmxLayer Layer in mCurrentTileMap.Layers)
{
for (int y = 0; y < mCurrentTileMap.Height; y++)
{
for (int x = 0; x < mCurrentTileMap.Width; x++)
{
TmxLayerTile Tile = Layer.Tiles[mCurrentTileMap.Width * y + x];
int TileID = -1;
Texture2D Texture = FindTileMapTextureForTileID(Tile.Gid, out TileID);
if (TileID > 0)
{
int atlasX = TileID % (Texture.Width / TileSize);
int atlasY = TileID / (Texture.Width / TileSize);
SpriteEffects FX = SpriteEffects.None;
if (Tile.HorizontalFlip)
{
FX = SpriteEffects.FlipHorizontally;
}
SpriteBatch.Draw(Texture, new Vector2(x * TileSize, y * TileSize), new Microsoft.Xna.Framework.Rectangle(atlasX * TileSize, atlasY * TileSize, TileSize, TileSize), Color.White, 0, Vector2.Zero, 1, FX, 0);
}
}
}
}
以下是我认为重要的代码行:
SpriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp,
null, null, null, CameraManager.pInstance.pFinalTransform);
SpriteBatch.Draw(Texture, new Vector2(x * TileSize, y * TileSize),
new Microsoft.Xna.Framework.Rectangle(atlasX * TileSize, atlasY * TileSize, TileSize, TileSize),
Color.White, 0, Vector2.Zero, 1, FX, 0);
如您所见,我正在使用
SamplerState.PointClamp
。然而,当我在世界中移动时,偶尔会看到下面一些瓷砖的单像素线,这些线是精灵图集中它下面的像素。
我非常确定这是因为应用于精灵批处理(CameraManager.pInstance.pFinalTransform
)的变换使用了浮点精度。如果我强制将该变换的比例部分夹紧到整数,就不会出现问题。但是,这样做会导致相机运动非常抖动(我的游戏被放大了很多,因此每个像素在显示器上约占10个像素),所以这不是一个好的解决方案。
有什么想法可以避免这种效果吗?
以下是源纹理精灵表的参考图像。