【问题标题】:onClick called without actually clicking the buttononClick 在没有实际单击按钮的情况下调用
【发布时间】:2015-02-28 16:10:51
【问题描述】:

在 Monogame 中开发我创建了一些简单的方法来检测精灵是否被点击。这就是我检查精灵是否被按下的方式。 mouseOver 表示鼠标正在与精灵相交。

var lastMouseState = mouseState;
mouseState = Mouse.GetState();
if (mouseOver && lastMouseState.LeftButton == ButtonState.Pressed && mouseState.LeftButton == ButtonState.Released)
     onClick(this);

onclick 在另一个类中管理。这个类叫做Menu

private void onClick(Button btn)
{
    //Toggles the button.
    if (btn.HasCheckBox)//Whether the button has a checkbox
    {
        btn.Checked = !btn.Checked;
    }
    if (btn.Destination == "inGame")
        unPause();
    else if (btn.Destination == "Quit")
        Exit();
    else
        openMenu(btn.Destination);
}

这里稍微解释一下:每个按钮都有一个叫做destination的属性,意思是按钮通向的地方,比如:inGame、Options、Quit等

现在这是我的问题:

当游戏暂停时,显示的菜单包含 3 个按钮(继续、选项和退出)。

当打开菜单并进入一个子菜单,然后按下一个按钮,然后菜单关闭并且鼠标没有移动,然后当我重新打开菜单并且鼠标在顶部Quit 按钮,游戏将关闭。查看下面的 gif 以获得更清晰的解释。

这只发生在Quit。当我用其他按钮尝试相同的过程时,它不起作用。 {SEE EDIT 2}

一个小示范: http://media.giphy.com/media/AxVvk9FgO6TOd5roEo/giphy.gif

我首先尝试使用music 按钮。关闭并重新打开菜单 - 没有任何反应。 我尝试使用 fullscreen 按钮,单击 > 关闭 > 重新打开菜单 -- 游戏退出。

为什么按钮点击注册在quit,而不是options? 谢谢您的帮助。如果需要更多信息,请发表评论。


编辑 显然,进入选项菜单时鼠标在哪里并不重要。只要单击(屏幕中的任何位置)并且在重新打开菜单屏幕后鼠标悬停在按钮上,游戏就会退出。

奇怪的是,我在Quit 下添加了一个新按钮,它也指向选项菜单。在使用第二个 Option 按钮测试相同的行为之后。我无法重现该错误。但是,如果我在第一个 Option 按钮悬停第二个按钮时执行相同操作,它的工作原理与 Quit 相同 - 它会立即打开选项屏幕,就像它被单击一样。 更新的 Gif:http://media.giphy.com/media/AxVvk60pK8NBjmghDa/giphy.gif


编辑 2 进一步缩小了错误。使用 foreach 时,只有当第二个按钮的索引大于第一个时才会出现该错误。解释:我按下了第二个按钮,button[1],它只适用于button[2] 及更高版本。

这是我的更新方法:

if (isPaused)
{
    foreach (var button in ButtonList)
    {
        if (MenuScreen == button.Parent)//Menuscreen is the current screen being displayed.
//button.parent is the parent screen that holds current button. such as: ingame, pause, etc.
        {
            button.Update();
        }
    }
}

现在我知道它背后的逻辑,但不知道它发生在哪里。

【问题讨论】:

    标签: c# monogame


    【解决方案1】:

    听起来你可能有一些看不见的角色弄乱了作品,可能来自复制粘贴或其他东西。如果您添加了另一个类似的按钮并且它起作用了,那么这可能是一种可能性。

    您可以手动重新键入它或通过 jsbin 之类的东西运行它以查看是否有任何显示。 (在 jsbin 中,它会为看不见的字符显示红色句点。)如果一切都失败了,请尝试一下。

    【讨论】:

    • 问题只发生在索引高于第一个按钮的按钮上。就我而言,它适用于button[1]button[2],但不适用于button[0]。并且在使用向后 for 循环之后,它只能对较低的索引起作用(例如,button[1]button[0],等等)
    【解决方案2】:

    显然,错误的发生是因为不可见的按钮没有更新,这意味着它们各自的鼠标位置没有更新——这仍然不能解释为什么索引必须更大。

    无论如何,我在按钮的Update 方法中添加了一个条件。如果这个bool 变量为真,请也更新点击次数。如果按钮不可见,或者变量为 false,则仅更新鼠标状态。

    解决方案:

    if (isPaused)
    {
        foreach (var button in ButtonList)
        {
            if (MenuScreen == button.Parent)
            {
                button.Update(true);
            }
            else 
                button.Update(false);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2018-09-04
      • 1970-01-01
      相关资源
      最近更新 更多