鼠标点击的input并不总是在XNA更新方法中注册

我有一个问题,我的鼠标事件的所有input似乎没有注册。 更新逻辑正在检查10×10的2维数组。 这是一个gem匹配游戏的逻辑。 所以,当我切换我的gem,我不能点击另一个gem像半秒钟。 我用一个点击计数器variables来testing它,并且当我在gem开关之后第二次点击时它不会碰到debugging器。 只有在等待了半秒之后再进行第二次点击。 难道是更新逻辑太重,而他执行更新逻辑时,我的点击正在发生,他没有注册呢?

我在这里没有看到什么:)? 或者做错了。 这是我的第一场比赛。

更新:
我改变了可变时间步,然后我看到了我的珠宝重新索引后(所以切换后),我看到elapsedgametime是380毫秒。 所以我想这就是为什么他不赶上我的鼠标点击“短按”,因为更新方法仍然忙于执行reindexing代码。 任何人都知道我可以如何处理这个..或者我必须开始使用线程,因为我的更新索引需要太长时间?

解决:问题是,在我的reindexing代码中,我摆脱了我所追捕的exception,然后继续。 每次发生重新索引时,捕获exception都会导致严重滞后。 现在一切运行顺利,我不必担心一个缓慢的更新。 但是我仍然在问这个问题。你应该怎么做如果你真的需要更新逻辑,那么处理逻辑的时间几乎需要0.5秒? 我想你需要在多个线程中执行你的游戏逻辑来减less更新时间? 我也想我永远不必担心这个珠宝游戏:页。 对于一个有很多游戏对象的重物理游戏来说,这更是一个问题。

我的更新方法的function如下所示。

public void UpdateBoard() { currentMouseState = Mouse.GetState(); if (currentMouseState.LeftButton == ButtonState.Pressed && prevMouseState.LeftButton != ButtonState.Pressed) { debugCount++; if (debugCount == 3) { int a = 4; } leftButtonPressed = true; } if (this.IsBoardActive() == false) { UpdatingLogic = true; if (leftButtonPressed == true) { // this.CheckDropJewels(currentMouseState); this.CheckForSwitch(currentMouseState); if (SwitchFound == true) { reIndexSwitchedJewels = true; } this.MarkJewel(currentMouseState); } if (CheckForMatches == true) { if (this.CheckMatches(5) == true) { this.RemoveMatches(); reIndexMissingJewels = true; } else { CheckForMatches = false; } } UpdatingLogic = false; if (currentMouseState.RightButton == ButtonState.Pressed && prevMouseState.RightButton != ButtonState.Pressed) { this.CheckMatches(5); } this.ReIndex(); leftButtonPressed = false; } prevMouseState = currentMouseState; this.UpdateJewels(); } 

我相信可以改变代码来避免这个问题,使用两个布尔variables来存储button点击,每个button一个。 对于左键,可能是这样的:

 bool isLeftMouseBtnDown = false; public void UpdateBoard() { // Mouse events processing. currentMouseState = Mouse.GetState(); // If the current state is pressed. if (currentMouseState.LeftButton == ButtonState.Pressed) { // If the left mouse button was already down, then the user is // resting or moving the mouse with the button still down, like a drag. // Else, then it is a button down event. if (isLeftMouseBtnDown) { mouseDrag(); } else { mouseDown(); } } else { // If the button is not pressed, but it was before, it means // a mouse up event. // Else, the user is moving the mouse without pressing any button. if (isLeftMouseBtnDown) { mouseUp(); } else { mouseMove(); } } // Here comes the code that is independent of mouse events. if (CheckForMatches == true) { if (this.CheckMatches(5) == true) { this.RemoveMatches(); reIndexMissingJewels = true; } else { CheckForMatches = false; } } this.UpdateJewels(); } public void mouseDown() { // Example code that is dependent on mouse status. debugCount++; if (debugCount == 3) { int a = 4; } if (this.IsBoardActive() == false) { UpdatingLogic = true; // this.CheckDropJewels(currentMouseState); this.CheckForSwitch(currentMouseState); if (SwitchFound == true) { reIndexSwitchedJewels = true; } this.MarkJewel(currentMouseState); } UpdatingLogic = false; this.ReIndex(); // Sets the mouse button state as down. isLeftMouseBtnDown = true; } public void mouseUp() { // Sets the mouse button state as up. isLeftMouseBtnDown = false; } 

不知道什么时候运行Mouse.GetState(),因为这是需要更新之前和当前mouseState对象的状态

我想要做的是

 public void Update(GateTime time) { prevMouseState = currMouseState; currMouseState = Mouse.GetState(); //All Other stuff you want to do } 

你目前所做的代码似乎是试图比较两个状态(即在相同的状态)和比较相反的布尔值,但你应该发布更多的代码,我们要确保