IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[Débutant]Graphics : Appuyer sur une touche


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 7
    Points
    7
    Par défaut [Débutant]Graphics : Appuyer sur une touche
    Bonjour,

    avec l'aide du module Graphics, je voudrais faire le suivant:

    Pendant que le programme s'exécute (c'est une fonction récursive), si l'utilisateur appuie sur une touche, j'ajoute qqc au graphique sur l'écran. Lorsqu'il appuie une deuxième fois, cet affichage supplémentaire s'arrête.

    Malheureusement, je ne comprends pas du tout comment utiliser les fonctions read_key, key_pressed et wait_next_event et les types event et status.
    La documentation : http://caml.inria.fr/pub/docs/manual...tml#TYPEstatus

    Avez-vous un exemple du code qui fait qqc pareil, ou pourriez-vous esquisser ce qu'il faut faire?

    Merci.
    Rosali

  2. #2
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Voici comment faire exactement ce que tu désires non pas avec le module Graphics, mais avec la Xlib, juste pour le plaisir de montrer que faire du X n'est pas si difficile ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #load "unix.cma"
    #load "Xlib.cma"
    #load "keysym_match.cma"
    open Keysym_match
    open Xlib
     
    let f v = if v > 10 then 1 else succ v
     
    let () =
      let d = xOpenDisplay "" in
      let s = xDefaultScreen d in
      let w = xCreateSimpleWindow d (xRootWindow d s) 10 10 100 100 1
                                    (xBlackPixel d s) (xWhitePixel d s) in
      xSelectInput d w [ExposureMask; KeyPressMask];
      xMapWindow d w;
     
      let draw_it v =
        xDrawString d w (xDefaultGC d s) 20 20 (string_of_int v)
      in
     
      let rec main_fold f v p =
        if xPending d = 0
        then begin
          Unix.sleep 1;
          xClearWindow d w;
          if p then draw_it v;
          main_fold f (f v) p
        end
        else
          match xEventKind(xNextEventFun d) with
          | XExposeEvent _ ->
              if p then draw_it v;
              main_fold f v p
          | XKeyPressedEvent event ->
              begin match keysym_var(xLookupKeysym event 0) with
              (* exit if q or escape are pressed *)
              | XK_q | XK_Q | XK_Escape -> ()  (* exit main loop *)
              | XK_p | XK_P ->  (* Key 'P' pressed *)
                  main_fold f v (not p)
              | _ ->
                  main_fold f v p
              end
     
          | _ -> main_fold f v p
      in
      main_fold f 1 true;
      xCloseDisplay d;
    ;;
    voici l'explication du code:
    - la fonction "recursive" est la fonction "f" qui incrémente juste sa valeur d'entrée et la remet a zéro si elle dépasse une certaine valeur.
    - xPending regarde le nombre d'évenements pour la fenêtre dans la queue et si il n'y en a aucun, execute (f v), le résultat de (f v) est passé comme prochaine valeur de v, en ce sens la récursion est faite à l'extérieur de la fonction (f)
    - la variable (p) indique si on doit afficher quelquechose ou pas, si la touche 'P' est enfoncée, ce booléen est inversé.
    - XExposeEvent c'est si la fenêtre a été reduite puis resortie
    - avec 'Q' ou escape on sort de la boucle principale "main_fold"
    - le (Unix.sleep 1) c'est pour ralentir ma boucle, mais tu voudras surement l'enlever.

    Pour l'adapter à tes besoins si tu souhaites dessiner un graphique, c'est très simple il suffit d'utiliser les foncitons pour dessiner des traits ou des
    rectangles:
    http://www.linux-nantes.org/~fmonnie...html#3_Drawing

    et pour changer la couleur ou le style comme dessiner en pointillé:
    http://www.linux-nantes.org/~fmonnie...raphicsContext

    le module Xlib est ici:
    http://www.linux-nantes.org/~fmonnier/OCaml/Xlib/
    il fonctionne sous Unix (Linux, BSD, MacOSX)

Discussions similaires

  1. Arrêter une temporisation en appuyant sur une touche
    Par Climoo dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 10/01/2008, 15h35
  2. Réponses: 12
    Dernier message: 25/08/2006, 13h44
  3. Activer un bouton en appuyant sur une touche du clavier
    Par brasco06 dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 16/02/2006, 23h47
  4. Changer de texture en appuyant sur une touche
    Par Hyoga dans le forum OpenGL
    Réponses: 1
    Dernier message: 29/01/2005, 23h36
  5. Réponses: 15
    Dernier message: 28/01/2005, 04h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo