Эта функциональность не отображается глянцем: было бы легче достичь, если бы были выставлены модули Internal
(например, с помощью playWithBackendIO
и некоторых пользовательских экземпляров Backend
чтобы скрыть курсор).Если вы действительно хотите эту функциональность, было бы * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
.любая из
...IO
функций, мы можем выполнять произвольные
IO
действия внутри функций, которые мы передаем, что позволяет нам изменять состояние бэкэнда.
Я собираюсь использовать здесь displayIO
для простоты, но это работает для любого из режимов, таких как playIO
и т. д.
import Prelude hiding (init)
import Control.Monad
import Data.IORef
import Data.StateVar
import Graphics.Gloss
import Graphics.Gloss.Interface.IO.Display
import qualified Graphics.UI.GLUT.Window as Glut
init :: IO ()
init = Glut.cursor $= Glut.None
render :: IORef Bool -> IO Picture
render doneInit = do
needsInit <- not <$> readIORef doneInit
when needsInit $ do
init
writeIORef doneInit True
return $ color white $ circle 30
controllerCallback :: Controller -> IO ()
controllerCallback _ = return ()
main :: IO ()
main = do
let disp = InWindow "test" (800, 600) (0, 0)
initVar <- newIORef False
displayIO disp black (render initVar) controllerCallback
Жизненно важным элементом является Glut.cursor $= Glut.None
, который устанавливает значение GLUT cursor
, используя StateVar's $=
функция и автоматически обновляет контекст перенасыщения.Мы хотим запустить его только один раз, поэтому мы используем IORef
, чтобы отслеживать, запускали ли мы его раньше.
Наконец, это не работает для бэкэнда GLFW.gloss использует очень старую версию GLFW-b, которая не поддерживает ничего общего с режимами курсора . Более современные версии делают , но я не смог найти способ получить экземпляр Window
, так как Gloss просто отбрасывает его.