2016-06-18 31 views
3

我正在嘗試使用wxErlang在Erlang中製作一個小遊戲。我的主要功能是一個循環,我需要檢查循環開始時是否按下了特定的按鍵(上,下,左,右...)。我在網上找到的大多數解決方案都使用全局處理函數來處理事件,這不是我在這種情況下尋找的。有沒有辦法做到這一點?在wxErlang中傾聽關鍵輸入

+0

如果您顯示當前版本(使用全局處理程序),或者在wxwidets或其他庫中實現預期結果或示例,也許會更好。 –

+0

你的意思是檢查一個鍵是否被按下_now_或檢查鍵是否被按下? –

+0

我認爲這對我來說不重要,但檢查自上次循環運行以來是否按了某個鍵可能會更容易處理。檢查它現在是否按下會很好,但它只是一個連續的循環,運行速度足夠快,所以我認爲這並不重要。 – Muibadorei

回答

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 } } 

意識到你對可能發生的事情有相當多的指令。