xnadevelopment.comのバックグラウンドスクロールチュートリアル(自分の要件に合わせて変更)を使用して、Windows Phone 7.1でゲームの垂直スクロールループを作成しています。次の画像が描かれるたびに、背景がちらついているようです。私はループのための単一のイメージを使用していますが、複数のイメージが使用されても、ちらつきが発生します。私は画面の上部に発生するちらつきを示すYouTubeビデオを投稿しました。以下はXNAのスクロールバックグラウンドフリッカー
http://youtu.be/Ajdiw2zILq0 ループを作成するために使用するコードです:
背景クラス:
private List<string> _road;
private VericalBackgroundLoop _roadLoop;
private readonly Vector2 _roadSpeed = new Vector2(0, 300);
public void LoadContent(ContentManager contentManager)
{
_road = new List<string>
{
"Test\\Road_Bgnd",
"Test\\Road_Bgnd"
};
_roadLoop = new VericalBackgroundLoop();
_roadLoop.Initialize(_road, contentManager, Vector2.Zero, true);
}
public void Update(TimeSpan elapsedTime)
{
_roadLoop.Update(_roadSpeed, elapsedTime);
}
public void Draw(SpriteBatch spriteBatch)
{
_roadLoop.Draw(spriteBatch);
}
背景ループクラス:
private List<Sprite> _sprites;
private bool _isLoopDirectionTopToBottom;
private Vector2 _loopDirection;
public void Initialize(List<string> spriteNames, ContentManager contentManager, Vector2 loopStartPosition, bool isLoopDirectionTopToBottom)
{
_sprites = new List<Sprite>();
_isLoopDirectionTopToBottom = isLoopDirectionTopToBottom;
_loopDirection = new Vector2(0, -1);
// Build the sprite object's list
foreach (string spriteName in spriteNames)
{
Sprite sprite = new Sprite();
sprite.LoadContent(contentManager, spriteName);
_sprites.Add(sprite);
}
if (_isLoopDirectionTopToBottom)
{
// Set the initial position for the sprite objects
foreach (Sprite currentSprite in _sprites)
{
if (currentSprite == _sprites.First())
{
currentSprite.Position = loopStartPosition;
}
else
{
Sprite prevSprite = GetSpriteAtIndex(_sprites.IndexOf(currentSprite) - 1);
currentSprite.Position = new Vector2(0, prevSprite.Position.Y - prevSprite.Size.Height);
}
}
}
}
public void Update(Vector2 loopSpeed, TimeSpan elapsedTime)
{
if (_isLoopDirectionTopToBottom)
{
foreach (Sprite currentSprite in _sprites)
{
if (currentSprite == _sprites.First())
{
Sprite lastSprite = _sprites.Last();
if (currentSprite.Position.Y > (currentSprite.Size.Height))
{
currentSprite.Position.Y = lastSprite.Position.Y - lastSprite.Size.Height;
}
}
else
{
Sprite prevSprite = GetSpriteAtIndex(_sprites.IndexOf(currentSprite) - 1);
if (currentSprite.Position.Y > (currentSprite.Size.Height))
{
currentSprite.Position.Y = prevSprite.Position.Y - prevSprite.Size.Height;
}
}
// Update the sprite X position with the speed and time
currentSprite.Position -= _loopDirection * loopSpeed * (float)elapsedTime.TotalSeconds;
}
}
}
public void Draw(SpriteBatch spriteBatch)
{
foreach (Sprite sprite in _sprites)
{
sprite.Draw(spriteBatch);
}
}
private Sprite GetSpriteAtIndex(int index)
{
return _sprites[index];
}
私が把握で助けを必要となぜフリッカーが起こっているのかgの動きと動きが滑らかではないように見える(これはデバイス上では少し良いが、それにもかかわらず)。 IsFixedTimeStepは、game.csクラスではtrueに設定されています。ありがとうございました。
EDIT: 3つ以上の画像が使用されている場合、ちらつきが発生していないようです。これは、最初の画像が開始位置に十分迅速に戻されないことが原因である可能性があります。しかし、まだ乳白色がまだまだかわいいのを把握しようとしています。(
時間ベースの動きでは秒単位ではなく、ミリ秒単位を使用します。さもなければ、通常フレームが1秒未満しかかからないので、多くの精度が失われます。 – dowhilefor
ミリ秒を使用するには、速度を変更しなければならないと思いますか?どのくらいの速度を更新する必要がありますか? – user1147470
時間を1000分の1に分割するだけで、速度を1000分の1に割ります。 – annonymously