Ошибка на некоторых устройствах с анимацией с использованием флаттера и пламени

#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/pxrBmy4

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

5. Напишите что-нибудь в канале пламени, и я помогу вам 🙂

Ответ №1:

Вы говорите, что ваши спрайты имеют размер 256х144 на листе спрайтов, но вы используете textureSize: Vector2.all(256) . Попробуйте вместо этого изменить это на Vector2(256, 144) .

Также texturePosition никогда не должно быть ничего отрицательного, оно определяет позицию на листе спрайта. Поскольку у вас есть только одна строка спрайтов в вашем листе спрайтов, у вас всегда должно быть значение y, 0 а затем вы можете изменить x для того, где должна начинаться последовательность каждой анимации.