Прокрутка фона мерцания в XNA - PullRequest
1 голос
/ 13 января 2012

Я использую учебник по фоновой прокрутке на 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];
    }

Мне нужна помощь в выяснении, почему возникает мерцание и почему движение кажется прерывистым, а не плавным (на устройстве это немного лучше, но, тем не менее, прерывисто). IsFixedTimeStep имеет значение true в классе game.cs. Спасибо.

РЕДАКТИРОВАТЬ: Похоже, мерцание не происходит, если используются 3 или более изображений. Это может быть связано с тем, что первое изображение недостаточно быстро возвращается в исходное положение. Но я все еще пытаюсь выяснить, почему анимация все еще такая резкая: (

1 Ответ

0 голосов
/ 29 января 2012

Вы не будете первым, кто сообщит о появлении мерцаний или заиканий.Множество сообщений на форумах App Hub об этом.(рад, что вам повезло, используя мои уроки / образцы, кстати!)

Вот пример того, как кто-то сообщил, что вы видите -> http://forums.create.msdn.com/forums/t/30500.aspx

И вот лучший ответЯ видел на сегодняшний день одного из разработчиков XNA Framework -> http://forums.create.msdn.com/forums/p/9934/53561.aspx#53561

По сути, вы наткнулись на «а» решение, но, как отмечается в посте Шона, существует множество способов решения проблемы., это зависит только от того, что подходит для вашей игры.

...