Прослушивание ввода ключа в 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 } }
Поймите, у вас есть немного команд над тем, что может произойти.