6

我的网络如下所示:

ePhysics :: Event t ()
bPlayerForce :: Behavior t (Double,Double)
bPlayerPosition :: Behavior t (Double, Double)

ePhysics从计时器重复触发。
我在定义bPlayerPosition. 我的意图是它将从 开始(0,0),并且每当ePhysics被触发时,bPlayerPosition将使用bPlayerForce作为参数重新计算。

问题在于,为了指定我需要使用的初始值accumB/stepper但它们仅适用于事件,并且我无法从中获取力值,bPlayerForce因为只有行为才能获取其他行为的值(使用<*>)。

另一种方法是使用<*>,但我没有初始值,所以它变成了无意义的无限递归:

let bPlayerPosition = pure calcPosition <*> bPlayerForce <*> bPlayerPosition

我有3个问题:

  1. 有没有办法从没有的行为中获得价值<*>?比如,在reactimateing 或映射事件时?从一开始,无法解决的问题就一直困扰着我。
  2. 会有更实用/frp 的方式来做物理吗?(一般来说和特定于问题的那些)
  3. 我该如何解决提出的问题?
4

1 回答 1

5
  1. 组合器(apply也称为<@>)及其变体<@提供了一种在事件发生时对行为进行采样的方法。
  2. 在我看来很好。Animation.hs示例做了类似的事情。ePhysics您必须通过对事件给出的离散时间步骤求和来近似积分。
  3. 类似的东西

    let bPlayerPosition = stepper (0,0) $
            (calcPosition <*> bPlayerForce <*> bPlayerPosition) <@ ePhysics
    
于 2014-08-12T09:17:51.957 回答