在 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
上实现方法时,仅当事件发生在组件顶部时才会调用它们。请记住设置 PositionComponent
的 size
并使用 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
在 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
上实现方法时,仅当事件发生在组件顶部时才会调用它们。请记住设置 PositionComponent
的 size
并使用 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