首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使你的游戏角色相应地移动?

如何使你的游戏角色相应地移动?
EN

Stack Overflow用户
提问于 2022-03-26 09:55:41
回答 1查看 123关注 0票数 0

我目前正试图在haskell中使用终端中的hscurses创建一个类似蛇的游戏,而且我在实现游戏的输入功能方面遇到了一些困难。我的问题是,每当我按住其中的一个移动键,例如'a',字符移动到左边的多少个字符是由控制台注册的。这导致当我想要切换方向,例如向下按's',字符继续向左移动,向下移动被延迟。

代码语言:javascript
复制
res :: Int -> IO a -> IO (Maybe a)
res n f = concurrently (System.Timeout.timeout n f) (threadDelay n) >>= \(result, _) -> return 
result

getInput :: IO Char
getInput = hSetEcho stdin False 
>> hSetBuffering stdin NoBuffering
>> getChar

以及主游戏循环函数中处理输入的部分:

代码语言:javascript
复制
loop :: Window -> State -> Player -> IO State
loop window state player = do
    threadDelay 1000000
    k <- res 100 getInput
    newState <- updateState player state
    newPlayer <- movePlayer player k
    render newState newPlayer window

和movePlayer函数:

代码语言:javascript
复制
movePlayer :: Player -> Maybe Char -> IO Player
movePlayer Player {xy=xy1, direction = d} k =
    case k of
        Just 'w' -> return Player {xy = (fst xy1, snd xy1-1), direction = Up}
        Just 's' -> return Player {xy = (fst xy1, snd xy1+1), direction = Downie}
        Just 'd' -> return Player {xy = (fst xy1+1, snd xy1), direction = Rightie}
        Just 'a' -> return Player {xy = (fst xy1-1, snd xy1), direction = Leftie}
        Nothing -> return Player {xy = addVecs xy1 (dirToVec d), direction = d}
        _ -> return Player {xy = xy1, direction = d}

我不知道是什么问题,所以任何帮助都很感激,或者是否有另一种方法来实现这种输入功能。

EN

回答 1

Stack Overflow用户

发布于 2022-03-26 13:25:10

目前,您的输入循环和状态更新循环是绑定在一起的:每次更新最多只接受一个输入。你需要让他们脱钩。

低技术的替代方法是更改当前拥有res 100 getInput的位置,以便在循环中实际运行getInput,并且只保留它在阻塞之前接收到的最后一个Char。中等技术的替代方案是有两个线程,一个用于读取输入,另一个用于执行状态更新,使用共享的MVar或类似的说法,即按下最后一个键。高科技的替代方法是使用像砖块这样的库来处理所有的输入和输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71626990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档