2013-03-22 2 views
0

Я пишу анимацию спрайтов в XNA. Я использую метод spriteBatch.Draw сделать это:XNA spriteBatch.Draw - мерцающие спрайты

spriteBatch.Draw(waterTexture, waterPosition, rectWater, Color.White * 1.0f, 0f, Vector2.Zero, 1.0f, SpriteEffects.None, 1.0f); 
// 'rectWater' is rect used to cut sprite image from sprite texture 

Проблема заключается в том, что она almowst работает, но ближе к концу анимации он мигает один раз и продолжить анимацию. Что бы это могло быть?

+0

Кажется, что ваша анимация для этого спрайта имеет 1 слишком много кадров. Для этого нам понадобится еще один код. –

ответ

0

Я не могу сильно помочь, не видя кода, который оживляет спрайт, но мигание в одной точке анимации каждый раз предлагает мне флягу. Что, вероятно, происходит, вы рисуете пустую рамку в конце. Вероятная причина этого - прямая ошибка за один раз; если вы используете цикл для итерации по кадрам вашей анимации, то ваш индекс может отсутствовать одним (используя, например, >= вместо >), что означает, что вы рисуете дополнительный фрейм, который не должен быть там , Тот факт, что вы получаете пустой кадр вместо сбоя, указывает на то, что дополнительный кадр попадает в spritesheet, либо по структуре вашего алгоритма анимации, либо по удаче.

Мне нужно будет увидеть код анимации, чтобы быть уверенным, что происходит.

0

Хорошо, я понял, что случилось.

Проблема заключалась в том, что у меня был неправильный алгоритм, чтобы сменить рамки, и иногда он пропускал пустую рамку. Посмотрите на код:

Rectangle rectWater = new Rectangle(((currentFrame % numerOfWaterSpriteFrames) % horizontalNumerOfWaterSpriteFrames) * (int)sizeOfWaterFrame.X, ((aktualnaFramka % numerOfWaterSpriteFrames)/horizontalNumerOfWaterSpriteFrames) * (int)sizeOfWaterFrame.Y, (int)sizeOfWaterFrame.X, (int)sizeOfWaterFrame.Y); 
//The correct code 

Я не moduling в currentFrame по numerOfWaterSpriteFrames в первом и втором параметре Прямоугольник конструктора. Точно так же:

Rectangle rectWater = new Rectangle((currentFrame % horizontalNumerOfWaterSpriteFrames) * (int)sizeOfWaterFrame.X, (aktualnaFramka/horizontalNumerOfWaterSpriteFrames) * (int)sizeOfWaterFrame.Y, (int)sizeOfWaterFrame.X, (int)sizeOfWaterFrame.Y); 
//The wrong code 

Теперь все в порядке.

Смежные вопросы