XNA中的无限滚动背景

时间:2011-12-02 06:32:06

标签: c# xna 2d

我在这样的侧面平台上绘制了一个地面纹理:

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

仍有一些问题。

This is the start This is the issue now with the camera matrix.

第二次编辑

它刚来找我。我把地面上的视差设置为1。它应该为0,以便它实际上不会移动。当你使用我在下面选择的答案时,它看起来就像是在移动。

谢谢!

2 个答案:

答案 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;
}