You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:53:16