在 onTapDown 中,如何知道这个位置是否有东西或什么

In onTapDown, how to know if something or what is in this position

在 FlameGame 的范围内,我正在添加一个 PositionComponent(Bubble)。

这个 PositionComponent 也应该是可拖动的,所以我已经将 HasDraggables 添加到 FlameGame 范围,并将“Draggable”添加到 PositionComponent。如果在 FlameGame 中与 onTapDown 有任何冲突的实现,我会提到可拖动。

#如果水龙头下面已经有 PositionComponent 就不要添加 PositionComponent

但是如果那个位置已经有一个PositionComponent,我不会添加任何新的PositionComponent。我查看了 TapDownInfo 但没有找到任何东西 我可以在那里使用。

如果已经有 PositionComponent,你知道如何不添加吗?

class MyGame extends FlameGame with HasCollisionDetection, TapDetector, HasDraggables {
  @override
  Future<void> onLoad() async {
    super.onLoad();
    add(ScreenHitbox());
  }

  void onTapDown(TapDownInfo info) {
    // if (no PositionComponent underneath){add(Bubble(info.eventPosition.game));}
    add(Bubble(info.eventPosition.game));
  }

您可以在 PositionComponent 中实施 onTapDown,与您要使用的 Draggable 方法相同。

当您在 PositionComponent 上实现方法时,仅当事件发生在组件顶部时才会调用它们。请记住设置 PositionComponentsize 并使用 GestureHitboxes mixin 如果你想让 hitboxes 确定点击是否在组件顶部,后者更高级所以我建议你从设置 size.

开始

在下面的示例中,如果您点击这些坐标,将创建一个具有大小 (100, 100) 和位置 (500, 500) 的组件,并且由于我们将 anchor 设置为居中,所有从 (250, 250)(750, 750) 的矩形内的点击将触发 onTapDown 方法。

目前无法在 FlameGame 回调中知道某个组件是否已被点击(这将在未来版本中更改),但您可以手动跟踪它。

class MyComponent extends PositionComponent with Tappable, HasGameRef<MyGame> {
  MyComponent(Vector2 position) : 
    super(
      position: position, 
      size: Vector2(100, 100), 
      anchor: Anchor.center,
    );

  @override
  bool onTapDown(TapDownInfo event) {
    gameRef.tappedComponent = true;

    // return true if you want the event to
    // propagate to components behind this one
    return true; 
  }
}

然后在识别出点击时将组件添加到您的游戏中:

class MyGame extends FlameGame with HasTappables {
  bool tappedComponent = false;

  @override
  void onTapDown(int pointerId, TapDownInfo info) {
    super.onTapDown(pointerId, info);
    if(!tappedComponent) {
      // Will add a component at the position that was tapped
      add(MyComponent(info.eventPosition.game));
    }
  }

  @override
  void onTapUp(int pointerId, TapUpInfo info) {
    super.onTapDown(pointerId, info);
    tappedComponent = false;
  }
}

相关文档: https://docs.flame-engine.org/1.0.0/gesture-input.html?highlight=tappable#tappable-components