質問のタイトルが示すように、他のオブジェクトから「跳ね返る」位置を生成するワイヤを作成しようとしています (各ステップで特定の速度で位置を移動します)。私が考えることができる最も単純な例は、いくつかのスクリーン セーバーのように、ボックス内を移動することでした。
私はまさにそれを行う試みとしてこの関数を書きました(1つの軸のみ):
import Control.Wire
bouncyWire :: Double -> Double -> Double -> Double -> Wire () IO a Double
bouncyWire startPosition startVelocity lowerBound upperBound = proc _ -> do
rec
v <- delay startVelocity -< if p < lowerBound || p > upperBound
then -v else v
p <- integral_ startPosition -< v
returnA -< p
(実際には別のモナドで使用していますが、このコードは実際には使用しておらず、ここでの問題を過度に複雑にします)。
しかし、それを踏むとcounterSession $ 1/60
、問題が発生します-壁から「跳ね返る」のではなく、そこで立ち往生します。何が起こるかは、速度が何度も反転し続けることだと思いますが、そのv
理由はわかりません. 遅延を間違って使用している可能性があると思います。