Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Discussion: Problème clavier :(

  1. #1
    Invité de passage
    Femme Profil pro Sophie COLLIN
    Étudiant
    Inscrit en
    juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Nom : Femme Sophie COLLIN
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2012
    Messages : 1
    Points : 0
    Points
    0

    Par défaut Problème clavier :(

    Salut
    J'ai à peu près suivi ce que vous avez indiqué dans cette discussion, mais j'ai toujours un problème au niveau du déplacement avec les flèches de mon clavier. Je suis entrain de faire un Space Invaders, et je dois faire bouger un petit vaisseau avec les flèches. Quand j'appuie sur la flèche de gauche, il va bien à gauche, et quand j'appuie sur celle de droite il va bien à droite mais le problème c'est qu'il "fuse"… Lorsque j'appuie sur la flèche de gauche par exemple, il se déplace jusqu'à l'extrémité gauche de mon cadre de jeu au lieu de se déplacer que de quelques pixels… J'ai l'impression que le registre garde en mémoire la touche que j'ai appuyé… Je sais pas trop si vous me suivez…

    Voici un bout de mon code :

    Code :
    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
    @@deb:
    push ax
        mov ah,0Ch
        mov al,0Ah
        in al,60h
        mov bl,0
        cmp al,1
        jz @@deb
     
    ; --- Droite ? ---
    	cmp al,04Dh
    	je droite
     
    ; --- Gauche ? ---
    	cmp al,04Bh
    	je gauche
     
    ; --- Droite
    droite:
        cmp cx,555
        je gauche
    	inc cx
    	mov dx,380
    	pop ax
    	int 16h
    	jmp debut
     
    ; --- Gauche
    gauche:
        cmp cx,-65
        je droite
    	dec cx
    	mov dx, 380
    	pop ax
    	int 16h
    	jmp debut
    ( Le label "debut" contient le "call vaisseau" qui permet de dessiner le vaisseau… )

  2. #2
    Membre émérite
    Avatar de Forthman
    Homme Profil pro François
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    450
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 450
    Points : 883
    Points
    883

    Par défaut

    Bonjour,

    plusieurs petites choses:

    - le port 60h ne devrait pas être lu directement car il déclenche une interruption (INT9)
    et donc on ne peu pas être sur du code renvoyé... mais dans la pratique ça marche quand-même
    - à la fin de tes routines droite et gauche, tu devrais remettre al=0 pour effacer la direction
    - il faudrait mettre une temporisation car même en étant très rapide, ton vaisseau va faire
    tout le trajet d'un coup

    a+

  3. #3
    Membre chevronné Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 623
    Points
    623

    Par défaut

    la lecture du port 60h ne declenche pas d'interruption. son contenu est mis à jour à chaque evenement materiel du clavier, l'interruption est declenchée pour signifier un changement à traiter dans l'immediat. la lecture donnera donc le dernier etat du clavier.

    pour ce qui est du deplacement du curseur, la temporisation est une solution, mais la meilleure est d'utiliser un peu de maths, du genre dx=Speed*dt (delta x=speed* delta t), et ajouter ce delta X à la position du curseur.
    ça permetra d'avoir la meme vitesse apparente quel que soit la vitesse de la machine.

    un clavier emet une interruption à l'appui d'une touche, mais aussi au relachement. ce qui permet de tenir un bitmap du clavier, ce qui permet de ne plus utiliser le port 60h, mais juste lire dans le bitmap, pour connaitre l'etat de n'importe quelle touche en temps reel. et aussi prendre en compte les appuis de plusieurs touches en meme temps.

  4. #4
    Membre émérite
    Avatar de Forthman
    Homme Profil pro François
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    450
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 450
    Points : 883
    Points
    883

    Par défaut

    Oui, je m'a mal exprimé pour l'int

    En fait, comme tu dis, il faut refaire le code de l'int 9 pour placer tous ces petits codes
    dans un beau tableau. (au relâchement de la touche le code = code de touche + 128)
    Ca permet de gérer plusieurs touches en même temps de manière simple.

    Pour la vitesse de défilement, j'ai souvent utilisé la synchro de l'écran, mais je ne pense pas que ça fonctionne avec un émulateur si ? (ça fait trop longtemps que je n'ai pas
    programmé, faut que je m'y remette )

    a+ François

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •