Лучший способ определить, нажата ли кнопка

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

  1. Щелчок мыши не обязательно должен начинаться внутри кнопки, и он регистрируется немедленно, а не после того, как кнопка мыши отпущена (внутри границ кнопки).
  2. Когда несколько кнопок на разных экранах находятся в одной области, это приводит к щелчку их обеих, поскольку кнопка мыши отпускается недостаточно быстро.

Как сделать так, чтобы щелчки больше походили на кнопки WinForm?


person Community    schedule 08.09.2015    source источник


Ответы (3)


Чтобы щелчки мышью работали эффективно, вам необходимо сделать следующее:

Первым делом мы создаем класс MouseInput, он должен отслеживать такие вещи, как mouseState, lastMouseState, MouseX, MouseY. MouseState и lastMouseState работают вместе, чтобы обработать 1 щелчок. Но пока вы можете просто добавить этот класс в свой проект:

class MouseInput
    {
        private static MouseState mouseState;
        private static MouseState lastMouseState;


        public static MouseState MouseState
        {
            get { return mouseState; }
            set { mouseState = value; }
        }

        public static MouseState LastMouseState
        {
            get
            {
                return lastMouseState;
            }
            set
            {
                lastMouseState = value;
            }
        }

        public MouseInput()
        {
        }
        public static int getMouseX()
        {
            return Mouse.GetState().X;
        }

        public static int getMouseY()
        {
            return Mouse.GetState().Y;
        }
    }

После того, как вы это сделаете, вы хотите начать поиск щелчка мыши каждый раз, когда выполняется ваш метод обновления:

 MouseInput.LastMouseState = MouseInput.MouseState;

  // Get the mouse state relevant for this frame
 MouseInput.MouseState = Mouse.GetState();

После того, как вы выполнили эти 2 важных шага, вы можете продолжить и использовать свой код где угодно, например:

if (MouseInput.LastMouseState.LeftButton == ButtonState.Released && MouseInput.MouseState.LeftButton == ButtonState.Pressed) {
 //Execute code here
}

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

Если у вас есть вопросы, не стесняйтесь спросить

person Aintaro Mocrosoft    schedule 08.09.2015

Вы можете использовать RoutedEvent, который может вызывать обработчики для нескольких прослушивателей в дереве элементов, а не только для объекта, вызвавшего событие. вы можете узнать больше о RoutedEvents, поскольку концепция прикрепленного события позволяет добавить обработчик определенного события к произвольному элементу, а не к элементу, который фактически определяет или наследует событие. Когда эти события не связаны с элементом, который, как и в случае с MouseDown, вызывает событие и прослушивает его.

Итак, RoutedEvents может помочь вам решить вашу проблему

Вот пример кода

public static readonly RoutedEvent SelectedEvent = 
    EventManager.RegisterRoutedEvent( "Selected", RoutingStrategy.Bubble, 
    typeof(RoutedEventHandler), typeof(MyCustomControl));

// .NET wrapper
public event RoutedEventHandler Selected
{
    add { AddHandler(SelectedEvent, value); } 
    remove { RemoveHandler(SelectedEvent, value); }
}

// Raise the routed event "selected"
RaiseEvent(new RoutedEventArgs(MyCustomControl.SelectedEvent));
person Mohit Shrivastava    schedule 08.09.2015
comment
Вот это да. Это пролетело у меня в голове. Не могли бы вы объяснить это попроще? - person ; 08.09.2015
comment
Вы прочитали предоставленную ссылку. Попробуйте реализовать в тестовом проекте, чтобы увидеть, как это работает, и я уверен, что это поможет и в вашем проекте. - person Mohit Shrivastava; 08.09.2015

Пользовательский интерфейс для XNA 4.0 , как написано в WinFollows, с нуля.

Создайте форму и, нажав на нее кнопку, вызовите Form.Update () из метода Game.Update (). В Game.Draw () сначала вызовите Form.Refresh (), затем Form.Draw ().

Для обработки ввода с мыши и клавиатуры использовались менеджеры из библиотеки GameHelper.Input.

person Community    schedule 09.09.2015