Timer 使用OCamlSDL(SDL2)等待关键字和计时器事件
我需要能够使用OCamlSDL在应用程序中等待两种类型的事件:Timer 使用OCamlSDL(SDL2)等待关键字和计时器事件,timer,event-handling,ocaml,keyboard-events,sdl-2,Timer,Event Handling,Ocaml,Keyboard Events,Sdl 2,我需要能够使用OCamlSDL在应用程序中等待两种类型的事件: 用户按键 具有固定时间间隔的计时器事件 我可以在教程中看到如何在循环中等待事件。我的想法是使用SDL\u AddTimer设置计时器,并通过它提供自定义USER事件,这些事件将在与键盘事件相同的循环中处理。但是,我没有看到SDL\u AddTimerSDL函数的OCAML绑定。如何实现这样的功能?我找到的解决方案涉及运行单独的POSIX线程,该线程使用Sldevent.add发送用户定义的事件,然后在主事件处理循环中使用键盘事件处理
我可以在教程中看到如何在循环中等待事件。我的想法是使用
SDL\u AddTimer
设置计时器,并通过它提供自定义USER
事件,这些事件将在与键盘事件相同的循环中处理。但是,我没有看到SDL\u 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 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
如果你能找到一种集成lwt的方法,就有lwt_engine.on_timer,虽然我不确定SDL将如何工作。我猜您必须自己从
Sdltimer
和Sdlevent.add
中的函数来完成。我在Sdltimer模块中没有看到合适的函数:LWT提供协作线程,因为SDL不使用它们,所以它们可能无法在这里工作。我正在考虑的另一个选项是在OCaml中创建一个POSIX线程(使用线程模块),并通过Sdlevent.add
提供计时器事件。
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