2012-08-16 7 views
0

J'ai un événement SF Input (Event()) qui représente la clé de la touche d'espace. J'ai quelques gravity et chaque fois que l'utilisateur relâche la clé, il doit basculer entre 1 et (-1). Alors je l'ai fait:Commutateur de valeur Yampa

gravity <- accumHold 1 <<< (arr $ tag (*(-1))) <<< keyUp SDLK_SPACE -< ev 

Mais ce qu'il fait est la valeur de commutation et vers le bas sur repeate jusqu'à ce que j'appuie sur la touche. Je n'ai aucune idée d'où j'ai mal fait là-bas.

La source complète est trouvée here, peut-être que quelqu'un peut m'aider.

Répondre

1

La réponse évidente est d'utiliser un commutateur:

gravity = dir 1 
dir x = switch (constant x &&& keyUp SDLK_SPACE) (const (dir (-x))) 

Ceci est certainement aussi possible sans un interrupteur par correspondance sur les valeurs d'événement, mais le commutateur semble être la solution naturelle. Vous pouvez également utiliser Netwire, ce qui en fait beaucoup plus simple:

hold (iterateW negate 1 . keyUp SDLK_SPACE) 

Le fil iterateW sera disponible en Netwire 4. En attendant, vous pouvez l'écrire de cette façon:

hold (accum 1 . pure negate . keyUp SDLK_SPACE) 
+0

Je suis désolé, mais votre solution 'dir x' semble conduire à une fuite d'espace avec une boucle éternelle (je veux dire, 100% CPU et ma RAM est mangée). Je n'ai pas considéré Netwire, ça marche bien avec SDL ou dois-je réécrire cette partie? – Lanbo

+0

Il semble que travailler sur Netwire pourrait prendre des années à cause du manque d'adaptation et de documentation ... – Lanbo

+0

Cela semble fonctionner pour Yampa: 'dir x = accumHold x <<< (arr $ tagWith nier) <<< edge << Lanbo