【问题标题】:Monogame 3.5: Mouse Click Not DetectedMonogame 3.5:未检测到鼠标点击
【发布时间】:2016-07-10 10:21:44
【问题描述】:

我的单人游戏停止响应鼠标点击。在 3.5 版之前,这工作正常。以下是我目前获取输入的方式:

protected override void Update (GameTime game_time)
  {
  Mouse_Input (game_time);
  }

void Mouse_Input(GameTime game_time)
  {
  mouse_current = Mouse.GetState();

  if (mouse_current.LeftButton == ButtonState.Pressed)
    {
    // click
    }
  }

在函数中设置断点显示所有代码都被命中,但 LeftButton 始终为 ButtonState.Released。

我已尝试使用有线鼠标和触控板。键盘输入工作正常。还有其他人遇到这个吗?

【问题讨论】:

  • 您是从Game.Update 还是其他地方调用此代码?
  • 它在一个 Mouse_Input 函数中,它是从主 Update 函数调用的,所以是的。我已经更新了问题以包含它。

标签: mouseevent mouse monogame


【解决方案1】:

我一直用这种方式。

MouseState currentMouseState;
MouseState oldMouseState;

public bool checkClick()
{
    oldMouseState = currentMouseState;
    currentMouseState = Mouse.GetState();

    if (Visible)
    {
        if (currentMouseState.LeftButton == ButtonState.Pressed && oldMouseState.LeftButton == ButtonState.Released)
        {
            return true;
        }
    }
}

如果您想检查鼠标是否点击了矩形(例如 Hud 元素)

public bool checkClickRectangle(Rectangle rec)
{
    oldMouseState = currentMouseState;
    currentMouseState = Mouse.GetState();

    if (Visible)
    {
        if (rec.Contains(new Vector2(Mouse.GetState().X, Mouse.GetState().Y)) && currentMouseState.LeftButton == ButtonState.Pressed && oldMouseState.LeftButton == ButtonState.Released)
        {
            return true;
        }
    }
}

【讨论】:

  • 我有时也以这种方式管理输入,但这不会改变 LeftButton 出现的错误值。
【解决方案2】:

这实际上不是 Monogame 的问题,而是我的游戏逻辑中的一个问题,很难追踪。

升级到 3.5 后,我不得不重新配置 Texture2D 的加载方式,这也意味着重构一些类。我最终得到了一个类中的一个类,它们都继承自 Game。

public class Brush_Control : Game
  {
  public class Tile : Game
    {

消除过程将搜索范围缩小到此类。我相信这会导致无限循环以某种方式干扰输入,但不会引发错误或导致明显的冻结。

删除作为父级的内部 Game 引用解决了问题,事实证明我不再需要它。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 2020-04-18
    • 2018-08-05
    • 1970-01-01
    • 2021-09-06
    • 2015-08-03
    相关资源
    最近更新 更多