在某些使用颤动和火焰的动画设备上出现错误
Bug on some devices with animation using flutter and flame
基本上,我在根据我看到的教程从游戏创建的应用程序中遇到问题,但是,我的角色动画在某些设备上存在错误,而在其他设备上则 运行 正常,如下维京动画在某些设备上的显示方式正确:
维京人在某些设备上的动画错误(几乎总是出现不止一个维京人,动画有问题):
我使用的 spritesheet 有维京人的 256x144 像素图像,其中前 29 帧是他 运行 其余的他在跳跃(空闲)遵循定义维京人动画的代码行颤振:
viking.dart文件中的部分动画:
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在两个设备上的版本相同
你在spritesheet中说你的sprite是256x144,但是你用textureSize: Vector2.all(256)
。尝试将其更改为 Vector2(256, 144)
。
此外,texturePosition
永远不应该是任何负数,它定义了精灵 sheet 中的一个位置。因为你的精灵中只有一排精灵 sheet 你应该总是把 y 设为 0
然后你可以改变 x 作为每个动画序列应该开始的位置。
基本上,我在根据我看到的教程从游戏创建的应用程序中遇到问题,但是,我的角色动画在某些设备上存在错误,而在其他设备上则 运行 正常,如下维京动画在某些设备上的显示方式正确:
维京人在某些设备上的动画错误(几乎总是出现不止一个维京人,动画有问题):
我使用的 spritesheet 有维京人的 256x144 像素图像,其中前 29 帧是他 运行 其余的他在跳跃(空闲)遵循定义维京人动画的代码行颤振:
viking.dart文件中的部分动画:
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在两个设备上的版本相同
你在spritesheet中说你的sprite是256x144,但是你用textureSize: Vector2.all(256)
。尝试将其更改为 Vector2(256, 144)
。
此外,texturePosition
永远不应该是任何负数,它定义了精灵 sheet 中的一个位置。因为你的精灵中只有一排精灵 sheet 你应该总是把 y 设为 0
然后你可以改变 x 作为每个动画序列应该开始的位置。