Routine de gestion ...
 
Notifications
Clear all

Routine de gestion clavier en multi-touches

Page 1 / 2

Sheld67
(@sheld67)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 31
Topic starter  

Salut la Communauté,

Pour un nouveau jeu de course de voitures en haute résolution, je suis à la recherche d'une routine de gestion du clavier en mode multi-touches.

Je souhaite notamment que l'appui simultané sur les flèches 'haut' et 'gauche' engendre un déplacement latéral du bolide du joueur.

De même, l'appui simultané des touches 'SHIFT' et flèche devrait provoquer une augmentation de la vitesse de déplacement du joueur. À l'inverse, les touches combinées 'ESPACE' + flèche entraineraient un ralentissement du joueur.

Question subsidiaire : une telle routine pourrait-elle gérer l'appui de 3 touches ?

Sheld


Quote
didier_v
(@didier_v)
Estimable Member Redacteur en Chef
Inscription: Il y a 2 ans
Posts: 151
 

Hello, 

j'ai pas ca sous la main, mais il faut se souvenir du matricage du clavier : 

https://wiki.defence-force.org/doku.php?id=oric:hardware:oric_keyboard.

Et dans cet article, tu devrais trouver moults explications et des routines à copier

https://osdk.org/index.php?page=articles&ref=ART16

 

 


RépondreQuote
Kenneth
(@kenneth)
Trusted Member Adhérent
Inscription: Il y a 1 an
Posts: 87
 
Posté par: @sheld67

Question subsidiaire : une telle routine pourrait-elle gérer l'appui de 3 touches ?

Sheld

On peut. En théorie on peut lire simultanément tout ce qui se trouve sur une ligne clavier SHIFT, SPC, flêches, < et >, ce qui fait ... 8 touches en même temps. 😎 Si on se contente de lire une ligne et rien d autre, on devrait éviter la "ghost key" (la trop grande simultanéité qui génère des valeurs d'appui fantaisistes)


RépondreQuote
Symoon
(@symoon)
Eminent Member Adhérent
Inscription: Il y a 1 an
Posts: 30
 

Hello, il y a deux articles de Fabrice Broche sur le clavier dans un Micr'Oric (4 ou 6, je ne sais plus), détaillé avec la gestion de touches multiples.


RépondreQuote
Sheld67
(@sheld67)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 31
Topic starter  
Posté par: @symoon

il y a deux articles de Fabrice Broche sur le clavier dans un Micr'Oric (4 ou 6, je ne sais plus), détaillé avec la gestion de touches multiples.

Les articles en question se trouvent bien dans le n°6 de la revue Micr'Oric.

Et l'auteur de conclure : "Ceux qui proposeront désormais des jeux où il faut s'arrêter pour tirer et arrêter le tir pour se déplacer n'auront plus d'excuse."


RépondreQuote
JiBe
 JiBe
(@jibe)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 74
 

Le sujet de l'auto repeat est il abordé dans dans cet article de Fabrice Broche?

C'est le mécanisme qui fait qu'un appuie touche se répète automatiquement lorsqu'on laisse le doigt appuyé sur une touche.

Je pense que c'est essentiel dans le cadre d'une course de voiture.

 


RépondreQuote
didier_v
(@didier_v)
Estimable Member Redacteur en Chef
Inscription: Il y a 2 ans
Posts: 151
 

@jibe : quand on lit directement la matrice clavier, c'est au codeur qu'il revient le choix du repeat. Dans le cas de la course de voiture ... en fait tant que le doigt est sur le clavier, c'est que l'on a le pied à fond sur l'accélérateur. 


RépondreQuote
Sheld67
(@sheld67)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 31
Topic starter  
Posté par: @jibe

Le sujet de l'auto repeat est il abordé dans dans cet article de Fabrice Broche?

La répétition automatique des touches a été ignorée dans l'article de F.BROCHE.

Pour ma part, je choisis volontairement de ne pas traiter l'auto repeat dans mon programme, car je ne saurais même pas comment m'y prendre.

C'est pour cette raison que seules les touches suivantes seront valides :

- Flèches : vitesse normale

- Flèche + SHIFT Gauche : accélération

- Flèche + ESPACE : décélération

- Aucune touche : la voiture ralentit puis s'arrête (si toutefois je parviens à programmer un ralentissement progressif)

J'ignore encore si je dois prévoir la combinaison de deux touches de direction pour un déplacement latéral, car cela risque d'entraver la jouabilité. Le joueur ne pourra de toutes façons pas s'écarter des couloirs du circuit de course (voir ci-joint).

 


RépondreQuote
Kenneth
(@kenneth)
Trusted Member Adhérent
Inscription: Il y a 1 an
Posts: 87
 

Salut

Par rapport au lien de Didier_v, on voit que les touches necessaires pour le jeu sont sur la meme ligne, donc le processus doit etre le suivant:

Selectionner le demultiplexeur clavier sur la ligne 4

Utiliser la routine en ROM pour ecrire dans le registre d'entrees sorties du processeur sonore pour envoyer un zero sur une colonne.

Lire la valeur qui sort du demultiplexeur, prevoir une legère pause de quelques cycles, il y aurait un petit retard hardware.

Placer un zero sur une autre colonne, relire la valeur et faire ainsi toute la trame clavier.

La difference avec le code en Rom, c est que lorque une touche est enfoncee et detectée, on arrête le scan, alors que ici, on lit toutes les trames. Si on ne touche pas aux autres touches du clavier, on peut donc lire l'etat simultané du shift gauche, fleches et spc.


RépondreQuote
Sheld67
(@sheld67)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 31
Topic starter  

Voici la routine développée par F.BROCHE et retouchée afin de prendre en compte l'appui simultané de 3 touches. La valeur dans la matrice 8x8 de chaque touche pressée est sauvée entre $01-$03.

COLUMN                  equ $00
MULTIKEY_FLAG       equ $04
KEY_COUNTER         equ $05
LIGNE                     equ $06

VIA_PORTB             equ $0300
VIA_PORTA             equ $030f
VIA_PCR                 equ $030c

                             org $9000

                             lda #0
                             ldx #4
                             stx KEY_COUNTER
LLOOP1                  sta $00,x ; initialisation des cases mémoire
                             dex
                             bne LLOOP1
                             php
                             sei
                             lda #1
                             sta COLUMN
                             ldx #%01111111 ; masque activation colonne 7 (b7 = 0)
LCOLUMN_LOOP      txa
                             pha ; sauver masque colonne
                             lda #$0E
                             sta VIA_PORTA ; registre 14 du 8912 = port clavier colonne
                             lda #$EE
                             sta VIA_PCR ; valider PORT A comme n° registre
                             lda #$CC
                             sta VIA_PCR ; repos (compense défaut hardware)
                             stx VIA_PORTA ; envoyer masque colonne
                             lda #$EC
                             sta VIA_PCR ; valider PORT A comme donnée
                             lda #$CC
                             sta VIA_PCR ; repos
                             ldy #0
                             ldx #7 ; n° de ligne testée (on boucle sur 8 lignes)
                             stx LIGNE
LLIGNE_LOOP         txa
                             ora #%00010000 ; Strobe imprimante à 1
                             sta VIA_PORTB ; valider ligne vers multiplexeur
                             lda #%00001000 ; multiplexeur renvoit 1
                             bit VIA_PORTB ; sur le bit 3 si ligne et colonne connectées
                             beq LNO_KEY ; touche testée non pressée
                             dec KEY_COUNTER ; décrémente compteur de touches pressées simultanément
                             beq LTEST_COMPLETE ; 3 touches pressées = max.
                             inc MULTIKEY_FLAG ; incrémente nbe touches pressées simultanément
                             txa
                             asl a
                             asl a
                             asl a ; 8 x n° ligne
                             clc
                            adc COLUMN ; n° touche pressée dans matrice 8x8
                            ldx KEY_COUNTER
                            sta $00,x ; sauve n° touche pressée entre $01-$03
LNO_KEY              dec LIGNE
                            ldx LIGNE
                            bpl LLIGNE_LOOP ; reboucle tq ligne non finie
                            inc COLUMN
                            pla ; récupère masque colonne
                            sec
                            ror a ; déplacement masque d'un cran vers la droite (fin lorsque 0 tombe dans C)
                            tax
                            bcs LCOLUMN_LOOP ; reboucle tq colonne non finie
LTEST_COMPLETE  plp
                            cli
                            rts

Ci-dessous, un exemple des valeurs retournées dans $01-$03 lorsque l'on appui sur flèches + SHIFT ou flèches + ESPACE.

 

 

1615654437-ReadKey.jpg

RépondreQuote
didier_v
(@didier_v)
Estimable Member Redacteur en Chef
Inscription: Il y a 2 ans
Posts: 151
 

Excellent Yann 

Bravo, et je vais mettre ta routine de coté. On a toujours besoin de bonne routine clavier


RépondreQuote
Sheld67
(@sheld67)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 31
Topic starter  
Posté par: @didier_v

On a toujours besoin de bonne routine clavier

En pièce-jointes, les deux fichiers bin et bas qui permettent de se faire une idée du fonctionnement de la routine de gestion clavier en multi-touches.

Bonne utilisation.

Sheld.


RépondreQuote
JiBe
 JiBe
(@jibe)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 74
 

Bonjour,

 

Je voudrais savoir comment on utilise les fichiers fournis.

 

J'ai décompressé l'archive, ça m'a donné deux fichiers. Il y a un bin.tap et un bas.tap.

Visiblement le basic cherche à charger le bin. Mais comment dit-on à Oricutron que le bin est dans cet autre fichier TAP?

Faut il renommer le fichier pour le nom soit le même que celui dans le script basic ?

 


RépondreQuote
Sheld67
(@sheld67)
Membre Redacteur
Inscription: Il y a 1 an
Posts: 31
Topic starter  
Posté par: @jibe

Mais comment dit-on à Oricutron que le bin est dans cet autre fichier TAP?

Faut il renommer le fichier pour le nom soit le même que celui dans le script basic ?

J'utilise exclusivement Euphoric et crains de ne pas être suffisamment compétent en ce qui concerne Oricutron.

Le chargement de fichiers TAP est en effet d'une simplicité enfantine sous Euphoric...

Quelqu'un pour répondre à JiBe ?


RépondreQuote
didier_v
(@didier_v)
Estimable Member Redacteur en Chef
Inscription: Il y a 2 ans
Posts: 151
 

Hello, c'est assez simple.

1. Tu charges le readkeybin.tap dans oricutron, cload ""  (le bin n'est pas en executable et se loge en $9000)

2. Tu retournes dans le menu cassette d'oricutron (F1-T) et cload"" pour charger le readkeybas.tap dans le soft. Là aussi, pas autoexec. Run et c'est parti

J'essaie et ... ok, il faut faire run 20 (et au bout de quelques touches, j'ai eu un msg d'erreur overflow ...)

 


RépondreQuote
Page 1 / 2
Share: