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

Turbo Pascal Discussion :

[TP]vider le tampon clavier


Sujet :

Turbo Pascal

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 43
    Points : 70
    Points
    70
    Par défaut [TP]vider le tampon clavier
    bonjour à tous

    j'ai un petit problème avec un jeu tout pourri que j'ai fait. Il faut appuyer sur des touches pour se diriger et le problème c'est que quand un joueur meurt (puisqu'il y en a deux), on revient au point de départ mais le programme 'se souvient' des touches pressées avant que le joueur ne soit mort et fait bouger en conséquence le joueur après qu'il soit mort.

    J'aimerais donc que cela ne se produise plus et donc que le programme 'oublie' les touches préssées.
    Si jamais il faut utiliser l'assembleur ca serait sympa de m'expliquer comme à un imbécile parce que je connais pas du tout

    Merci et a+

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Salut !

    Pas la peine de passer pour un imbécile pour vider le buffer du clavier !

    Tout ce qu'il suffit de savoir, c'est l'adresse mémoire du buffer en question. En fait, il est régi par trois zones mémoires contigües.

    La première va indiquer la position de la première position libre dans le buffer, la deuxième la position du caractère à lire, et enfin la dernière zone, le buffer clavier en lui-même.

    On ne peut pas à proprement parler "vider" le buffer clavier. Mais on peut faire en sorte que le PC "oublie" les touches qui viennent d'être pressées. Pour ce faire, il suffit d'indiquer qu'il n'y a aucune touche à lire, ce qui se traduit par affecter à la valeur "Position libre" la valeur "Caractère suivant".

    Maintenant que l'on a vu la théorie, passons à la pratique...

    Adresses mémoire :

    Première position libre : $0040:$001C (1 word)
    Prochain caractère : $0040:$001A (1 word)
    Buffer clavier : $0040:$001E (16 words)
    Pour accéder à une zone mémoire, on utilisera les tableaux Mem, MemW et MemL, utilisant respectivement des Byte, Word et Longint. Dans notre cas, il s'agit de Word, donc on se servira de MemW.

    Paré ? Alors c'est parti :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure EmptyKbdBuf;
    begin
    MemW[$0040:$001C] := MemW[$0040:$001A];
    end;
    Ouf ! Pas trop compliqué...

    Le code assembleur donnant ça est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure EmptyKbdBuf; assembler;
    asm
      mov ax, 0040h
      mov es, ax
      mov ax, es:[1Ah]
      mov es:[1Ch], ax
    end;
    Bon, ca ne présente pas un super intérêt. C'est juste pour faire voir.

    Bye !
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 43
    Points : 70
    Points
    70
    Par défaut
    merci beaucoup pour les explications, le code, enfin tout quoi.
    Tu m'as retiré une grosse épine (de sapin !) du pied parce que j'avais essayé en bidouillant mais j'avais pas réussi (qu'est ce que je suis nul )
    Merci encore et joyeux noel à tous

  4. #4
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    euh , tu es un peux dure avec toi meme , je ne pense pas que boucoup de personne save intuitivemment vider le buffer du clavier !!!
    6*8 =42

  5. #5
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut Vider le tampon clavier
    Bonjour

    La question est ancienne & résolue. Soit. Et avec talent.
    Je me permets tout de même de donner une autre méthode, qui me paraît fort simple & évite de trop se rapprocher du matos. Elle peut éviter aussi quelques erreurs...

    Le jeu consiste à tester si une touche a été pressée & , si oui, de lire cette touche afin de la retirer du tampon. Puis, on recommence, si besoin.

    On a donc quelque chose du style :
    var x:char;
    while keypressed do
    x:=readkey;

    Dans ce cas, la variable X ne sert à rien d'autre qu'à vider le tampon.
    Et quand on lit un caractère (char) le tampon est vidé des deux octets définissant la touche pressée. Même s'il s'agit d'une touche de fonction.

    Avantage : on ne risque pas de dépasser les limites du tampon (maximum, minimum, premier caractère à lire supérieur au dernier...) à cause d'une faute de frappe, par exemple. Autrement dit : on ne fait rien, c'est le compilateur qui se tape le boulot. Et c'est bien plus confortable.
    Non ?

    Cordialement
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    En effet, plus confortable...

    Plus lent aussi (enfin vu le temps pour l'exécution, on va pas s'arracher les cheveux ! lol)

    Mais surtout, cette méthode oblige à utiliser l'unité Crt. Et c'est dommage de grossir son code avec Crt juste pour vider le buffer clavier.

    Autrement, l'utilisation de la variable X est facultative en utilisant la syntaxe étendue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {$X+} { Syntaxe étendue activée }
     
    uses Crt;
     
    begin
    while KeyPressed do ReadKey;
    end.
    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

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

Discussions similaires

  1. Comment vider le tampon d'Application[""]
    Par lazins dans le forum ASP.NET
    Réponses: 12
    Dernier message: 20/01/2009, 18h57
  2. [C] Problème pour vider un buffer clavier
    Par mickael777 dans le forum Windows
    Réponses: 7
    Dernier message: 08/11/2007, 17h05
  3. vider le buffer clavier
    Par josmiley dans le forum Général Python
    Réponses: 2
    Dernier message: 09/08/2007, 16h11
  4. vider le buffer clavier
    Par Pragmateek dans le forum C
    Réponses: 31
    Dernier message: 20/06/2006, 21h33

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