2012-08-16 31 views
0

我有一個事件SF Input (Event()),它表示鍵空間鍵。我有一些gravity和每次用戶釋放密鑰時,它必須在1(-1)之間切換。所以我這樣做:Yampa值開關

gravity <- accumHold 1 <<< (arr $ tag (*(-1))) <<< keyUp SDLK_SPACE -< ev 

但它做什麼,直到我再次按下鍵切換值上下對repeate。我不知道我在那裏做錯了什麼。

完整的來源被找到here,也許有人可以幫助我。

回答

1

答案顯然是使用一個開關:

gravity = dir 1 
dir x = switch (constant x &&& keyUp SDLK_SPACE) (const (dir (-x))) 

這當然也可以不通過映射在事件值的開關,但開關似乎是自然的解決方案。你也可以使用Netwire,這使它成爲一個簡單了很多:

hold (iterateW negate 1 . keyUp SDLK_SPACE) 

iterateW線將在Netwire 4.在那之前,你可以這樣寫:

hold (accum 1 . pure negate . keyUp SDLK_SPACE) 
+0

對不起,但你的'dir x'解決方案似乎會導致一個永久循環的空間泄漏(我的意思是,100%的CPU和我的RAM被吃掉了)。我沒有考慮過Netwire,它是否適用於SDL,還是我必須重新編寫該部分? – Lanbo 2012-08-17 07:49:08

+0

看來,工作到Netwire可能需要很長時間,由於缺乏適應性和文檔... – Lanbo 2012-08-17 08:05:13

+0

這似乎適用於Yampa:'dir x = accumHold x <<<(arr $ tagWith negate)<<< edge << Lanbo 2012-08-18 09:03:25