【问题标题】:Joystick event handling in Haskell's SDL libraryHaskell 的 SDL 库中的操纵杆事件处理
【发布时间】:2025-12-09 09:45:01
【问题描述】:

我正在尝试编写一个小程序,使用 Haskell SDL 绑定检测视频游戏控制器上的按钮输入。我的程序相当简单:

import Control.Monad (forever, when)
import System.Exit (exitSuccess)
import Data.Time.Clock.POSIX (getPOSIXTime)

import qualified Graphics.UI.SDL.General  as SG
import qualified Graphics.UI.SDL.Events   as SE
import qualified Graphics.UI.SDL.Joystick as SJ
import qualified Graphics.UI.SDL.Video    as SV
import qualified Graphics.UI.SDL.Types    as ST


main :: IO ()
main =
  SG.withInit [SG.InitVideo, SG.InitJoystick] $ do
    -- Open joystick.  We assume it's always present.
    numJoysticks <- SJ.countAvailable
    putStrLn $ show numJoysticks ++ " joystick(s) available"
    js <- SJ.open 0

    -- Create window
    SV.setVideoMode 320 240 24 [ST.SWSurface, ST.Resizable]

    -- Handle events
    forever $ do
      evt <- SE.waitEvent
      case evt of
        SE.JoyButtonDown dev btn -> do
                 t <- getPOSIXTime
                 print (show t ++ " - Button pressed: " ++ show dev ++ " " ++ show btn)
        SE.Quit -> exitSuccess
        _ -> return ()

在我的系统(Debian stable,GHC 7.4,libghc-sdl-dev 0.6.3)上,按钮事件在程序执行的第一秒(或多或少)期间被捕获,然后什么也没有。我的代码有问题吗?

【问题讨论】:

  • 无关注意:您不必为所有 sdl 模块指定不同的名称。您可以为所有这些import qualified TheModule as SDL 访问它们的所有功能,然后以SDL.f 的身份访问它们的所有功能 - 您不会在 SDL 本身内遇到任何命名空间冲突。

标签: haskell sdl joystick


【解决方案1】:

forever 块之后添加 SJ.close js。我相信当 Haskell 认为不再需要操纵杆时,它会自动关闭。

【讨论】:

    最近更新 更多