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

Flutter升级Flame至1.6.0后,自定义Monkey组件出现多类报错

Flame 1.6.0 碰撞系统升级适配方案

Flame 1.0+ 对碰撞系统做了全面重构,你遇到的报错都是因为旧版本的API被废弃或移除导致的,以下是针对性修复方案:

错误原因与修复细节

  • HasHitboxes/Collidable 报错:旧版本的碰撞相关mixin已被移除,无需再混入这两个类,改为直接添加碰撞形状组件实现检测。
  • HitboxShape/HitboxRectangle 未定义:旧的HitboxRectangle已更名为RectangleHitbox,HitboxShape类被废弃,直接使用具体的碰撞形状子类即可。
  • addHitbox 方法不存在:旧的添加碰撞盒方法已被移除,现在只需将碰撞形状组件作为子组件添加到Monkey中。

修改后的完整代码

import 'package:flame/components.dart';
import 'package:flame/game.dart';

// 假设你的游戏类定义如下(需确保混入HasCollisionDetection启用碰撞)
class MovingBackgroundGame extends FlameGame with HasCollisionDetection {}

class Monkey extends PositionComponent with HasGameRef<MovingBackgroundGame>, CollisionCallbacks {
  Monkey({Vector2? position, bool isVertical = false})
      : super(
          position: position,
          size: Vector2(40, 80),
          anchor: Anchor.topLeft,
        );

  bool collided = false;

  @override
  Future<void> onLoad() async {
    // 添加矩形碰撞盒,替代旧的addHitbox逻辑
    add(RectangleHitbox(
      relation: Vector2(1, 1), // 保持原有的尺寸比例设置
      collisionType: CollisionType.active, // 根据需求设置碰撞类型:active(主动检测)/passive(被动响应)/static(静态)
    ));
    super.onLoad();
  }

  // 可选:如果需要处理碰撞事件,实现以下回调方法
  @override
  void onCollisionStart(Set<Vector2> intersectionPoints, PositionComponent other) {
    collided = true;
    super.onCollisionStart(intersectionPoints, other);
  }
}

额外注意点

  • 游戏类必须混入HasCollisionDetection,否则碰撞检测不会生效。
  • 若不需要处理碰撞事件,可以去掉CollisionCallbacks混入。

内容的提问来源于stack exchange,提问作者Mr. Tacio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:15:10