2016-06-18 4 views
3

Я пытаюсь сделать небольшую игру в Эрланге, используя wxErlang. Моя основная функция - это цикл, и мне нужно проверить, был ли задан конкретный ключ в начале цикла (вверх, вниз, влево, вправо ...). Большинство решений, которые я нашел в Интернете, используют глобальную функцию обработчика событий, и это не то, что я ищу в этом случае. Есть какой-либо способ сделать это?Прослушивание ввода ключа в wxErlang

+0

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

+0

Вы хотите проверить, нажата ли клавиша _now_ или проверка, нажата ли клавиша _just_? –

+0

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

ответ

1

Я не знаю много о wxErlang, но есть способ, как собирать сообщения, которые поступают в определенный промежуток времени. Он использует предложение after выражения receive.

collect() -> 
    collect([]). 

collect(Acc) -> 
    receive 
     {my_msg, _} = Msg -> 
      collect([Msg|Acc]) 
    after 0 -> 
     lists:reverse(Acc) 
    end. 

main() -> 
    ..., 
    _ = collect(), % clean message box or previous loop 
    ..., 
    Msgs = collect(), % messages arrived after last collect/0 
    ... 
0

События приходят в основной приеме цикл в виде сообщений в виде записей:

-record(wx, { id :: integer(),   %% Integer Identity of object. 
       obj :: wx:wx_object(), %% Object reference that was used in the connect call. 
      userData :: term(),   %% User data specified in the connect call. 
       event :: event()   %% The event record 
     }). 

Вот это событие, вы должны поместить в основную получить петлю коды:

%%% 
%% Event for Keyboard button press 
% 

    #wx{ id = _ , event = #wxKey{ type = key_down , 
           keyCode = integer()} 
                   }) -> 

% Your code where something happens 

loop(State); 

Что касается целого числа()?

%from wx.hrl 
-define(WXK_LEFT, 314). 
-define(WXK_UP, 315). 
-define(WXK_RIGHT, 316). 
-define(WXK_DOWN, 317). 

Целочисленный ключ KeyCode будет одним из этих 4 или его макроэквивалентом.

Некоторые предпосылки

Конкретное событие вы заинтересованы в это wxKey событие:

-record(wxKey, {type :: wxKeyEventType(), %% Callback event: {@link wxKeyEvent} 
        x :: integer(), 
        y :: integer(), 
       keyCode :: integer(), 
      controlDown :: boolean(), 
      shiftDown :: boolean(), 
       altDown :: boolean(), 
       metaDown :: boolean(), 
       scanCode :: boolean(), 
       uniChar :: integer(), 
       rawCode :: integer(), 
       rawFlags :: integer()}). 

Когда ключевые события приходят, вы дополнительно эти значения, чтобы добавить к этому кортеж и шаблон матча против. Это дает вам возможность действительно натолкнуться на точное событие, которое вас интересует. Созданная запись будет иметь значения, эквивалентные ее типу. То есть не все события Key имеют все вышеуказанные значения. Вы можете изменить этот начальный «тип =» на один из приведенных ниже.

-type wxKeyEventType() :: char     %% #wx{ event = #wxKey{ type = char } } 
         | char_hook   %% #wx{ event = #wxKey{ type = char_hook } } 
         | key_down    %% #wx{ event = #wxKey{ type = key_down } } 
         | key_up.    %% #wx{ event = #wxKey{ type = key_up } } 

Поймите, что у вас есть довольно определенная команда над тем, что может случиться.