2012-01-13 13 views
1

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つ以上の画像が使用されている場合、ちらつきが発生していないようです。これは、最初の画像が開始位置に十分迅速に戻されないことが原因である可能性があります。しかし、まだ乳白色がまだまだかわいいのを把握しようとしています。(

+0

時間ベースの動きでは秒単位ではなく、ミリ秒単位を使用します。さもなければ、通常フレームが1秒未満しかかからないので、多くの精度が失われます。 – dowhilefor

+0

ミリ秒を使用するには、速度を変更しなければならないと思いますか?どのくらいの速度を更新する必要がありますか? – user1147470

+0

時間を1000分の1に分割するだけで、速度を1000分の1に割ります。 – annonymously

答えて

0

あなたは、ちらつきや吃音を最初に報告することはまずありません。途中で私のチュートリアル/サンプルを使用して運を見つける)ここで

はあなたが見ているものを報告して誰かの例だ - !> http://forums.create.msdn.com/forums/t/30500.aspx

をそしてここで私は、XNAの1から現在までに見た中で最高の答えですフレームワークのデベロッパー - > http://forums.create.msdn.com/forums/p/9934/53561.aspx#53561

基本的にあなたはつまずきましたShawnのポストは問題を解決するさまざまな方法があることを指摘しているので、それはあなたのゲームに何が正しいかだけに依存しています。