3

netwire-4.0.7 の使用

質問のタイトルが示すように、他のオブジェクトから「跳ね返る」位置を生成するワイヤを作成しようとしています (各ステップで特定の速度で位置を移動します)。私が考えることができる最も単純な例は、いくつかのスクリーン セーバーのように、ボックス内を移動することでした。

私はまさにそれを行う試みとしてこの関数を書きました(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理由はわかりません. 遅延を間違って使用している可能性があると思います。

4

2 に答える 2

2

ああ、BASIC とアセンブラを組み合わせて 8 ビット ゲームを書いていた日々の知識を再利用するチャンスです!

おそらく何が起こっているかというと、丸め誤差のために「ボール」が壁の反対側に引っかかっているということです。したがって、壁が 10.0 の場合、ボールは v=-1.0、+1.0、-1.0 などで 11.0001 と 10.0001 の間で振動します。ワイヤーで確認するために位置を印刷する方法がわかりません。

(古代の)記憶から、前のステップからの「残りの」ベクトルを含むバウンスを計算するか、バウンドする前にボールを壁に正確に配置する必要があります。

于 2013-08-22T15:03:14.197 に答える