如何在Haskell Gloss中隐藏鼠标光标

时间:2018-10-23 11:45:22

标签: haskell cursor mouse gloss

是否可以使用Haskell中的Gloss隐藏光标?我们要用鼠标位置替换播放器。

1 个答案:

答案 0 :(得分:1)

此功能不是用光泽显示的:如果Internal模块是暴露的,则可以更容易实现(通过使用例如playWithBackendIOBackend的某些自定义实例来隐藏)光标)。如果您确实需要此功能,最好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 modesMore modern versions do,但是我无法找到一种方法来获取Window实例,因为Gloss只是丢弃了它。