
Hey, I am posting on this old topic because I did not have time in the mean time to concentrate on this in the past weeks and now I resume. On 10/01/2012 02:22 PM, Ertugrul Söylemez wrote:
Nathan Hüsken
wrote: But this does not do the accumulation every frame, but whenever an event happens.
That wire by itself does the accumulation at every frame, so you probably have an inhibiting wire earlier in the chain.
Let me restate my problem. My wire is this:
pos = accum (+) 0.0 . speed
and all I do is putStrLn the output at every frame.
As a side note, see testWire and testWireM in Control.Wire.Session. =)
If withing one frame where speed has the value (1) several events are sent over the wire (for example several keyup and keydown events for an unrelated key), then pos gets incremented for one for each of this events. So I have to prevent the accumulation if the event is not NoEvent.
That's because you're using constant time deltas. Even if your time frame has a constant rate you should still make use of your time deltas. In particular notice that Netwire can deal with time deltas of 0. Then instead of accum you would use integral_.
Yes, ok. But now I want to do something with collision detection and response. So I am trying the stanard FRP Pong example. For the ball I am using ballWire :: PaddleState BallState ballWire = proc ps -> do object_ collDet startState -< (Accelerate (0.0, 0.0), ps) where collDet paddle ball = doCollisionResponseWithPaddleAndWalls paddle ball now I do not want the doCollisionResponseWithPaddleAndWalls to be applied every time an input event is send over the wire but only when the Update event is fired. Now I could add the event type (or the time delta) to the "paddle" argument and test for it collDet (paddle, eventType) ball = if eventType = Update then doCollisionResponseWithPaddleAndWalls paddle ball else ball But this feels like an unnecessary effort ... Thanks! nathan