Flutter / Flame - 如何同时使用 PanDetector 和其他 GestureDetector for Components?
Flutter / Flame - How to work with PanDetector and other GestureDetector for Components at same time?
我的游戏使用 PanDetector 移动玩家。
class MyGame extends BaseGame with PanDetector, HasTapableComponents {
@override
void onPanUpdate(DragUpdateDetails details) {
// move the player
player.move(details.delta.dx, details.delta.dy);
super.onPanUpdate(details);
}
}
我需要在屏幕右上角添加一个暂停按钮。
class PauseComponent extends PositionComponent with Tapable, HasGameRef<MyGame>{
Rect rect;
Sprite spritePause = Sprite("pause_button.png");
PauseComponent(){
rect = Rect.fromLTWH(
Get.find<Config>().screenSize.width * 0.92,
Get.find<Config>().screenSize.height * 0.04,
Get.find<Config>().screenSize.width * 0.05,
Get.find<Config>().screenSize.height * 0.10);
}
@override
void render(Canvas c) {
spritePause.renderRect(c, rect);
}
@override
void onTapDown(TapDownDetails details) {
if(gameRef.gameState == GameState.PLAYING){
gameRef.gameState = GameState.PAUSED;
gameRef.pauseEngine();
} else {
gameRef.gameState = GameState.PLAYING;
gameRef.resumeEngine();
}
print("STATUS: ${gameRef.gameState}");
super.onTapDown(details);
}
}
但是它不起作用,我怎样才能使 PauseComponent 的 onTapDown 起作用,对 PauseComponent 使用 PanDetector 和其他检测器?
您必须在 MyGame
上添加 HasTapableComponents
,并且您还必须将 PauseComponent
添加到 MyGame
(但您可能只是省略了代码)。
class MyGame extends BaseGame with PanDetector, HasTapableComponents {
....
}
您可以阅读有关可点击组件的更多信息here。
我使用了 addWidgetsOverlay mixin 并添加了一个暂停按钮自定义小部件,因为 PanDetector 无法与 Tapable 一起使用。
import 'package:flutter/material.dart';
class PauseButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topRight,
child: Material(
color: Colors.blue,
child: IconButton(
icon: Icon(Icons.pause),
onPressed: (){
print("TOUCH!");
},
),
),
);
}
}
并删除了 HasTapableComponents mixin(不确定它是否与任何东西冲突),现在可以正常工作了。
class MyGame extends BaseGame with HasWidgetsOverlay, PanDetector {
MyGame(){
addWidgetsOverlay("Pause Button", PauseButton());
}
}
我的游戏使用 PanDetector 移动玩家。
class MyGame extends BaseGame with PanDetector, HasTapableComponents {
@override
void onPanUpdate(DragUpdateDetails details) {
// move the player
player.move(details.delta.dx, details.delta.dy);
super.onPanUpdate(details);
}
}
我需要在屏幕右上角添加一个暂停按钮。
class PauseComponent extends PositionComponent with Tapable, HasGameRef<MyGame>{
Rect rect;
Sprite spritePause = Sprite("pause_button.png");
PauseComponent(){
rect = Rect.fromLTWH(
Get.find<Config>().screenSize.width * 0.92,
Get.find<Config>().screenSize.height * 0.04,
Get.find<Config>().screenSize.width * 0.05,
Get.find<Config>().screenSize.height * 0.10);
}
@override
void render(Canvas c) {
spritePause.renderRect(c, rect);
}
@override
void onTapDown(TapDownDetails details) {
if(gameRef.gameState == GameState.PLAYING){
gameRef.gameState = GameState.PAUSED;
gameRef.pauseEngine();
} else {
gameRef.gameState = GameState.PLAYING;
gameRef.resumeEngine();
}
print("STATUS: ${gameRef.gameState}");
super.onTapDown(details);
}
}
但是它不起作用,我怎样才能使 PauseComponent 的 onTapDown 起作用,对 PauseComponent 使用 PanDetector 和其他检测器?
您必须在 MyGame
上添加 HasTapableComponents
,并且您还必须将 PauseComponent
添加到 MyGame
(但您可能只是省略了代码)。
class MyGame extends BaseGame with PanDetector, HasTapableComponents {
....
}
您可以阅读有关可点击组件的更多信息here。
我使用了 addWidgetsOverlay mixin 并添加了一个暂停按钮自定义小部件,因为 PanDetector 无法与 Tapable 一起使用。
import 'package:flutter/material.dart';
class PauseButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topRight,
child: Material(
color: Colors.blue,
child: IconButton(
icon: Icon(Icons.pause),
onPressed: (){
print("TOUCH!");
},
),
),
);
}
}
并删除了 HasTapableComponents mixin(不确定它是否与任何东西冲突),现在可以正常工作了。
class MyGame extends BaseGame with HasWidgetsOverlay, PanDetector {
MyGame(){
addWidgetsOverlay("Pause Button", PauseButton());
}
}