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

Pascal Discussion :

Impossible de gérer le clavier et la souris en même temps


Sujet :

Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Impossible de gérer le clavier et la souris en même temps
    Hello tout le monde !

    Tout d'abord un bravo à toute la communauté qui permet de fournir une aide importante aux programmeurs en aide.

    Si je viens vous trouver aujourd'hui, c'est parce que j'ai un petit problème : j'ai créé un jeu qui se pilote intégralement avec les touches du clavier + bouton entrer. L'idée est d'ajouter à ce pilotage le controle via la souris sans rien changer.

    En effet, tout passe via une unité "clavier" qui retourne en fonction de la touche pressée 'haut", "bas", ...
    Donc il me parait simple d'ajouter la sourie dans l'unité afin qu'elle retourne la même chose.

    Le tout étant géré grace aux intéruptions assembleur.

    L'unité clavier modifiée :
    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
    50
    51
    52
    unit clavier;
     
     
    interface
     
    uses Dos, crt, souris;
    function lirecl : string ;
     
    implementation
     
     
    function Lirecl : string ;
    var Regs: Registers;
        x : char;
        a, b, ao, bo : integer ;
     
    begin
    x := char(0);
    initmouse;
     
    begin with Regs do
    repeat
    begin
    AH := $00;
    Intr ($16,Regs);       
    if AL=0 then
    x := Char(AH or 128)   
    else
          x := Char(AL); 
    end;
     
    ao:=a;
    bo:=b;
    getmousepos(a,b);
     
    if ao<a then x:=char(208);
     
     
    if ord(x)= 203 then lirecl:='gauche' ;
    if ord(x)= 205 then lirecl:='droite' ;
    if ord(x)= 200 then lirecl:='haut' ;
    if ord(x)= 208 then lirecl:='bas' ;
    if ord(x)= 27  then lirecl:='echap';
    if ord(x)= 13  then lirecl:='entrer';
    if ord(x)= 32  then lirecl:='espace';
     
    until ord(x) <> 0;
     
        end
        end;
     
     end.
    Donc une modification des coordonnées a de la souris devrait avoir pour effet d'entrainer l'action "haut".

    Pour info, l'unité de gestion de la souris fournie dans les tuto du site :

    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
    50
    51
    52
    53
    54
    55
    56
    unit souris;
    interface
    uses crt,dos;
    var
       reg : registers;
     
    function initmouse : boolean;
    Procedure Afficher ;
    Procedure Masquer ;
    Procedure getmousepos ( var mX, mY : integer ) ;
    function button : integer;
     
    implementation
     
    function initmouse: boolean;
    begin
       reg.ax:=$00;
       intr($33,reg);
       if reg.ax=0 then
          initmouse := false;
       if reg.ax=-1 then
          initmouse := true;
    end;
     
    {Affichage du curseur}
    procedure afficher ;
    begin
         reg.ax := $01;
         intr($33,reg);
    end;
     
    {Masque du curseur }
    procedure Masquer ;
    begin
         reg.ax := $02;
         intr($33,reg);
    end;
     
     
    Procedure getmousepos ( var mX, mY : integer ) ;
    begin
       reg.ax := $03;
       intr($33,reg);
       Mx := reg.cx;
       My := reg.dx
    end;
     
     
    function button : integer;
    begin
       reg.ax := $03;
       intr($33,reg);
       button := reg.bx;
    end;
     
    End .
    Sauf que ... ça plante :/ Le programme reste figé : toutes les touches de mon clavier se transforment en touche "bas" ce qui est problématique. :/

    Alors d'après vous, est-ce un conflit d'intéruption ou autre ?



    Milel fois merci de votre aide !

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue !

    Il ne s'agit pas d'un conflit d'interruption car, légèrement modifiée, la fonction de lecture du clavier prend bien en compte la position de la souris.
    Tout simplement, il y a un problème dans le traitement du code clavier retourné par l'interruption 16h.

    Pour t'aider à debugger la fonction Lirecl, je t'invite à la modifier par exemple comme ceci (elle devient une procédure) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Procedure Lirecl;
    Var Regs: Registers;
        a, b : integer ;
    Begin
      x := char(0);
      initmouse;
      with Regs do
        repeat
          AH := $00;
          Intr ($16,Regs);
          getmousepos(a,b);
          WriteLn('(',a,',',b,') - ',AH);
        until AH = 1;
    End;
    Tu verras que la position de la souris est bien prise en compte : les coordonnées souris sont affichées ainsi que le code de la touche pressée. C'est la touche Escape, dont le code clavier (scancode) vaut 1, qui met fin à la boucle.

    Petite remarque en passant : tu n'as pas besoin de déclarer l'unité CRT.

    Bonne prog !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/04/2012, 17h15
  2. Réponses: 1
    Dernier message: 09/02/2012, 16h42
  3. Touche du clavier + Clic souris en même temps
    Par As2piK dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 08/12/2010, 12h44
  4. Gérer la molette de la souris
    Par thedivxboy dans le forum GLUT
    Réponses: 10
    Dernier message: 03/01/2010, 19h17
  5. CreateProcess (impossible de gérer le symbole >
    Par borgirz dans le forum Windows
    Réponses: 4
    Dernier message: 03/06/2004, 10h53

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