You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpriteAnimationTicker类功能、应用及Flame升级后动画切换问题求助

解决Flame升级后切换跑步动画并重置帧的问题

SpriteAnimationTicker确实是你需要的工具——它是Flame用来独立控制动画播放状态的类,每个ticker对应一个SpriteAnimation,能单独管理动画的播放进度、重置帧、暂停/播放等操作,完美替代旧版本的reset()逻辑。

实现步骤与代码示例

  1. 预加载动画并初始化对应Ticker
    给左右跑步动画分别创建SpriteAnimationTicker,这样切换时可以独立控制每个方向的动画状态:
class Runner extends SpriteAnimationComponent {
  late SpriteAnimation _leftRunAnim;
  late SpriteAnimation _rightRunAnim;
  late SpriteAnimationTicker _leftTicker;
  late SpriteAnimationTicker _rightTicker;
  late SpriteAnimationTicker _currentTicker;

  @override
  Future<void> onLoad() async {
    // 加载左右跑步精灵表动画
    _leftRunAnim = await SpriteAnimation.load(
      'running_left.png',
      SpriteAnimationData.sequenced(
        amount: 6, // 根据你的精灵表帧数调整
        stepTime: 0.15, // 每帧间隔时间
        textureSize: Vector2(48, 48), // 单帧精灵尺寸
      ),
    );
    _rightRunAnim = await SpriteAnimation.load(
      'running_right.png',
      SpriteAnimationData.sequenced(
        amount: 6,
        stepTime: 0.15,
        textureSize: Vector2(48, 48),
      ),
    );

    // 为每个动画创建Ticker
    _leftTicker = _leftRunAnim.createTicker();
    _rightTicker = _rightRunAnim.createTicker();
    _currentTicker = _leftTicker; // 默认初始方向
  }
}
  1. 实现点击切换逻辑
    在点击事件触发时切换当前使用的Ticker,并调用reset()将帧重置为0:
void switchRunDirection() {
  // 切换当前Ticker
  _currentTicker = _currentTicker == _leftTicker ? _rightTicker : _leftTicker;
  // 重置动画到第一帧
  _currentTicker.reset();
}
  1. 更新与渲染动画
    在update方法中更新当前Ticker的进度,并同步显示当前帧:
@override
void update(double dt) {
  super.update(dt);
  // 更新当前Ticker的动画时间
  _currentTicker.update(dt);
  // 将当前帧精灵赋值给组件的sprite
  sprite = _currentTicker.currentSprite;
}
  1. 绑定点击事件
    在你的游戏类中监听点击,调用角色的切换方法:
class RunGame extends FlameGame {
  late Runner player;

  @override
  Future<void> onLoad() async {
    player = Runner();
    add(player);
  }

  @override
  void onTapDown(TapDownInfo info) {
    player.switchRunDirection();
  }
}

关键说明

  • SpriteAnimationTicker的核心作用是分离动画数据与播放状态,旧版本的reset()是绑定在SpriteAnimation上的,升级后移到了Ticker类中。
  • 如果不需要每次切换都重置帧(比如切换回来继续之前的播放进度),可以去掉_currentTicker.reset()这行代码。
  • 确保每个Ticker在onLoad中正确初始化,且update方法中只更新当前使用的Ticker。

内容的提问来源于stack exchange,提问作者gLanceD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:32:23