Tôi đang cố gắng mô phỏng một quả bóng nảy với khung hình Yampa: Với một vị trí x ban đầu, chiều cao và vận tốc, quả bóng sẽ bị trả lại theo các quy tắc trọng lực. Chức năng tín hiệu có một "Tip-Sự kiện" là đầu vào, ý tưởng là "khi bóng được lật, tốc độ của nó sẽ tăng gấp đôi".Tại sao quả bóng Yampa nảy vào vòng lặp vô tận?
Quả bóng bị trả lại độc đáo, nhưng mỗi khi có sự kiện lật, chức năng sẽ chuyển sang vòng lặp vô tận. Tôi figured tôi có lẽ cần phải thêm một sự chậm trễ (dSwitch, trước, notYet?), Nhưng tôi không biết làm thế nào. Bất kỳ trợ giúp sẽ được đánh giá cao!
{-# LANGUAGE Arrows #-}
module Ball where
import FRP.Yampa
type Position = Double
type Velocity = Double
type Height = Double
data Ball = Ball {
height :: Height,
width :: Position,
vel :: Velocity
} deriving (Show)
type Tip = Event()
fly :: Position -> (Height, Velocity) -> SF Tip (Ball, Event (Height,Velocity))
fly w0 (h0, v0) = proc tipEvent -> do
let tip = (tipEvent == Event())
v <- (v0+) ^<< integral -< -10.0
h <- (h0+) ^<< integral -< v
returnA -< (Ball h w0 v,
if h < 0 then Event (0,(-v*0.6))
else if tip then Event (h, (v*2))
else NoEvent)
bounce w (h,v) = switch (fly w (h,v)) (bounce w)
runBounce w (h,v) = embed (bounce 10 (100.0, 10.0)) (deltaEncode 0.1 [NoEvent, NoEvent, NoEvent, Event(), NoEvent])
EDIT: Tôi quản lý để tránh các vòng lặp vô tận bằng cách cho ăn trở lại một lá cờ khi một mẹo xảy ra, nhưng điều đó vẫn không cảm thấy như đúng cách để làm điều đó ...
fly :: Position -> (Height, Velocity, Bool) -> SF Tip (Ball, Event (Height,Velocity,Bool))
fly w0 (h0, v0, alreadyTipped) = proc tipEvent -> do
let tip = tipEvent == Event() && (not alreadyTipped)
v <- (v0+) ^<< integral -< -10.0
h <- (h0+) ^<< integral -< v
returnA -< (Ball h w0 v,
if h < 0 then Event (0,(-v*0.6), False)
else if tip then Event (h, (v*2), True)
else NoEvent)
bounce w (h,v,alreadyTipped) = switch (fly w (h,v,alreadyTipped)) (bounce w)
iirc được mô tả trong giấy Yampa Arcade. –