haskell - Haskell 的 SDL 库中的操纵杆事件处理

标签 haskell sdl joystick

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

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)上,按钮事件在程序执行的第一秒(或多或少)期间被捕获,然后什么也没有。我的代码有问题吗?

最佳答案

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

关于haskell - Haskell 的 SDL 库中的操纵杆事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417712/

相关文章:

c++ - 切换游戏杆 USB 端口时使用 joyGetPosEx 失败

haskell - 如何使用 GHC Haskell 在内存中对齐 ByteArray# 的数组有效负载

c++ - 在 OS X 10.8 上使用 SDL 2 启动速度非常慢

haskell - 使用 Gloss 运行模拟,同时使用 SDL 播放声音

c++ - 带 C++ 和 DirectInput 的 USB 操纵杆

c - 解释 USB 操纵杆轴

haskell - MonadBaseControl 有什么用?

haskell - 在解释器中实现命令式返回语句

haskell - 有没有办法在 Persistent Haskell 中没有任何过滤器或选择选项的情况下选择列表?

c++ - Linux 上的 SDL OpenGL 新手,这有什么问题?