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