XNA DrawableGameComponent мыши проблема с вводом мыши - PullRequest
3 голосов
/ 24 июля 2011

Я разрабатываю простую настольную игру, где моя игровая доска представлена ​​в виде DrawableGameComponent. В методе обновления доски я проверяю ввод мыши, чтобы определить, какое поле на доске было щелкнуто. Проблема, с которой я сталкиваюсь, заключается в том, что щелчок мышью регистрируется только один раз каждые 5-6 щелчков.

Код щелчка мыши является базовым:

public override void Update(GameTime gameTime)
    {
        MouseState mouseState = Mouse.GetState();
        Point mouseCell = new Point(-1, -1);

        if (mouseState.LeftButton == ButtonState.Pressed && previousMouseState.LeftButton == ButtonState.Released)
        {
            mouseCell = new Point(mouseState.X, mouseState.Y);
        }

        // cell calc ...

        previousMouseState = mouseState;

        base.Update(gameTime);
    }

В Game.cs я просто добавляю свою доску в коллекцию компонентов.

Кто-нибудь знает, что мне здесь не хватает?

РЕДАКТИРОВАТЬ: На самом деле, это не просто мышь, ввод с клавиатуры также не работает должным образом, поэтому я, вероятно, испортил реализацию DrawableGameComponent, хотя я понятия не имею, как.

РЕДАКТИРОВАТЬ2: Здесь нашли несколько людей: http://forums.create.msdn.com/forums/p/23752/128804.aspx и здесь: http://forums.create.msdn.com/forums/t/71524.aspx, имеющих очень похожие проблемы. После неудачной отладки я отключил DrawableGameComponent и реализовал ручные вызовы LoadContent / Update / Draw и поместил весь входной сбор в game.cs. Работает как шарм. Однако, если у кого-то есть какое-либо объяснение, что могло пойти не так (похоже, DrawableGameComponent каким-то образом закупоривает ввод), я бы очень хотел знать.

1 Ответ

0 голосов
/ 26 июля 2011

Проблема в том, что если мышь меняет состояние между MouseState mouseState = Mouse.GetState(); и previousMouseState = mouseState;, то previousMouseState и mouseState будут иметь то же значение.

Это можно сделать практически невозможным, переместив их на линии, максимально приближенные друг к другу, насколько это возможно.

public override void Update(GameTime gameTime)
{
    Point mouseCell = new Point(-1, -1); //moved this up, so that the mouseState and previousMouseState are as close to each other as possible.
    MouseState mouseState = Mouse.GetState();

    if (mouseState.LeftButton == ButtonState.Pressed && previousMouseState.LeftButton == ButtonState.Released)
    {
        mouseCell = new Point(mouseState.X, mouseState.Y);
    }
    //It is almost imposible, that the mouse has changed state before this point
    previousMouseState = mouseState; //The earliest place you can possibly place this line...

    // cell calc ...

    base.Update(gameTime);
}
...