Flutter Flame中如何准确检测鼠标按键的按下与释放状态
Flutter Flame中如何准确检测鼠标按键的按下与释放状态
我完全懂你遇到的这个困扰——默认的Tap和Drag回调组合在拖拽场景下确实会掉链子:onTapUp压根不会在拖拽时触发,而onDragEnd又会在你停止移动鼠标时就触发,哪怕按键还按着,根本没法准确判断当前鼠标按键的真实状态。
其实解决这个问题的核心是绕过Tap/Drag的封装,直接监听底层的Pointer事件,这类事件不管你是不是在拖拽,只要按键按下或抬起就会触发,完美覆盖你的需求。下面给你具体的实现方案:
方法一:在FlameGame中直接维护按键状态
你可以在游戏类里定义一个布尔变量来记录按键状态,然后通过onPointerDown和onPointerUp回调来更新这个状态:
import 'package:flame/game.dart'; import 'package:flutter/gestures.dart'; class MyGame extends FlameGame { // 记录鼠标左键是否按下 bool _isLeftMousePressed = false; @override void onPointerDown(PointerDownEvent event) { super.onPointerDown(event); // 判断是否是鼠标左键(kPrimaryMouseButton对应左键) if (event.buttons == kPrimaryMouseButton) { _isLeftMousePressed = true; } } @override void onPointerUp(PointerUpEvent event) { super.onPointerUp(event); if (event.buttons == kPrimaryMouseButton) { _isLeftMousePressed = false; } } @override void update(double dt) { super.update(dt); // 在这里可以随时获取按键状态并处理逻辑 if (_isLeftMousePressed) { // 比如:持续按下左键时移动角色、绘制轨迹等 } } }
方法二:在Component中监听指针事件
如果你的逻辑是绑定在某个具体组件上的,也可以给Component添加PointerCallbacks mixin来监听事件:
import 'package:flame/components.dart'; import 'package:flutter/gestures.dart'; class InteractiveComponent extends PositionComponent with PointerCallbacks { bool _isPressed = false; @override void onMount() { super.onMount(); // 确保组件能接收指针事件 receivesEvents = true; } @override void onPointerDown(PointerDownEvent event) { super.onPointerDown(event); if (event.buttons == kPrimaryMouseButton) { _isPressed = true; } } @override void onPointerUp(PointerUpEvent event) { super.onPointerUp(event); if (event.buttons == kPrimaryMouseButton) { _isPressed = false; } } @override void update(double dt) { super.update(dt); if (_isPressed) { // 组件被按下时的逻辑,比如缩放、变色等 } } }
额外说明:区分不同鼠标按键
如果需要监听右键或中键,只需替换event.buttons的判断值:
- 右键:
kSecondaryMouseButton - 中键:
kMiddleMouseButton
这种方法的优势在于完全不受拖拽行为的影响,只要鼠标按键真正按下/抬起,事件就会触发,状态也能保持准确,完美解决你之前遇到的问题。
备注:内容来源于stack exchange,提问作者Nikoloz Miruashvili
相关产品推荐
相关产品推荐

