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

4
在Haskell中使用Gloss是否可以隐藏鼠标光标?我们想要用鼠标位置替换玩家。
1个回答

1
这个功能并没有被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 来跟踪是否已经运行过。
最后,这在 GLFW 后端上不起作用。gloss 使用 非常旧的 GLFW-b 版本,不支持任何与光标模式有关的内容更现代的版本支持,但我找不到一种方法来获取 Gloss 丢弃的 Window 实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接