gpt4 book ai didi

Haskell Gloss - 每按下一帧键就做一些事情

转载 作者:行者123 更新时间:2023-12-04 13:20:58 24 4
gpt4 key购买 nike

我想在 Haskell Gloss 中移动一个对象,每帧按下一个键,而不仅仅是开始按下键的那一帧。 (示例:按下“w”键时,每帧加速对象)

编辑:我尝试使用 EventKey 的第二个参数但无济于事。

我的代码:

--TODO - Holding keys doesn't work yet
handleKeys :: Event -> AsteroidsGame -> AsteroidsGame
handleKeys (EventKey (Char char) _ _ _) game
| char == 'w' = move 0 1
| char == 'a' = move (-1) 0
| char == 's' = move 0 (-1)
| char == 'd' = move 1 0
where move x y = game {player = accelerateObject (player game) x y}
handleKeys _ game = game

accelerateObject :: Object -> Float -> Float -> Object
accelerateObject obj hor ver = obj {vel = (vx + hor, vy + ver)}
where (vx, vy) = vel obj

最佳答案

正如 OP 正确推断的那样,gloss 为您提供输入事件(“刚刚按下键”,“刚刚移动鼠标”),而不是输入状态(“当前按下键”,“鼠标位于 x,y”)。似乎没有内置的方法可以查看每一帧的输入状态,因此我们必须制定自己的解决方法。谢天谢地,这并不太难!

对于一个简单的工作示例,我们将制作一个非常有趣的“游戏”,您可以在按下空格键的同时观看计数器向上计数。铆。这种方法适用于处理任何按键操作,因此很容易扩展到您的情况。

我们需要的第一件事是我们的游戏状态:

import qualified Data.Set as S

data World = World
{ keys :: S.Set Key
, counter :: Int }

我们跟踪我们的特定游戏状态(在这种情况下只是一个计数器),以及我们的解决方法的状态(一组按下的键)。

处理输入事件只涉及向我们当前按下的一组键添加一个键或删除它:
handleInput :: Event -> World -> World
handleInput (EventKey k Down _ _) world = world { keys = S.insert k (keys world)}
handleInput (EventKey k Up _ _) world = world { keys = S.delete k (keys world)}
handleInput _ world = world -- Ignore non-keypresses for simplicity

这可以很容易地扩展到处理例如。鼠标移动,通过改变我们的 World type 跟踪光标的最后一个已知坐标,并在我们看到 EventMotion 时在此函数中设置它事件。

我们的逐帧世界更新函数然后使用输入状态来更新特定的游戏状态:
update :: Float -> World -> World
update _ world
| S.member (SpecialKey KeySpace) (keys world) = world { counter = 1 + counter world }
| otherwise = world { counter = 0 }

如果当前按下空格键( S.member (SpecialKey KeySpace) (keys world) ),则增加计数器 - 否则,将其重置为 0。我们不关心帧之间经过了多长时间,因此我们忽略了浮点参数。

最后我们可以渲染我们的游戏并运行它:
render :: World -> Picture
render = color white . text . show . counter

main :: IO ()
main = play display black 30 initWorld render handleInput update
where
display = InWindow "test" (800, 600) (0, 0)
initWorld = World S.empty 0

关于Haskell Gloss - 每按下一帧键就做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52871673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com