【问题标题】:Mouse clicked and released XNA鼠标点击并释放 XNA
【发布时间】:2013-03-23 07:56:13
【问题描述】:

我正在尝试为游戏制作主菜单,当我在某个区域上点击(或左键单击)时遇到了这些问题。我见过许多 WP7 的游戏菜单,在您释放点击后它会执行一些操作。好吧,我试图在按下时显示图像并在释放时发出声音。

这怎么可能?

这是我的代码:

//putoClick's = Mouse.GetState();
//clickarea = the same dimensions as putoClick; 
if (putoClick.LeftButton == ButtonState.Pressed)
{
    mouseClick = new Rectangle(putoClick.X, putoClick.Y, 30, 20);

    if (clickArea.Intersects(mouseClick))
    {
        spriteBatch.Draw(imgB, btnPos, Color.White);

        btnMenuClickSound.Play();

    }
    else
    {
        spriteBatch.Draw(imgBs, btnPosN, Color.White);
    }

    putoClick = Mouse.GetState();

    //....
}

当按下按钮时,声音会不断播放。尝试与新闻稿合作,但没有奏效。请原谅我的变量名,哈哈,这是一个快速测试。在此先感谢

【问题讨论】:

  • 如果此问题的任何答案帮助您解决了您的问题,您应该接受它,以便它可以帮助看到它的其他人。

标签: c# menu xna


【解决方案1】:

您需要做的是创建一个保留两种鼠标状态的鼠标处理类。这一帧的和前一帧的。并检查这两种状态之间按钮状态的变化。像

MouseState newState = Mouse.getState();    
if(oldState.LeftButton == ButtonState.Pressed && newState.LeftButton == ButtonState.Released){
    // click released
    // TODO : add your on released code here
}
if(newState.LeftButton == ButtonState.Pressed && oldState.LeftButton == ButtonState.Released)
{
    // pressed for the first time
    // TODO : add  your on clicked code here
}
if(newState.LeftButton == ButtonState.Pressed)
{ 
    // left mouse button is down
    // TODO : add your on left button down logic
}
// "remember" this frame's state for use in the next frame.
oldState = newState;

你每帧调用这个方法(更新),你就完成了。 (您可能希望通过让鼠标处理程序类只更新一个内部布尔值并让您的游戏代码在需要时读取该布尔值来将输入与逻辑完全分开,但这取决于您的游戏需求。

【讨论】:

  • 我忘了在这里添加的东西。当按钮被按下时,它应该显示图像,直到它被释放。我以前做过类似的事情。这绝对帮助我解决了声音问题。但在发布之前无法显示图像
  • @chelo666 查看我的编辑,您可以捕获第二个 if 的点击(并用布尔值记住它)然后您可以在第三个 if 中处理它。
【解决方案2】:

声音持续播放的原因是因为 btnMenuClickSound.Play(); 调用发生在 2 个 if 条件内,这些条件声明如下:

  • 左键向下
  • 并且点击区域已经被点击

因此,当这两个条件为真时,您的声音将会播放。

因此,移动一些代码并使用布尔标志来跟踪您是否点击了按钮以及该状态是否已更改,我们可以找到解决方案!

// a private class member - NOT to be declared within the function
bool buttonClicked = false;

 

if (putoClick.LeftButton == ButtonState.Pressed)
{
    mouseClick = new Rectangle(putoClick.X, putoClick.Y, 30, 20);

    //if the button was clicked with the left mouse button
    //buttonClicked will be true, otherwise false.
    buttonClicked = clickArea.Intersects(mouseClick);
}
else if(buttonClicked && putoClick.LeftButton == ButtonState.Released)
{
    //The button was clicked last frame, but the mouse is now up
    //play the sound!
    btnMenuClickSound.Play(); 
}

//the mouse button is released, therefore the button is not clicked
if(putoClick.LeftButton == ButtonState.Released)
    buttonClicked = false;   

//draw the appropriate graphic depending on 
//whether or not the button has been clicked.
if(buttonClicked)
    spriteBatch.Draw(imgB, btnPos, Color.White);
else
    spriteBatch.Draw(imgBs, btnPosN, Color.White);

putoClick = Mouse.GetState(); //also, i presume this needs to be here instead?

我决定跟踪按钮是否被点击,因为我的理解是要播放的声音应该只在点击按钮后释放鼠标时播放

【讨论】:

    【解决方案3】:

    你在这里写的是:

    如果按下按钮执行 A 如果未按下按钮,请执行 B

    你想写的是

    如果按钮被按下而不是等待按钮未被按下并且仅比 B

    诀窍是保持按钮的最后状态

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多