2010-08-13 9 views
5

Ich habe keine Erfahrung mit OpenGL, also vielleicht fehlt mir gerade etwas.Warum stürzt das Drücken von Numlock OCaml opengl Programm?

Ich habe diesen OCAML-Code mit lablGL. Zum Kompilieren ich

ocamlopt -I + lablgl lablglut.cmxa lablgl.cmxa gl.ml -o gl.opt

oder

ocamlc -I + lablgl lablglut.cma lablgl.cma gl.ml -o gl.byte

let keyboard ~key ~x ~y = 
    match key with 
    | 27 -> exit 0 
    | _ -> ignore (Printf.printf "Key: %c %d pressed.\n%!" (char_of_int key) key) 
;; 

let keyboard_up ~key ~x ~y = 
    match key with 
    | _ -> ignore (Printf.printf "Key: %c %d released.\n%!" key (int_of_char key)) 
;; 

let special ~key ~x ~y = 
    try 
    match key with 
     | Glut.KEY_F1 -> Printf.printf "F1 pressed.\n%!" 
     | Glut.KEY_F2 -> Printf.printf "F2 pressed.\n%!" 
     | Glut.KEY_F3 -> Printf.printf "F3 pressed.\n%!" 
     | Glut.KEY_F4 -> Printf.printf "F4 pressed.\n%!" 
     | Glut.KEY_F5 -> Printf.printf "F5 pressed.\n%!" 
     | Glut.KEY_F6 -> Printf.printf "F6 pressed.\n%!" 
     | Glut.KEY_F7 -> Printf.printf "F7 pressed.\n%!" 
     | Glut.KEY_F8 -> Printf.printf "F8 pressed.\n%!" 
     | Glut.KEY_F9 -> Printf.printf "F9 pressed.\n%!" 
     | Glut.KEY_F10 -> Printf.printf "F10 pressed.\n%!" 
     | Glut.KEY_F11 -> Printf.printf "F11 pressed.\n%!" 
     | Glut.KEY_F12 -> Printf.printf "F12 pressed.\n%!" 
     | Glut.KEY_LEFT -> Printf.printf "Left pressed.\n%!" 
     | Glut.KEY_UP -> Printf.printf "Up pressed.\n%!" 
     | Glut.KEY_RIGHT -> Printf.printf "Right pressed.\n%!" 
     | Glut.KEY_DOWN -> Printf.printf "Down pressed.\n%!" 
     | Glut.KEY_PAGE_UP -> Printf.printf "PgUp pressed.\n%!" 
     | Glut.KEY_PAGE_DOWN -> Printf.printf "PgDown pressed.\n%!" 
     | Glut.KEY_HOME -> Printf.printf "Home pressed.\n%!" 
     | Glut.KEY_END -> Printf.printf "End pressed.\n%!" 
     | Glut.KEY_INSERT -> Printf.printf "Insert pressed.\n%!" 
    with 
    | Glut.BadEnum m -> Printf.printf "%s\n" m 
;; 

let() = 
    ignore (Glut.init Sys.argv); 
    ignore (Glut.createWindow ~title:"OpenGL Demo"); 
    GlClear.color (1.0, 1.0, 1.0); 
    Glut.keyboardFunc ~cb:(keyboard); 
    Glut.specialFunc ~cb:(special); 
    Glut.displayFunc ~cb:(fun() -> GlClear.clear [ `color ]; Gl.flush()); 
    Glut.mainLoop() 

Und jetzt ist hier das Problem. Durch Drücken von Numlock oder einer anderen Numpad-Taste bei deaktiviertem Numlock wird das Programm durch Auslösen der Ausnahme abgebrochen. Der Versuch, diese Ausnahme in spezieller Funktion zu erfassen, hilft nicht.

Hier ist der Beispiellauf.

Kann mir jemand erklären, warum es so funktioniert und wie man es umgeht?

Antwort

4

Nach this Code scheint es, dass der Benutzer, der es gerade geschrieben haben versucht, die Fehler in der folgenden Art und Weise zu umgehen:

let rec handlelablglutbug() = 
    try 
     Glut.mainLoop(); 
    with Glut.BadEnum "key in special_of_int" -> 
     showtext '!' " LablGlut bug: special key not recognized"; 
     Glut.swapBuffers(); 
     handlelablglutbug() 
    in 
    handlelablglutbug(); 

Das bin ich denke, macht, dass es ein Fehler mit ocaml Hafen von glut Bibliothek ist. Also keine Möglichkeit, eine nahtlose Lösung zu finden.

+0

Danke, dass Sie mir diesen Code gezeigt haben. – stmi

3

Offenbar meldet die OpenGL-Bibliothek eine Schlüsselnummer, die die OCaml-Bindung nicht unterstützt.

Wenn dies mit der neuesten Version von lablgl geschieht, könnte man dies als Fehler melden, und lassen vermuten, dass es eine gute Idee, ein KEY_UNKNOWN of int hinzuzufügen wäre, die Schlüssel zu handhaben, dass die Menschen jetzt erfinden und dann (wie als "Multimedia" -Tasten).

+2

Dies ist bereits in CVS behoben - http://camlcvs.inria.fr/cgi-bin/cvsweb/bazar-ocaml/lablGL/CHANGES?rev=1.34 – ygrek

Verwandte Themen