在Haskell中使用Gloss是否可以隐藏鼠标光标?我们想要用鼠标位置替换玩家。
Internal
模块(例如使用playWithBackendIO
和一些自定义的Backend
实例来隐藏光标),那么这个功能将更容易实现。如果你真的需要这个功能,最好是fork这个项目并添加你想要的功能。
虽然不需要修改原始包,但有一些解决方法:当使用任何...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
,使用 StateVar 的 $=
函数设置 GLUT 的 cursor
值,并自动更新 glut 上下文。我们只想运行一次,因此我们使用 IORef
来跟踪是否已经运行过。Window
实例。