XNA中的滚动背景闪烁

本文关键字:背景 闪烁 滚动 XNA | 更新日期: 2023-09-27 18:20:15

我正在使用xnadevelopment.com上的背景滚动教程(根据我的要求进行了修改)为windows phone 7.1上的游戏创建垂直滚动循环。每当绘制下一幅图像时,背景似乎都在闪烁。虽然我在循环中使用单个图像,但即使使用多个图像,也会出现闪烁。我在youtube上发布了一段视频,显示屏幕顶部出现的闪烁。

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];
    }

我需要帮助弄清楚为什么会出现闪烁,以及为什么运动看起来不平稳(在设备上效果更好,但仍然不平稳)。在game.cs类中,IsFixedTimeStep设置为true。非常感谢。

编辑:如果使用3个或更多图像,则似乎不会出现闪烁。这可能是由于第一个图像没有足够快地放回到起始位置。但我仍在努力弄清楚为什么动画仍然如此不连贯:(

XNA中的滚动背景闪烁

你不会是第一个报告看到闪烁或口吃的人。App Hub论坛上有很多关于这方面的帖子。(很高兴你在使用我的教程/样本时运气不错!)

下面是一个有人报告您所看到的情况的示例->http://forums.create.msdn.com/forums/t/30500.aspx

这是迄今为止我从一位XNA Framework开发人员那里看到的最好的答案->http://forums.create.msdn.com/forums/p/9934/53561.aspx#53561

基本上,你已经偶然找到了"一个"解决方案,但正如肖恩的帖子所指出的,有多种方法可以解决这个问题,这取决于什么适合你的游戏。