我正在尝试用Erlang做一个小游戏,使用wxErlang。我的主函数是一个循环,我需要检查在循环开始时是否按下了特定的键(向上、向下、向左、向右...)。我在网上找到的大多数解决方案都使用全局事件处理函数,这不是我在本例中要找的。有没有办法做到这一点?
发布于 2016-06-20 00:11:15
我对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
...发布于 2017-04-08 02:48:37
事件以记录形式的消息进入主接收循环:
-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()}).当关键事件发生时,您还需要将这些值添加到元组和模式匹配中。这使您能够真正钻研您感兴趣的确切事件。生成的记录将具有与其类型等效的值。也就是说,并不是所有的关键事件都具有上述所有的值。您可以将初始的“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 } }意识到你对可能发生的事情有相当多的控制权。
https://stackoverflow.com/questions/37892072
复制相似问题