Анимация SpriteSheet с помощью XNA - PullRequest
1 голос
/ 01 декабря 2011

Я работаю над своей первой 2D-игрой с XNA, и у меня есть небольшая проблема.Чтобы придать работающий эффект моему Sprite, я прокручиваю 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 секунд, а иногда даже при загрузке!Есть идеи почему?Спасибо заранее и дайте мне знать, если вам нужны какие-либо другие части кода

1 Ответ

1 голос
/ 02 декабря 2011

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

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

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

...