旨在用于Flame的四叉树算法实现
特点
- 与原生Flame完全兼容
- 允许为每种组件类型编写自定义的粗测检查
- 自动管理组件,但提供手动控制的功能
入门
配置过程与标准的Flame碰撞检测系统设置类似。
- 将mixin
HasQuadTreeCollisionDetection添加到您从FlameGame扩展的游戏类中
class TestGameQuadTree extends FlameGame with HasQuadTreeCollisionDetection {}
- 在游戏的
onLoad函数中调用initCollisionDetection函数。在这里,您应该指定一个包含您的游戏地图尺寸的矩形。此信息是拆分游戏空间为象限所必需的
@override
Future<void> onLoad() async {
final tiledComponent = await TiledComponent.load('collisions.tmx', Vector2.all(8));
final mapWidth = (tiledComponent.tileMap.map.width *
tiledComponent.tileMap.map.tileWidth)
.toDouble();
final mapHeight = (tiledComponent.tileMap.map.height *
tiledComponent.tileMap.map.tileHeight)
.toDouble();
initCollisionDetection(Rect.fromLTWH(0, 0, mapWidth, mapHeight));
}
- 所有需要参与碰撞检测周期的游戏组件都应具有两个mixin
- 标准的Flame的
CollisionCallbacks,以支持“onCollision*”函数 - 特殊的
CollisionQuadTreeControllermixin
这是保证基本功能的最小配置
附加方法
有许多附加方法可以使粗测检查更快。
对象中心之间的最小距离
在您的FlameGame自定义类中,重写minimumDistance变量
class TestGameQuadTree extends FlameGame with HasQuadTreeCollisionDetection {
@override
double? get minimumDistance => 10;
}
这将排除对象进行详细的昂贵碰撞检查,如果对象之间的距离大于minimumDistance变量的值。
如果您需要更复杂的逻辑,您也可以重新实现HasQuadTreeCollisionDetection::minimumDistanceCheck方法。
通用检查,是否几种类型的对象会相互碰撞
在您的组件类中重写broadPhaseCheck方法
@override
bool broadPhaseCheck(PositionComponent other) {
if (other is Brick) return false;
return super.broadPhaseCheck(other);
}
重要!此检查仅对成对的项目执行一次。如果结果为负,则由QuadTreeBroadphase类进行缓存。因此,只在此处放置通用检查,例如检查对象的类型等。如果传递非常动态的内容,您可能会遇到意外的行为。