在ocaml sdl中读取键盘状态

Reading keyboard state in ocamlsdl

我正在尝试学习如何将 SDL 库与 OCaml 一起使用,但我 运行 遇到了处理键盘输入的问题。

具体来说,我正在尝试了解如何使用 Sdlkey.get_key_state,它的签名如下:

val get_key_state : unit ->
   (int, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t

本质上,我想使用lazy foo tutorial中概述的方法。在 C 中,它看起来像这样:

Uint8 *keystates = SDL_GetKeyState( NULL );

//If up is pressed
if( keystates[ SDLK_UP ] )
{
    printf( "Up was pressed" );
}

使用键状态数组,您可以检查是否按下了每个相关键。另一种方法是轮询按键事件,在 OCaml 中可以使用模式匹配来识别它,例如:

let handleEvent ev = 
    match ev with
    | Sdlevent.KEYDOWN {Sdlevent.keysym=Sdlkey.KEY_ESCAPE} -> exit 0
    | _ -> ()

let mainLoop () = 
    while true do
        begin match Sdlevent.poll () with
        | None -> ()
        | Some ev -> handleEvent ev
        end;
    done

我看过几个说明此方法的示例,但找不到有关如何读取从 Sdlkey.get_key_state 返回的值的任何信息。我对函数式编程还很陌生,所以这有点让我头疼。有人可以告诉我如何在 OCaml 中重写上面的 C 代码吗?

谢谢

我不知道ocamlsdl(虽然我以前用过SDL)。但是仅仅指出 OCaml 大数组就像 C 数组一样就足够了,没有什么特别的 "functional" 关于它们。

Bigarray 模块的命名法很复杂,但您看到的是 get_key_state returns 无符号 8 位值的一维数组,其布局方式如下C 布置数组。您可以使用(不是特别漂亮的)符号 a.{index}.

访问数组元素

所以 OCaml 等效项可能如下所示:

let keystates = get_key_state () in
if keystates.{KEY_UP} <> 0 then
    (* Up key was pressed *)

这里缺少的一件事是我不知道如何获得索引 KEY_UP。但这可能在 ocamlsdl 的文档中进行了解释。