是否可以使用Haskell中的Gloss隐藏光标?我们要用鼠标位置替换播放器。
答案 0 :(得分:1)
此功能不是用光泽显示的:如果Internal
模块是暴露的,则可以更容易实现(通过使用例如playWithBackendIO
和Backend
的某些自定义实例来隐藏)光标)。如果您确实需要此功能,最好fork the project并添加所需的功能。
尽管有一些变通方法,但没有修改原始包:使用任何...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
值并自动更新过剩上下文。我们只想运行一次,所以我们使用IORef
来跟踪我们是否曾经运行过它。
最后,这不适用于GLFW后端。光泽使用very old version of GLFW-b which doesn't support anything to do with cursor modes。 More modern versions do,但是我无法找到一种方法来获取Window
实例,因为Gloss只是丢弃了它。