理论
使用 XNA SpriteBatch类可以轻松实现滚动背景图像。Draw方法有几个重载,可以让调用者指定源矩形。此源矩形定义了在屏幕上绘制到指定目标矩形的纹理部分:
更改源矩形的位置将更改目标矩形中显示的纹理部分。
为了让精灵覆盖整个屏幕,请使用以下目标矩形:
var destination = new Rectangle(0, 0, screenWidth, screenHeight);
如果应该显示整个纹理,请使用以下目标矩形:
var source = new Rectangle(0, 0, textureWidth, textureHeight);
您所要做的就是为源矩形的 X 和 Y 坐标设置动画,然后就完成了。
嗯,差不多完成了。即使源矩形移出纹理区域,纹理也应该重新开始。为此,您必须设置一个使用纹理包装的SamplerState。幸运的是,SpriteBatch 的Begin方法允许使用自定义 SamplerState。您可以使用以下方法之一:
// Either one of the three is fine, the only difference is the filter quality
SamplerState sampler;
sampler = SamplerState.PointWrap;
sampler = SamplerState.LinearWrap;
sampler = SamplerState.AnisotropicWrap;
例子
// Begin drawing with the default states
// Except the SamplerState should be set to PointWrap, LinearWrap or AnisotropicWrap
spriteBatch.Begin(
SpriteSortMode.Deferred,
BlendState.Opaque,
SamplerState.AnisotropicWrap, // Make the texture wrap
DepthStencilState.Default,
RasterizerState.CullCounterClockwise
);
// Rectangle over the whole game screen
var screenArea = new Rectangle(0, 0, 800, 600);
// Calculate the current offset of the texture
// For this example I use the game time
var offset = (int)gameTime.TotalGameTime.TotalMilliseconds;
// Offset increases over time, so the texture moves from the bottom to the top of the screen
var destination = new Rectangle(0, offset, texture.Width, texture.Height);
// Draw the texture
spriteBatch.Draw(
texture,
screenArea,
destination,
Color.White
);