在ocamlsdl中读取键盘状态

时间:2015-10-16 04:44:55

标签: ocaml sdl

我正在尝试学习如何将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" );
}

使用keystate数组,您可以检查是否按下了每个相关键。另一种方法是轮询按键事件,在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代码吗?

由于

1 个答案:

答案 0 :(得分:0)

我不知道ocamlsdl(虽然我之前使用过SDL)。但是,仅仅指出OCaml大型阵列就像C阵列一样可能已经足够好了,没有什么特别的"功能性"关于他们。

Bigarray模块的命名法非常厚,但您所看到的是get_key_state返回一个无符号8位值的一维数组,其布局方式是C布局数组。您可以使用(不是特别漂亮)表示法a.{index}来访问数组元素。

所以OCaml等价物可能如下所示:

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

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