2015-04-09 1 views
4

J'ai créé un moteur de rendu de graphes de scène dans Haskell et je me demande comment ajouter une interaction au mélange. Dans un premier temps, j'ai pensé que je pouvais juste avoir un autre nœud Handler qui prend dans l'un des autres nœuds et ensuite il suffit de lui appliquer des IORefs. Par exemple, si je devaisAjouter une interaction dans un graphe de scène (dans Haskell)

x,y,z <- IORef 0 
KeyboardHandler KeyboardCallBack $ Translate x y z $ Object 

En traversant, j'aurais

KeyboardHandler keyboard drawable -> case drawable of 
Translate x y z _ -> do 
(Char 'q') -> x $~! (-1) 
(Char 'w') -> x $~! (+1) 
(Char 'a') -> y $~! (-1) 
(Char 's') -> y $~! (+1) 
(Char 'z') -> z $~! (-1) 
(Char 'x') -> z $~! (+1) 
render drawable 

Est-il possible de faire quelque chose comme ça ou je vais complètement dans le mauvais sens?

Répondre

1

Cette approche pourrait fonctionner, mais il existe de meilleurs moyens. J'ai particulièrement aimé GLFW-b example qui a utilisé quelque chose appelé TQueue.

TQueue est l'abréviation de Transactional Queue; C'est quelque chose dans lequel vous pouvez passer des événements depuis le thread de rendu, puis les lire depuis le fil de dessin. De cette façon, vous pouvez les traiter comme s'ils étaient une valeur simple et pure; une liste d'événements.

En général, Haskell préfère l'opération pure à l'état mutable. Les cadres de rendu disponibles mettent l'accent sur la transformation pure de l'état logique en éléments à l'écran. Dans ce cas, quelque chose comme une monade State OSG serait probablement OK, cependant.

+0

Je ne suis pas sûr de l'avoir. Donc, je ne voudrais pas utiliser IORefs alors, je suppose (idéalement, je préfère ne pas le faire). Cependant, je ne suis pas sûr de savoir comment je les utiliserais dans mon graphe de scène. Comment pourrais-je mettre en œuvre quelque chose du demandé? Merci, btw! – Gentatsu

+1

@Gentatsu 'TQueue' est, à l'intérieur, un wrapper' IORef' intelligent. –

+0

Je ne sais toujours pas comment je l'utiliserais, cependant? L'exemple de GLFW-b semble assez spécifique, donc je ne suis pas sûr de savoir comment je pourrais l'extraire. – Gentatsu