Прослушивание ввода ключа в wxErlang

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

2 ответа

Я не знаю много о 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
    ...

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

-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).

Целочисленное значение ключевого кода будет одним из этих 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()}).

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

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

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

Другие вопросы по тегам