events - teatro - Agregar interacción a un gráfico de escena(en Haskell)
libreto de actuacion (1)
He creado un motor de renderizado funcional de gráficos de escenas en Haskell y me pregunto cómo agregar interacción a la mezcla.
Al principio, pensé que podría tener otro nodo Handler que tome uno de los otros nodos y luego aplicarle algunos IORefs. Por ejemplo, si tuviera
x,y,z <- IORef 0
KeyboardHandler KeyboardCallBack $ Translate x y z $ Object
Al atravesar, tendría
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
¿Es posible hacer algo así o voy completamente mal?
Ese enfoque podría funcionar, pero hay mejores maneras. Me gustó especialmente el ejemplo GLFW-b que utilizó algo llamado TQueue
.
TQueue
es la abreviatura de Cola transaccional; es algo que puede pasar eventos desde el hilo de renderizado, y luego leerlos desde el hilo de dibujo. De esta forma, puede procesarlos como si fueran un valor simple y puro; una lista de eventos.
En general, Haskell favorece la operación pura a estado mutable. Los marcos de representación disponibles enfatizan la transformación pura del estado lógico a material en la pantalla. Sin embargo, en este caso, algo así como una mónada State OSG
probablemente estaría bien.