Đây là một vòng lặp trò chơi đơn giản trong OCaml. Trạng thái được hiển thị, đầu vào được nhận, và trạng thái được nâng cao. Số khung hình trên giây bị hạn chế là 40 bằng cách trì hoãn chuỗi trong vòng 0.025 giây mỗi vòng lặp.Sự kiện trì hoãn và bàn phím trong OCaml
main.ml:
let rec main (* state *) frame_time =
(* Display state here. *)
Input.get_input();
(* Advance state by one frame here. *)
(* If less than 25ms have passed, delay until they have. *)
if((Sys.time()) < (frame_time +. 0.025)) then
Thread.delay ((frame_time +. 0.025) -. (Sys.time()));
main (* next_state *) (Sys.time())
;;
let init =
Graphics.open_graph " 800x500";
let start_time = (Sys.time()) in
main (* start_state *) start_time
;;
Đối với ví dụ này, get_input
chức năng chỉ đơn giản in tổ hợp phím vào cửa sổ.
input.ml:
let get_input() =
let s = Graphics.wait_next_event
[Graphics.Key_pressed] in
if s.Graphics.keypressed then
Graphics.draw_char s.Graphics.key
;;
Makefile để thử nghiệm đơn giản:
main: input.cmo main.cmo
ocamlfind ocamlc -o [email protected] unix.cma -thread threads.cma graphics.cma $^
main.cmo: main.ml
ocamlfind ocamlc -c $< -thread
input.cmo: input.ml
ocamlfind ocamlc -c $<
này làm việc cho hầu hết các phần, nhưng khi bấm phím nào rất nhanh chóng, chương trình bị treo với lỗi này:
Fatal error: exception Unix.Unix_error(2, "select", "")
Tôi tin rằng nó có thứ gì đó để làm với Thread.delay
. Điều gì gây ra vấn đề này, và cách tốt nhất để đạt được FPS liên tục là gì?
Jeffrey là đúng trên tất cả các tài khoản. Bạn có thể nhận được nhiều thông tin hơn về Chủ đề.trì hoãn [ở đây] (http://ocamlunix.forge.ocamlcore.org/threads.html#htoc63). –