如何使用更新在我的游戏中正确使用鼠标
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".
时,基本上有两件事应该都是真的
- 按下鼠标左键
- 鼠标光标在方块内
现在,让我们将此逻辑转化为代码。
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 语句中,我询问是否未按下鼠标左键,以及上次更新是否按下了鼠标左键。这意味着,我按下了鼠标,我希望它现在开始绘制。
我现在正在构建一个国际象棋游戏,我遇到了一个问题。 我有这个 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".
时,基本上有两件事应该都是真的- 按下鼠标左键
- 鼠标光标在方块内
现在,让我们将此逻辑转化为代码。
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 语句中,我询问是否未按下鼠标左键,以及上次更新是否按下了鼠标左键。这意味着,我按下了鼠标,我希望它现在开始绘制。