2012-07-21 101 views
2

我想在Yampa有一個粒子場。單個粒子應該沿直線移動,但取決於給定的角度。角度和移動速度根據玩家的速度和角度而變化。我不知道如何更好地解釋,我正在開發類似於this game的東西。Yampa粒子場

不管怎樣,我現在的代碼如下所示:

star :: (Float, Float) -> SF (Float, Float) (Float, Float) 
star p0 = proc (vel, a) -> do 
    rec 
     v <- integral -< vel *^ (cos a, sin a) 
     p <- clampS ^<< (p0 ^+^) ^<< integral -< v ^+^ p 
    returnA -< p 

clampS [email protected](x, y) | x > 1 = (x-2, y) 
       | x < (-1) = (x+2, y) 
       | y > 1 = (x, y-2) 
       | y < (-1) = (x, y+2) 
       | otherwise = s 

vel是當前的速度,a是當前的角度。但粒子以很奇怪的方式移動。 (全碼here

不幸的是,我相信我在一個錯誤的方式思考,但我還沒能弄清楚如何做到這一點,尤其是如何正確使用integral

也許有人可以給。我一些提示

+0

我不知道什麼是理想的行爲,但是你的速度v總是在增加,si因爲你的右邊也有p,所以你的建築是一個不變的整體。所以我認爲你的粒子已經在第二秒內消失了...... – martingw 2012-07-21 14:31:41

+0

究竟是什麼問題......你對'p'的建議是什麼? – Lanbo 2012-07-21 15:45:47

回答

1

與@martingw的小提示,我能煮了這一點,這是相當有什麼我一直在尋找:

star :: (Float, Float) -> SF (Float, Float) (Float, Float) 
star p0 = proc (a, vel) -> do 
    let (vx,vy) = vel *^ (cos a, sin a) 
    p <- clampS ^<< (p0 ^+^) ^<< integral -< (-vx,vy) 
    returnA -< p 

clampS (x, y) = (x `fMod` 800, y `fMod` 600) 
+0

請注意,你建立起來的是一個很大的積分,然後你再鉗。如果您稍後想要減慢恆星速度,則需要很長時間才能看到效果。我在模擬球時遇到了類似的問題......我可以向您發送您感興趣的代碼段ID。 – martingw 2012-07-21 18:55:32

+0

我改變了'clampS',見上面......我慢慢地對這個Yampa東西有了一種感覺,儘管我覺得我對我的執着感到孤單。 – Lanbo 2012-07-22 07:40:54

+0

我的經驗是建立一些直覺需要一段時間,特別是在iPre等功能方面。不過,郵件列表非常有幫助。 – martingw 2012-07-22 12:11:38