使用 OCamlSDL (SDL2) 等待关键字和计时器事件
Waiting for both keyword and timer events with OCamlSDL (SDL2)
我需要能够在使用 OCamlSDL 的应用程序中等待两种类型的事件:
- 用户按键
- 具有固定时间间隔的定时器事件
我可以在教程中看到如何在循环中等待事件。我的想法是使用 SDL_AddTimer
设置一个计时器并通过它提供自定义 USER
事件,这些事件将在与键盘事件相同的循环中处理。但是我没有看到 SDL_AddTimer
SDL 函数的 OCAML 绑定。我怎样才能实现这样的东西?
我找到的解决方案涉及 运行 单独的 POSIX 线程,该线程使用 Sldevent.add
发送用户定义的事件,然后在主事件处理循环中使用键盘事件进行处理。这是启动线程的代码:
...
and timer_cb () = Sdlevent.add [USER 0] in
let timer_thread = Thread.create timer_loop (timer_flag, timer_cb) in
loop state; (* runs main program logic *)
timer_flag := true;
Thread.join timer_thread
定时器函数(在单独的线程中执行):
let rec timer_loop (flag, callback) =
if !flag then
Thread.exit
else
(Thread.delay 0.5;
callback ();
(timer_loop (flag, callback)))
事件处理循环除外:
let rec loop state =
match wait_event () with
| KEYDOWN {keysym=KEY_LEFT} ->
(* process left arrow key press here *)
loop state
| USER 0 ->
(* Process ticks here *)
loop state
| KEYDOWN {keysym=KEY_ESCAPE} ->
(* ESC to exit the app *)
()
| _ ->
loop state
我需要能够在使用 OCamlSDL 的应用程序中等待两种类型的事件:
- 用户按键
- 具有固定时间间隔的定时器事件
我可以在教程中看到如何在循环中等待事件。我的想法是使用 SDL_AddTimer
设置一个计时器并通过它提供自定义 USER
事件,这些事件将在与键盘事件相同的循环中处理。但是我没有看到 SDL_AddTimer
SDL 函数的 OCAML 绑定。我怎样才能实现这样的东西?
我找到的解决方案涉及 运行 单独的 POSIX 线程,该线程使用 Sldevent.add
发送用户定义的事件,然后在主事件处理循环中使用键盘事件进行处理。这是启动线程的代码:
...
and timer_cb () = Sdlevent.add [USER 0] in
let timer_thread = Thread.create timer_loop (timer_flag, timer_cb) in
loop state; (* runs main program logic *)
timer_flag := true;
Thread.join timer_thread
定时器函数(在单独的线程中执行):
let rec timer_loop (flag, callback) =
if !flag then
Thread.exit
else
(Thread.delay 0.5;
callback ();
(timer_loop (flag, callback)))
事件处理循环除外:
let rec loop state =
match wait_event () with
| KEYDOWN {keysym=KEY_LEFT} ->
(* process left arrow key press here *)
loop state
| USER 0 ->
(* Process ticks here *)
loop state
| KEYDOWN {keysym=KEY_ESCAPE} ->
(* ESC to exit the app *)
()
| _ ->
loop state