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
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
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)
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.
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."
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.
@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.
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).
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.
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.
Excellent Yann
Bravo, et je vais mettre ta routine de coté. On a toujours besoin de bonne routine clavier
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.
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 ?
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 ?
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 ...)