在wxErlang中侦听键输入

在wxErlang中侦听键输入,erlang,wxwidgets,wxerlang,Erlang,Wxwidgets,Wxerlang,我正在尝试使用wxErlang在Erlang中制作一个小游戏。我的主要功能是循环,我需要检查循环开始时是否按下了特定的键(上、下、左、右…)。我在网上找到的大多数解决方案都使用全局事件处理函数,这不是我在本例中要寻找的。有什么方法可以做到这一点吗?我对wxErlang知之甚少,但有一种方法可以收集在特定时间间隔内到达的消息。它使用receive表达式的after子句 collect() -> collect([]). collect(Acc) -> receive

我正在尝试使用wxErlang在Erlang中制作一个小游戏。我的主要功能是循环,我需要检查循环开始时是否按下了特定的键(上、下、左、右…)。我在网上找到的大多数解决方案都使用全局事件处理函数,这不是我在本例中要寻找的。有什么方法可以做到这一点吗?

我对
wxErlang
知之甚少,但有一种方法可以收集在特定时间间隔内到达的消息。它使用
receive
表达式的
after
子句

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);
至于整数()应该是什么

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()}).
当关键事件出现时,您还需要将这些值添加到元组中,并根据这些值进行模式匹配。这使你能够真正磨练你感兴趣的确切事件。生成的记录将具有与其类型等效的值。也就是说,并非所有关键事件都具有上述所有值。您可以将初始“type=”更改为下面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 } }

意识到您对可能发生的事情有相当多的控制权。

如果您显示当前版本(使用全局处理程序),可能会更好或者描述在wxwidets或其他库中实现的预期结果或示例。您是指检查现在是否按下某个键,还是检查刚刚按下该键?我认为这对我来说并不重要,但检查自上次循环运行以来是否按下某个键可能更容易操作。检查它是否现在被按下将是好的,但它只是一个连续的循环,它运行速度足够快,我认为这不会有什么关系。
-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 } }