我正在尝试学习如何将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代码吗?
由于
答案 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的文档中进行了解释。