Анимация SpriteSheet с помощью XNA

Я работаю над своей первой 2D-игрой с XNA, и у меня есть небольшая проблема. Чтобы придать спрайту бегущий эффект, я прокручиваю SpriteSheet с помощью этого кода (работает вправо):

    if (AnimationDelay == 6)
            {

                if (CurrentFrameR.X < SheetSizeR.X)
                {
                    ++CurrentFrameR.X;
                }
                else
                {
                    CurrentFrameR.Y++;
                    CurrentFrameR.X = 1;
                }
                if (CurrentFrameR.Y >= SheetSizeR.Y)
                {
                    CurrentFrameR.X = 0;
                    CurrentFrameR.Y = 0;
                }

                AnimationDelay = 0;
            }
            else
            {
                AnimationDelay += 1;
            }

            xPosition += xDeplacement;


        }

И это используемые объекты:

    Point FrameSizeR = new Point(29, 33);
    Point SheetSizeR = new Point(5, 1);
    Point CurrentFrameR = new Point(0, 0);
    int AnimationDelay = 0;

У меня есть тот же код с другим SpriteSheet, когда спрайт работает влево. Все работает нормально, я бы сказал, что в 90% случаев, но в других 10% анимация спрайтов остается на одном кадре SpriteSheet в обоих направлениях (влево и вправо) и остается неподвижной, пока я закройте программу. Дело в том, что я не могу понять, почему, поскольку это никогда не происходит в один и тот же момент. Иногда через 10, 15, 30 секунд, а иногда даже при загрузке! Есть идеи, почему? Заранее спасибо и дайте мне знать, если вам нужны какие-либо другие части кода


person phadaphunk    schedule 01.12.2011    source источник


Ответы (1)


Ваш код можно переписать следующим образом:

ElapsedTimeFrame += (float) GameTime.ElapsedTime.TotalSeconds;

if (ElapsedTimeFrame >= TimePerFrame)
{
    CurrentFrameR.X = (CurrentFrameR.X + 1) % SheetSizeR.X;

    if (CurrentFrameR.X == 0)
    {
       CurrentFrameR.Y = (CurrentFrameR.Y + 1) % SheetSizeR.Y;
    }

    ElapsedTimeFrame-= TimePerFrame;
}

Но вам нужно показать больше кода, чтобы догадаться, что происходит...

person Blau    schedule 01.12.2011