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

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


person Michał Bożydar Pawłowski    schedule 22.03.2013    source источник
comment
Похоже, ваша анимация для этого спрайта имеет слишком много кадров. Нам понадобится еще немного кода, чтобы убедиться.   -  person Mohammed Hossain    schedule 22.03.2013


Ответы (2)


Хорошо, я понял, что не так.

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

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

Я не модулировал currentFrame с помощью numerOfWaterSpriteFrames в первом и втором параметрах конструктора Rectangle. Именно так:

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

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

person Michał Bożydar Pawłowski    schedule 22.03.2013

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

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

person anaximander    schedule 22.03.2013