我在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個或更多的圖像不會發生閃爍。這可能是由於第一張圖像沒有足夠快地放回起始位置。但我仍然試圖找出乳清動畫仍然是如此生澀:(
我會使用毫秒,而不是基於時間的運動秒。否則,你會失去很多精度,因爲通常一幀不到一秒鐘。 – dowhilefor 2012-01-13 11:01:23
要使用毫秒,我相信速度必須修改?有關速度應該更新多少的任何想法? – user1147470 2012-01-13 11:41:53
如果將時間除以1000,則將速度除以1000 – annonymously 2012-01-13 12:14:30