仮説
スクロールする背景画像は、XNA SpriteBatchクラスを使用して簡単に実装できます。Drawメソッドには、呼び出し元がソース四角形を指定できるオーバーロードがいくつかあります。このソース四角形は、画面上の指定された宛先四角形に描画されるテクスチャのセクションを定義します。
ソース矩形の位置を変更すると、宛先矩形に表示されるテクスチャのセクションが変更されます。
スプライトが画面全体を覆うようにするには、次の宛先長方形を使用します。
var destination = new Rectangle(0, 0, screenWidth, screenHeight);
テクスチャ全体を表示する必要がある場合は、次の宛先長方形を使用します。
var source = new Rectangle(0, 0, textureWidth, textureHeight);
ソース矩形の X 座標と Y 座標をアニメーション化するだけで完了です。
さて、ほぼ完了しました。ソースの四角形がテクスチャ領域の外に移動した場合でも、テクスチャは再び開始する必要があります。これを行うには、 texture wrapを使用する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
);