我在这样的侧面平台上绘制了一个地面纹理:
spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, _camera.GetViewMatrix(Parallax));
foreach (Sprite sprite in Sprites)
sprite.Draw(spriteBatch);
spriteBatch.End();
在Sprite.Draw()
中 public void Draw(SpriteBatch spriteBatch)
{
if (Texture != null)
spriteBatch.Draw(Texture, Position, new Rectangle(0, 0, Texture.Width, Texture.Height), Color.White, Rotation, Origin, Scale, SpriteEffects.None, ZIndex);
}
如何让纹理在X方向无限重复?
任何解释如何执行此操作的资源都会很棒。谢谢!
我的相机实现基于:http://www.david-gouveia.com/2d-camera-with-parallax-scrolling-in-xna/
这就是我尝试过的,我为此背景做了一个单独的抽奖:
//Draw Background
spriteBatch.Begin(SpriteSortMode.Immediate, null, SamplerState.LinearWrap, null, null,null, camera.GetViewMatrix(Vector2.One));
groundSprite.Draw(spriteBatch, (int)camera.Position.X - (int)camera.Origin.X / 2);
spriteBatch.End();
并在Sprite.Draw()中:
public void Draw(SpriteBatch spriteBatch, int scrollX = 0)
{
if (Texture != null)
spriteBatch.Draw(Texture, Position, new Rectangle(scrollX, 0, Texture.Width, Texture.Height), Color.White, Rotation, Origin, Scale, SpriteEffects.None, ZIndex);
}
仍有一些问题。
它刚来找我。我把地面上的视差设置为1。它应该为0,以便它实际上不会移动。当你使用我在下面选择的答案时,它看起来就像是在移动。
谢谢!
答案 0 :(得分:6)
不要在空间中滚动精灵;滚动用于渲染它的纹理坐标。
设置您的采样器以包裹其UV坐标:
spriteBatch.Begin(..., SamplerState.LinearWrap, ...);
然后在渲染时指定源矩形:
var source = new Rectangle(scrollX, 0, texture.Width, texture.Height);
spriteBatch.Draw(texture, destination, source, Color.White);
如果生成的UV坐标从纹理边缘脱落,它们将被纹理采样器包裹,这将为您提供所需的“滚动”效果。
答案 1 :(得分:0)
在Sprite Draw方法中绘制两次背景,但偏移其中一个,类似这样(未经测试):
spriteBatch.Draw(Texture, Position, new Rectangle(0, 0, Texture.Width, Texture.Height), Color.White, Rotation, Origin, Scale, SpriteEffects.None, ZIndex);
spriteBatch.Draw(Texture, Position-new Vector2(Texture.Width, 0), new Rectangle(0, 0, Texture.Width, Texture.Height), Color.White, Rotation, Origin, Scale, SpriteEffects.None, ZIndex);
然后在更新方法中:
if (Position.X > Texture.Width) {
Position.X -= Texture.Width;
}
else if (Position.X < 0) {
Position.X += Texture.Width;
}