#android #flutter #animation #flame
Вопрос:
В принципе, у меня проблема в приложении, которое я создаю из игры, основанной на учебнике, который я видел, однако анимация моего персонажа на некоторых устройствах глючит, а на других она работает нормально, как следует из анимации викингов с правильной анимацией, как она отображается на некоторых устройствах:
и Викинг с неправильной анимацией на некоторых устройствах (почти всегда появляется больше одного викинга, анимация хорошо глючит):
Таблица спрайтов, которую я использую, содержит изображения викинга размером 256×144 пикселей, где первые 29 кадров-это его бег, а остальные-прыжки (в режиме ожидания). Следуйте строкам кода, которые определяют анимацию викинга в Flutter:
часть анимации в «викинге».файл для дротиков:
enum VikingAnimationStates {
Idle,
Run,
Kick,
Hit,
Sprint,
}
class Viking extends SpriteAnimationGroupComponent<VikingAnimationStates>
with Hitbox, Collidable, HasGameRef<VikingRun> {
static final _animationMap = {
VikingAnimationStates.Idle: SpriteAnimationData.sequenced(
amount: 19,
stepTime: 0.1,
textureSize: Vector2.all(256),
texturePosition: Vector2(7424, -90), //29*256
),
VikingAnimationStates.Run: SpriteAnimationData.sequenced(
amount: 29,
stepTime: 0.034,
textureSize: Vector2.all(256),
texturePosition: Vector2(0, -90),
),
VikingAnimationStates.Kick: SpriteAnimationData.sequenced(
amount: 4,
stepTime: 0.1,
textureSize: Vector2.all(256),
texturePosition: Vector2(0, -90),
),
VikingAnimationStates.Hit: SpriteAnimationData.sequenced(
amount: 3,
stepTime: 0.1,
textureSize: Vector2.all(256),
texturePosition: Vector2(0, -90),
),
VikingAnimationStates.Sprint: SpriteAnimationData.sequenced(
amount: 7,
stepTime: 0.1,
textureSize: Vector2.all(256),
texturePosition: Vector2(0, -90),
),
};
Viking(Image image, this.playerData)
: super.fromFrameData(image, _animationMap);
часть, в которой я создаю викинга в игре внутри файла viking_run.dart:
_viking = Viking(images.fromCache('spritesheet viking 48 frames 256x144.png'),
playerData);
И версии Android на обоих устройствах одинаковы
Комментарии:
1. Что-то странное с твоим
texturePosition
s, почему у тебя-90
как у? И что происходит в состоянии ожидания, когда вы говорите, что у него 19 кадров, ноtexturePosition
я предполагаю, что он начинается в правом нижнем углу и должен быть только один кадр?2. Ну, позиция текстуры на -90 предназначена для того, чтобы викинг оставался на земле, если я не поставлю это так, чтобы он оставался плавающим на экране, состояние простоя в основном происходит, когда он прыгает, где находится в той же таблице спрайтов, что и он, где первые 29 кадров состоят из его бега, а остальные кадры, пока 48-й кадр не будет состоять из состояния «ожидания», то есть как анимация прыжка для персонажа, это 19 количество кадров для этого состояния
3. Я действительно не понимаю, что произойдет, если вы установите
texturePosition
что-то отрицательное, это должна быть координата в таблице спрайтов. Попробуйте удалить его (Vector2(0, 0)
) по умолчанию. А затем попробуйте вместо этого установитьposition
викинга. Вы можете присоединиться к нашему дискорду, если вам нужна помощь в режиме реального времени. discord.com/invite/pxrBmy44. Ну,я вошел в ваш дискорд, я попытался изменить расположение текста, как вы сказали, на 0 во всех анимациях, но проблема остается на некоторых устройствах, анимация прослушивается, эта проблема очень странная, я неделями пытаюсь понять, но я не могу понять, почему это происходит
5. Напишите что-нибудь в канале пламени, и я помогу вам 🙂
Ответ №1:
Вы говорите, что ваши спрайты имеют размер 256х144 на листе спрайтов, но вы используете textureSize: Vector2.all(256)
. Попробуйте вместо этого изменить это на Vector2(256, 144)
.
Также texturePosition
никогда не должно быть ничего отрицательного, оно определяет позицию на листе спрайта. Поскольку у вас есть только одна строка спрайтов в вашем листе спрайтов, у вас всегда должно быть значение y, 0
а затем вы можете изменить x для того, где должна начинаться последовательность каждой анимации.