2016-10-30 9 views
0

私は、動きを含むpurescript-signalを使用して、Purescriptでゲームを構築しています。ユーザは、左右キーを押して左右に移動する。最小限のコードは以下のとおりです。Purescriptシグナルは、最初から繰り返し始まります。

purescriptは、私を困惑させるすべてのステップで「時間の始めから」信号を評価しているようです。私が先頭に右キーを押し続ける場合、私が期待するよう例えば、出力が

m: 0 
m: 0 
m: 1 
m: 0 
m: 1 
m: 2 
m: 0 
m: 1 
m: 2 
m: 3 

ではなく

m: 0 
m: 1 
m: 2 
m: 3 

です。これをどうやって解決するのですか?

module SimpleMove where 

import Prelude 
import Control.Monad.Eff (Eff) 
import Control.Monad.Eff.Console (CONSOLE, log) 
import Data.Functor 
import Data.Int 
import Signal (Signal, runSignal, foldp, sampleOn, map2) 
import Signal.DOM (keyPressed) 
import Signal.Time (Time, second, every) 
import Partial.Unsafe (unsafePartial) 

--MODEL 
type Model = Int 

step :: forall e. Partial => Int -> Eff (console :: CONSOLE | e) Model -> Eff (console :: CONSOLE| e) Model 
step dir m' = 
    do 
    m <- m' 
    log ("m: " <> (show m)) 
    pure (m + dir) 

--SIGNALS 
inputDir :: Eff _ (Signal Int) 
inputDir = 
    let 
     f = \l r -> if l 
        then -1 
        else if r 
         then 1 
         else 0 
    in 
     map2 f <$> (keyPressed 37) <*> (keyPressed 39) 

input :: Eff _ (Signal Int) 
input = sampleOn (every second) <$> inputDir 

--MAIN 
main :: Eff _ Unit 
main = 
    unsafePartial do 
     dirSignal <- input 
     let game = foldp step (pure 0) dirSignal 
     runSignal (map void game) 

答えて

2

あなたはこのようなあなたのmainstepを変更する場合は、期待した結果得られます。

main :: Eff _ Unit 
main = do 
     dirSignal <- input 
     let game = foldp step 0 dirSignal 
     runSignal (map render game) 

step :: forall e. Int -> Model -> Model 
step dir m = m + dir 

render :: forall e. Model -> Eff (console :: CONSOLE| e) Unit 
render m = logShow m 
関連する問題