在没有实际单击按钮的情况下调用onClick

时间:2015-02-19 22:39:52

标签: c# monogame

以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没有? 谢谢您的帮助。评论是否需要其他信息。


EDIT 显然,进入选项菜单时鼠标的位置无关紧要。只要点击完成(屏幕中的任何地方)并且重新打开菜单屏幕后鼠标悬停在按钮上,游戏就会退出。

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


编辑2 进一步缩小了这个bug。使用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();
        }
    }
}

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

2 个答案:

答案 0 :(得分:0)

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

您可以手动重新输入或通过jsbin之类的操作来查看是否显示任何内容。 (在jsbin中,它显示了看不见的字符的红色时段。)只是一个想法,如果所有其他方法都失败了你。

答案 1 :(得分:0)

显然,这个错误正在发生,因为不可见的按钮没有更新,这意味着他们各自的鼠标位置没有更新 - 这仍然无法解释为什么索引必须更大。

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

解决方案:

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