2015-02-19 5 views
0

Разработка в Monogame Я создал простой способ обнаружить, что был нажат спрайт. Вот как я проверяю, что спрайт был нажат. mouseOver означает, что мышь пересекается с спрайтом.onClick называется без нажатия кнопки

var lastMouseState = mouseState; 
mouseState = Mouse.GetState(); 
if (mouseOver && lastMouseState.LeftButton == ButtonState.Pressed && mouseState.LeftButton == ButtonState.Released) 
    onClick(this); 

onclick управляется в другом классе. Этот класс называется Menu

private void onClick(Button btn) 
{ 
    //Toggles the button. 
    if (btn.HasCheckBox)//Whether the button has a checkbox 
    { 
     btn.Checked = !btn.Checked; 
    } 
    if (btn.Destination == "inGame") 
     unPause(); 
    else if (btn.Destination == "Quit") 
     Exit(); 
    else 
     openMenu(btn.Destination); 
} 

Небольшое пояснение здесь: Каждая кнопка имеет свойство назначения, то есть, где кнопка приводит, например, как: InGame, параметры, Quit и т.д.

Теперь здесь моя проблема:

Когда игра приостановлена, отображается меню, содержащее 3 кнопки (продолжение, параметры и выход).

Когда меню открыто и введено подменю, затем нажимается кнопка, после чего меню закрывается, а мышь не перемещается, а затем, когда я снова открываю меню, а мышь находится поверх кнопка Quit, игра закроется. Проверьте gif ниже для более четкого объяснения.

Это происходит только с Quit. Когда я пытаюсь выполнить ту же процедуру с другими кнопками, она не работает. {SEE EDIT 2}

Небольшая демонстрация: http://media.giphy.com/media/AxVvk9FgO6TOd5roEo/giphy.gif

я попробовать сначала с помощью кнопки music. закрыть и открыть меню - ничего не происходит. Я попробую его с кнопкой fullscreen, нажмите> закрыть> открыть меню повторно - игра завершается.

Почему кнопка нажата зарегистрированной на quit, но не на options? Спасибо за помощь. Прокомментируйте, если необходима дополнительная информация.


EDIT Видимо, это не имеет значения, где мышь при входе в меню опций. Пока клик сделан (в любом месте экрана), и после того, как экран меню открывается, мышь наводится над кнопкой, игра прекратится.

Как ни странно, я добавил новую кнопку под Quit, которая также приводит к меню опций. После тестирования того же поведения со второй кнопкой Option. Я не смог воспроизвести ошибку. Тем не менее, если я делаю то же самое с первой кнопкой Option, а во второй раз, он работает так же, как и с Quit - он мгновенно откроет экран параметров, как если бы он был нажат. Обновлено Gif: http://media.giphy.com/media/AxVvk60pK8NBjmghDa/giphy.gif


EDIT 2 суженного ошибка еще больше. При использовании foreach ошибка появляется только тогда, когда индекс второй кнопки больше, чем первый. Объяснение: Я нажал вторую кнопку, button[1] и работал только на button[2] и выше.

Это мой метод обновления:

if (isPaused) 
{ 
    foreach (var button in ButtonList) 
    { 
     if (MenuScreen == button.Parent)//Menuscreen is the current screen being displayed. 
//button.parent is the parent screen that holds current button. such as: ingame, pause, etc. 
     { 
      button.Update(); 
     } 
    } 
} 

Теперь я знаю, что логика позади него, но не там, где это происходит.

ответ

0

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

Вы можете переписать его вручную вручную или запустить его через что-то вроде jsbin, чтобы увидеть, что-нибудь покажется. (В jsbin он показывает красные периоды для невидимых символов.) Просто идея попробовать, если все остальное вам не поможет.

+0

проблема происходит только кнопки, которые имеют индекс выше, чем первая кнопка. В моем случае он работал для кнопки [1] 'на кнопку [2]', но не на кнопку [0] '. И после использования обратного цикла for он работал только с индексами ниже (например, 'button [1]' to 'button [0]' и т. Д.), – Val

0

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

В любом случае, я добавил условие в методе Update кнопки. Если переменная bool верна, обновите клики тоже. И если кнопки не видны или переменная ложна, обновляются только состояния мыши.

Решения:

if (isPaused) 
{ 
    foreach (var button in ButtonList) 
    { 
     if (MenuScreen == button.Parent) 
     { 
      button.Update(true); 
     } 
     else 
      button.Update(false); 
    } 
} 
Смежные вопросы