2012-01-13 126 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,爲什麼運動似乎不穩定(這在設備上稍微好一些,但是不穩定)。 game.cs類中的IsFixedTimeStep設置爲true。謝謝。

編輯:似乎如果使用3個或更多的圖像不會發生閃爍。這可能是由於第一張圖像沒有足夠快地放回起始位置。但我仍然試圖找出乳清動畫仍然是如此生澀:(

+0

我會使用毫秒,而不是基於時間的運動秒。否則,你會失去很多精度,因爲通常一幀不到一秒鐘。 – dowhilefor 2012-01-13 11:01:23

+0

要使用毫秒,我相信速度必須修改?有關速度應該更新多少的任何想法? – user1147470 2012-01-13 11:41:53

+0

如果將時間除以1000,則將速度除以1000 – annonymously 2012-01-13 12:14:30

回答

0

你不會是第一個報告看到閃爍或口吃。在應用程序中心論壇上有很多帖子關於這一點(很高興你是使用我的教程/樣本的方式尋找運氣)

這裏是別人的報告,你所看到的一個例子! - >http://forums.create.msdn.com/forums/t/30500.aspx

這裏是我見過的迄今爲止從XNA的一個最佳答案框架開發人員 - > http://forums.create.msdn.com/forums/p/9934/53561.aspx#53561

基本上你已經偶然發現到「一個」的解決方案,但正如肖恩的帖子所指出的那樣,解決這個問題的方法有很多種,它只取決於遊戲的正確性。