Как использовать обновление, чтобы правильно использовать мышь в моей игре - PullRequest
0 голосов
/ 17 марта 2020

Сейчас я строю игру в шахматы, и у меня проблема. У меня есть эта функция обновления для пешки:

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 вы можете увидеть некоторые нажатия, которые заставляют синюю линию появляться и затем исчезают, даже если я нажал один раз

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

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

0 голосов
/ 18 марта 2020

Когда вы пишете код в методе Update, вы должны думать о нем так, как если бы он был внутри бесконечной l oop, например:

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

Когда вы смотрите на логи c в такой простой c манере должно быть легко понять, почему вы получаете мерцающее поведение. Это буквально включает и выключает переменную draw_spots снова и снова.

Чтобы продолжить с бесконечной аналогией l oop, давайте посмотрим, что код должен делать вместо этого. По сути, есть две вещи, которые должны быть правдой, если вы хотите «нарисовать точки».

  1. Левая кнопка мыши нажата
  2. Курсор мыши находится внутри квадрата

Теперь давайте переведем эту логику c в код.

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;
}

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

Я бы даже go смог бы вытащить еще больше битов логики c в переменные и просто установить значение 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 выходит из области видимости, прежде чем ее использовать, я собираюсь предположить, что вы оставили его во время отладки, и его можно безопасно удалить.

...