如何阅读Ocaml Graphics中同时按下的两个按钮?

时间:2018-10-17 00:34:54

标签: ocaml

我正在使用图形模块在Ocaml中制作一个简单的太空入侵者。您可以使用“ a”和“ d”移动飞船,并进行太空射击。我的问题是我不能让你同时移动和射击。当我按“ d”键移动然后按空格键进行拍摄时,即使我从未停止按“ d”键,飞船也会射击,但会停止移动。

let rec handler state old_time =  
   ...
   ...
    let event = Graphics.wait_next_event [ Graphics.Poll ] in
      if event.Graphics.keypressed then
          match (read_key ()) with
          |'a' -> handler { new_state with player = ((fst new_state.player) - 20, snd new_state.player) } new_time
          |'d' -> handler { new_state with player = ((fst new_state.player) + 20, snd new_state.player) } new_time
          |' ' -> handler (fire_bullet new_state) new_time
          | _ -> handler new_state new_time
  else
          handler new_state new_time
;;

我知道从队列中读取read_key以及其他所有内容,但是问题在于,当我按下另一个键时,他不再看到我按住了一个键。

有人知道如何解决吗?
谢谢。

1 个答案:

答案 0 :(得分:1)

图形模块公开的键盘界面有些限制。

您可以考虑改用OCamlSDLSdlkeySdlevent模块为键盘提供了更细粒度的界面(以及其他功能)。特别是,您可以检测到&KEYDOWN事件。

KEYUP