以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();
}
}
}
现在我知道它背后的逻辑,但不知道它发生的地方。
答案 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);
}
}