我正在嘗試使用wxErlang在Erlang中製作一個小遊戲。我的主要功能是一個循環,我需要檢查循環開始時是否按下了特定的按鍵(上,下,左,右...)。我在網上找到的大多數解決方案都使用全局處理函數來處理事件,這不是我在這種情況下尋找的。有沒有辦法做到這一點?在wxErlang中傾聽關鍵輸入
3
A
回答
1
我對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
...
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);
至於什麼應該整數()是?
%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 ='更改爲以下四項之一。
-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. 傾聽完成不關閉軟鍵盤
- 2. 開始傾聽關鍵短語時說
- 3. 傾聽jQuery中
- 4. 傾聽聽衆
- 5. 在Web3j中傾聽事件
- 6. 聆聽鍵盤輸入
- 7. 傾聽活動
- 8. 在鍵盤快捷鍵中聽不到輸入聲音
- 9. 傾聽某些傳入的短信
- 10. 傾聽Chrome擴展
- 11. 讓Tornado傾聽Django
- 12. 傾聽進程Erlang
- 13. 傾聽所有CFNotifications?
- 14. 在javascript中輸入關鍵事件
- 15. 在SQL中輸入關鍵問題
- 16. 在wx.grid中輸入關鍵行爲
- 17. 在Python中是'輸入'關鍵字嗎?
- 18. 只聽特殊鍵的關鍵聽衆?
- 19. Flash專用於輸入的ActionScript2關鍵偵聽器?
- 20. 停止傾聽更多傾聽者事件
- 21. 聽取輸入鍵按下文本框
- 22. 如何在Processing.js中的update()中監聽鍵盤輸入
- 23. CKEDITOR.keystrokeHandler輸入關鍵行爲
- 24. wxErlang錯誤信息
- 25. Android:RadioGroup - 傾聽點擊事件
- 26. Parse.com傾聽註銷事件
- 27. 傾聽發送通知
- 28. Ldap:傾聽外部更改
- 29. JavaScript:傾聽屬性更改?
- 30. Postgresql通知和傾聽
如果您顯示當前版本(使用全局處理程序),或者在wxwidets或其他庫中實現預期結果或示例,也許會更好。 –
你的意思是檢查一個鍵是否被按下_now_或檢查鍵是否被按下? –
我認爲這對我來說不重要,但檢查自上次循環運行以來是否按了某個鍵可能會更容易處理。檢查它現在是否按下會很好,但它只是一個連續的循環,運行速度足夠快,所以我認爲這並不重要。 – Muibadorei