在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 的文档中进行了解释。
我正在尝试学习如何将 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 的文档中进行了解释。