首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在wxErlang中侦听按键输入

在wxErlang中侦听按键输入
EN

Stack Overflow用户
提问于 2016-06-18 08:21:03
回答 2查看 256关注 0票数 2

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

EN

回答 2

Stack Overflow用户

发布于 2016-06-20 00:11:15

我对wxErlang了解不多,但是有一种方法可以收集在特定时间间隔到达的消息。它使用receive表达式的after子句。

代码语言:javascript
复制
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
    ...
票数 1
EN

Stack Overflow用户

发布于 2017-04-08 02:48:37

事件以记录形式的消息进入主接收循环:

代码语言:javascript
复制
-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
        }).

下面是您应该放入代码的主接收循环中的事件:

代码语言:javascript
复制
%%%
%% Event for Keyboard button press
%

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

% Your code where something happens

loop(State);

至于integer()应该是什么呢?

代码语言:javascript
复制
%from wx.hrl
-define(WXK_LEFT, 314).
-define(WXK_UP, 315).
-define(WXK_RIGHT, 316).
-define(WXK_DOWN, 317).

keyCode整数将是这4个整数之一,或其宏等效项。

一些背景

您感兴趣的特定事件是wxKey事件:

代码语言:javascript
复制
-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种之一。

代码语言:javascript
复制
-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 } }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37892072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档