/ / Čítanie stavu klávesnice v ocamlsdl - ocaml, sdl

Čítanie stavu klávesnice v ocamlsdl - ocaml, sdl

Snažím sa naučiť, ako používať knižnice SDL s OCaml, ale stretávam sa s problémami so spracovaním vstupu pomocou klávesnice.

Konkrétne sa snažím pochopiť, ako používať Sdlkey.get_key_state, ktorý má takýto podpis:

val get_key_state : unit ->
(int, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t

V podstate chcem použiť metódu načrtnutú v tomto dokumente lenivý foo návod, V C by to vyzeralo takto:

Uint8 *keystates = SDL_GetKeyState( NULL );

//If up is pressed
if( keystates[ SDLK_UP ] )
{
printf( "Up was pressed" );
}

Pomocou poľa kľúčového štátu môžete skontrolovať, čikaždé príslušné tlačidlo je stlačené. Alternatívny spôsob, ako to dosiahnuť, je dotazovanie na udalosť stlačenia klávesu a v OCaml sa dá identifikovať pomocou porovnania vzorov, napríklad:

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

Videl som niekoľko príkladov, ktoré to ilustrujúmetóda, ale nemôžem nájsť žiadne informácie o tom, ako čítať hodnoty vrátené z Sdlkey.get_key_state. Som do funkčného programovania celkom nový, takže je to trochu nad hlavou. Môže mi niekto ukázať, ako prepísať vyššie uvedený kód C v službe OCaml?

Vďaka

odpovede:

0 pre odpoveď č. 1

Neviem ocamlsdl (hoci som SDL predtým používal). Mohlo by to byť dosť dobré len na zdôraznenie, že veľké polia OCaml sú ako polia C, nie je na nich nič „funkčné“.

Nomenklatúra pre modul Bigarray je pomerne silná, ale to, čo vidíte, je to get_key_state vráti jednorozmerné pole nepodpísaných 8-bitových hodnôt, ktoré sú rozmiestnené tak, ako je uvedené v poli C. K prvku poľa môžete pristupovať pomocou notácie (nie celkom peknej) a.{index}.

Ekvivalent OCaml by tak mohol vyzerať takto:

let keystates = get_key_state () in
if keystates.{KEY_UP} <> 0 then
(* Up key was pressed *)

Jedna vec, ktorá tu chýba, je, že neviem presne, ako získať index KEY_UP, Pravdepodobne je to však vysvetlené v dokumentoch ocamlsdl.