2012-07-21 2 views
2

Je veux avoir un champ de particules dans Yampa. La particule unique devrait simplement se déplacer en ligne droite, mais en fonction d'un angle donné. Cet angle et la vitesse de déplacement varient en fonction de la vitesse et de l'angle du joueur. Je ne sais pas comment mieux expliquer, je développe quelque chose de similaire à this game.Yampa Particle Field

Quoi qu'il en soit, mon code pour ressemble maintenant à ceci:

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 est la vitesse actuelle, a est l'angle actuel. Mais les particules se déplacent, bien, d'étranges manières. (Code complet here

Malheureusement, je suis sûr que je pense à une mauvaise façon, mais je n'ai pas encore été en mesure de savoir comment faire, en particulier comment l'utilisation integral correctement.

Peut-être que quelqu'un peut donner . moi quelques conseils

+0

Je ne sais pas ce qui est le comportement souhaité, mais votre vitesse v augmente toujours, si nce votre construction est une intégrale par rapport à une constante, et la position augmente rapidement parce que vous avez aussi p sur le côté droit. Donc, je pense que votre particule est partie en une seconde ... – martingw

+0

Quel est exactement le problème ... quelle est votre suggestion sur 'p'? – Lanbo

Répondre

1

Avec le petit soupçon de @martingw, j'ai pu concocter ce qui est tout à fait ce que je cherchais:

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

Notez juste que vous construisez sont grandes intégrales que vous pincez plus tard. Si vous voulez plus tard ralentir l'étoile, il faudra beaucoup de temps avant de voir un effet. J'ai eu des problèmes similaires lors de la modélisation d'une balle ... Je peux vous envoyer un code d'identification qui vous intéresse. – martingw

+0

J'ai changé 'clamps', voir ci-dessus ... Je commence à avoir une petite idée de ce truc de Yampa, même si je sens que je suis tout seul avec ma persuasion. – Lanbo

+0

Mon expérience a été qu'il faut un certain temps pour construire une certaine intuition, en particulier avec les fonctions iPre etc. La liste de diffusion est très utile, cependant. – martingw