如何使用更新在我的游戏中正确使用鼠标

How to use update to use mouse in my game properly

我现在正在构建一个国际象棋游戏,我遇到了一个问题。 我有这个 pawn 的更新功能:

public void update(GameTime gameTime)
        {
            MouseState ms = Mouse.GetState();
            if (ms.LeftButton == ButtonState.Pressed)
            {
                if ((float)ms.X / 50 >= location.x && (float)ms.X / 50 <= location.x + 1 && (float)ms.Y / 50 >= location.y && (float)ms.Y / 50 <= location.y + 1)
                {
                    if (!draw_spots)
                    {
                        draw_spots = true;
                    }
                    else
                    {
                        draw_spots = false;
                    }
                }
                else
                {
                  spot sp = new spot(ms.X / 50, ms.Y / 50);
                    if (draw_spots)
                    {
                        draw_spots = false;
                    }
                }
            }

它应该做的是在按下鼠标左键时将draw_spots设置为true(意味着应该绘制可能的移动位置和进食位置)。当我再次按下时将其更改为 false 以便它停止绘制那些。该功能有效,但有时应该变成蓝色的方块会闪烁并关闭。我的猜测是我按下鼠标左键以获得偶数个更新序列(这使它打开然后关闭)。关于如何解决它的任何想法? 谢谢!

问题视频:https://www.youtube.com/watch?v=Awb4V1giV2Y&feature=youtu.be 你可以看到一些按键使蓝线出现然后消失,即使我按了一次

当您在 Update 方法中编写代码时,您需要将其视为处于这样的无限循环中:

while(true)
{
    if (!draw_spots)
    {
        draw_spots = true;
    }
    else
    {
        draw_spots = false;
    }
}

当您以这种简单的方式查看逻辑时,应该很容易看出为什么会出现闪烁行为。它实际上是一遍又一遍地打开和关闭 draw_spots 变量。

为了与无限循环类比保持一致,让我们看看代码应该做什么。当您想 "draw spots".

时,基本上有两件事应该都是真的
  1. 按下鼠标左键
  2. 鼠标光标在方块内

现在,让我们将此逻辑转化为代码。

while(true)
{
    var ms = Mouse.GetState();
    var leftButtonPressed = ms.LeftButton == ButtonState.Pressed;
    var mouseInsideSquare = (float)ms.X / 50 >= location.x && 
                            (float)ms.X / 50 <= location.x + 1 &&
                            (float)ms.Y / 50 >= location.y &&
                            (float)ms.Y / 50 <= location.y + 1;

    if (leftButtonPressed && mouseInsideSquare)
       draw_spots = true;
    else
       draw_spots = false;
}

通过使事情尽可能简单并用额外的变量命名您的逻辑位,代码会变得更容易阅读和理解。

我什至会把更多的逻辑提取到变量中,然后简单地将 draw_spots 的值设置为这样的结果:

    var ms = Mouse.GetState();
    var leftButtonPressed = ms.LeftButton == ButtonState.Pressed;
    var mx = ms.X / 50f;
    var my = ms.Y / 50f;
    var mouseInsideSquare = mx >= location.x && 
                            mx <= location.x + 1 &&
                            my >= location.y &&
                            my <= location.y + 1;

    draw_spots = leftButtonPressed && mouseInsideSquare;

您喜欢上面代码的哪个版本是个人喜好问题。关键是以一种更容易理解的方式分解你的代码。希望对您有所帮助。

你的代码中唯一奇怪的一点是这一行:

 spot sp = new spot(ms.X / 50, ms.Y / 50);

但是由于 sp 变量在使用之前就超出了范围,我假设你在调试某些东西时把它留在那里并且可以安全地删除它。

我能够自己解决这个问题,我所做的如下。 添加一个名为 oldms 的变量,用于保存上次更新的鼠标状态。 然后在 if 语句中,我询问是否未按下鼠标左键,以及上次更新是否按下了鼠标左键。这意味着,我按下了鼠标,我希望它现在开始绘制。