Кнопка мыши продолжает нажиматься вместо нажатия - PullRequest
0 голосов
/ 30 апреля 2019

Я сейчас работаю над игрой в моногам.Игра в значительной степени основана на нажатии кнопок, и именно здесь возникает проблема.Всякий раз, когда я удерживаю левую кнопку мыши и затем перемещаю ее по кнопке в игре, эта кнопка нажимается мгновенно.

Я пытался решить проблему многими способами, переставляя операторы if в разныхспособы, добавив дополнительный bool, чтобы проверить, нажата ли кнопка мыши и т. д., но без всякой удачи.Также нигде не найдено никаких решений.

public override void Update(GameTime gameTime)
{
    MouseState state = Mouse.GetState();

    if (new Rectangle((position - ElementCenter).ToPoint(), sprite.Bounds.Size)
           .Contains(state.Position) && oldState.LeftButton == ButtonState.Released)
    {
        renderColor = Color.LightSlateGray;
        if (state.LeftButton == ButtonState.Pressed &&
            oldState.LeftButton == ButtonState.Released)
        {
            switch (button)
            {
                case "UI/submit":
                    if (GameWorld.Instance.Team.UserTeamName.Length > 0)
                    {
                        GameWorld.Instance.SubmitTeamName();
                    }
                    break;
                case "UI/teammanager":
                    GameWorld.Instance.TeamManager();
                    break;
                default:
                    break;
            }
        }
    }
    else
    {
        renderColor = Color.White;
    }
    oldState = state;
}

В идеале хотелось бы, чтобы кнопка нажималась только в том случае, если перед нажатием кнопки была отпущена левая кнопка мыши.

Ответы [ 2 ]

3 голосов
/ 30 апреля 2019

Если oldState объявлено как поле экземпляра, разные экземпляры этого класса будут иметь разные его версии. То есть старое государство может потеряться.

Объявить oldState как static!

private static MouseState oldState = Mouse.GetState();
0 голосов
/ 14 мая 2019

Я обычно использую такой класс для чтения ввода

public class InputManager
{
    KeyboardState currentKeyboard, previousKeyboard;
    MouseState currentMouse, previousMouse;

    public bool LeftKeyIsHeldDown { get; private set; }
    public bool RightKeyIsHeldDown { get; private set; }
    public bool JumpWasJustPressed { get; private set; }
    public bool FireWasJustPressed { get; private set; }

    public void Update()
    {
        previousKeyboard = currentKeyboard;
        currentKeyboard = Keyboard.GetState();

        previousMouse = currentMouse;
        currentMouse = Mouse.GetState();

        LeftKeyIsHeldDown = currentKeyboard.IsKeyDown(Keys.A);
        RightKeyIsHeldDown = currentKeyboard.IsKeyDown(Keys.D);
        JumpWasJustPressed =  currentKeyboard.IsKeyDown(Keys.Space) && previousKeyboard.IsKeyUp(Keys.Space);
        FireWasJustPressed = currentMouse.LeftButton == ButtonState.Pressed && previousMouse.LeftButton == ButtonState.Released;
    }
}
...