3

wxErlang を使用して、Erlang で小さなゲームを作ろうとしています。私の主な機能はループであり、ループの開始時に特定のキーが押されたかどうかを確認する必要があります (上、下、左、右...)。私がオンラインで見つけたソリューションのほとんどは、イベントにグローバル ハンドラー関数を使用していますが、これは、この場合、私が探しているものではありません。これを行う方法はありますか?

4

2 に答える 2

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
    ...
于 2016-06-19T16:11:14.840 に答える
1

イベントは、レコード形式のメッセージとしてメインの受信ループに入ります。

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

integer() はどうあるべきですか?

%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=' を以下の 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 } }

何が起こるかについて、あなたにはかなりの指揮権があることを認識してください。

于 2017-04-07T18:48:36.800 に答える