Infinite Scrolling Background in XNA

狂风中的少年 提交于 2019-12-22 13:05:08

问题


I'm drawing a ground texture in a sidescrolling platformer like this:

spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, _camera.GetViewMatrix(Parallax));
foreach (Sprite sprite in Sprites)
     sprite.Draw(spriteBatch);
spriteBatch.End();

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

How can I get the texture to repeat in the X Direction infinitely?

Any resources explaining how to do this would be great. Thanks!

My implementation of camera is based on this: http://www.david-gouveia.com/2d-camera-with-parallax-scrolling-in-xna/

EDIT

This is what I tried, I made a separate draw for the background like this:

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

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

still have some issues.

Second Edit

It just came to me. I had the parallax set to 1 on the ground. It should be 0 so that it never actually moves. It just looks like it moves when you use the answer I selected below.

Thanks!


回答1:


Don't scroll the sprite in space; scroll the texture coordinates used to render it.

Set your sampler to wrap its UV coordinates:

spriteBatch.Begin(..., SamplerState.LinearWrap, ...);

Then specify a source rectangle when rendering:

var source = new Rectangle(scrollX, 0, texture.Width, texture.Height);
spriteBatch.Draw(texture, destination, source, Color.White);

If the resulting UV coordinates fall off the edge of the texture, they will wrapped by the texture sampler, which should give you the desired "scrolling" effect.




回答2:


Draw the background twice in the Sprite Draw method, but offset one of them, something like this (untested):

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

And then in the update method:

if (Position.X > Texture.Width) {
    Position.X -= Texture.Width;
}
else if (Position.X < 0) {
    Position.X += Texture.Width;
}


来源:https://stackoverflow.com/questions/8352587/infinite-scrolling-background-in-xna

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!