如何使用Flame in Flutter检测屏幕边界



我想在Flame Flutter中检测对象何时超出屏幕。我认为有两种方法可以实现这一点,要么使用Collidablemixin,要么使用Forge2D。如果可能的话,用两种方式解释。

火焰版本:火焰:1.0.0-发布日期.18

为此使用Forge2D太过分了(这也使许多其他事情变得复杂(。但你可以使用内置的碰撞检测系统,也可以在更新循环中检查它是否在屏幕内(这将是最有效的(。

通过使用碰撞检测系统,我们可以使用内置的ScreenCollidable,您可以这样做:

class ExampleGame extends FlameGame with HasCollidables {
...
@override
Future<void> onLoad() async {
await super.onLoad();
add(ScreenCollidable());
}
}
class YourComponent extends PositionComponent with HasHitboxes, Collidable {
@override
Future<void> onLoad() async {
await super.onLoad();
// Change this if you want the components to collide with each other
// and not only the screen.
collidableType = CollidableType.passive;
addHitbox(HitboxRectangle());
}
// Do note that this doesn't work if the component starts
// to go outside of the screen but then comes back.
@override
void onCollisionEnd(Collidable other) {
if (other is ScreenCollidable) {
removeFromParent();
}
}
}

并通过在update-循环中计算它:

class YourComponent extends PositionComponent with HasGameRef {
@override
void update(double dt) {
final topLeft = absoluteTopLeftPosition;
final gameSize = gameRef.size;
if(topLeft.x > gameSize.x || topLeft.y > gameSize.y) {
removeFromParent();
return;
}
final bottomRight = absolutePositionOfAnchor(Anchor.bottomRight);
if(bottomRight.x < 0 || bottomRight.y < 0) {
removeFromParent();
return;
}
}
}

我还建议您在Flame 1.0.0发布时立即更新。:(

不再存在Collidable混合元素

参见火焰文件

最新更新