La Place des Développeurs Buffer clavier
aoineko
Membre non connecté
Conseiller Municipal
Je réfléchi à des idées de p'tit jeu à développé sur MSX et j'aimerai savoir l'une d'entre elle est réalisable.
En gros, il s'agit d'une suite de tableau fixe avec des énigmes à réaliser en contrôlant 2 personnages en simultané (un jeu pour tester son ambidextrie ).
D'où ma question : le buffer clavier des MSX est t'il assez grand pour gérer 12 touches (6 par personnage) utilisables et au maximum 6 (3 par personnage) simultanément.
Je me souviens qu'a mes débuts de dev sur PC, ce problème m'avait bien embêté.
Quand est t'il sur MSX ?
EDIT : Pour info, je compte dev en C et ASM (au cas ou le Basic aurait une limitation spécifique). Edité par aoineko Le 08/01/2011 à 22h02
En gros, il s'agit d'une suite de tableau fixe avec des énigmes à réaliser en contrôlant 2 personnages en simultané (un jeu pour tester son ambidextrie ).
D'où ma question : le buffer clavier des MSX est t'il assez grand pour gérer 12 touches (6 par personnage) utilisables et au maximum 6 (3 par personnage) simultanément.
Je me souviens qu'a mes débuts de dev sur PC, ce problème m'avait bien embêté.
Quand est t'il sur MSX ?
EDIT : Pour info, je compte dev en C et ASM (au cas ou le Basic aurait une limitation spécifique). Edité par aoineko Le 08/01/2011 à 22h02
On est toujours ignorant avant de savoir.
le clavier du MSX est une matrice et est directement décodé donc l'appui sur plein de touches est possible
maintenant quand a savoir si elles arrivent dans le buffer clavier c'est autre chose
la technique utilisée est INKEY$ en basic qui renvoi la derniére touche utlisée uniquement
en machine le test de la matrice est prévu dans le bios et renvoi le code des touches enfoncées sur une ligne
routine 0141H SNSMAT ScaN Specified row in keyboard MATrix
on charge dans A la numero de la ligne 0 a 8 ou 0 a 10 avec pavé numérique
on relis dans A l'état de la ligne en binaire une touche enfoncée = 0
par cette méthode on peux donc tester au maximun 8 touches en même temps
le seul probléme restant c'est que la matrice n'est pas dans l'ordre des touches du clavier
maintenant quand a savoir si elles arrivent dans le buffer clavier c'est autre chose
la technique utilisée est INKEY$ en basic qui renvoi la derniére touche utlisée uniquement
en machine le test de la matrice est prévu dans le bios et renvoi le code des touches enfoncées sur une ligne
routine 0141H SNSMAT ScaN Specified row in keyboard MATrix
on charge dans A la numero de la ligne 0 a 8 ou 0 a 10 avec pavé numérique
on relis dans A l'état de la ligne en binaire une touche enfoncée = 0
par cette méthode on peux donc tester au maximun 8 touches en même temps
le seul probléme restant c'est que la matrice n'est pas dans l'ordre des touches du clavier
aoineko
Membre non connecté
Conseiller Municipal
Jipe :
par cette méthode on peux donc tester au maximun 8 touches en même temps
le seul probléme restant c'est que la matrice n'est pas dans l'ordre des touches du clavier
le seul probléme restant c'est que la matrice n'est pas dans l'ordre des touches du clavier
Cool !
Si rien n'empêche de faire plusieurs test par cycle on dois pouvoir tester toutes les touches.
Tu as un lien vers le mapping touches <=> entrée dans la matrices ?
Sinon, puisqu'on me demandé des détails sur ce projet, l'idée et de contrôler 2 personnages en même temps en vue de coté.
Pour chaque personnage, on a besoin de 6 touches : droite/gauche, haut/bas (saut/échelle), un bouton action et un bouton menu (qui pourrait être commun). Au pire, on pourrait sauter en diagonale et appuyer sur le bouton d'action sur les 2 personnages en même temps (d'où les 6 boutons simultanés). Ceci dit, ce sera très rarement le cas.
On est toujours ignorant avant de savoir.
et 2 joysticks ce serait pas plus facile a gérer pour un tel jeu ?
sinon pour le clavier tout est ici : http://map.grauw.nl/articles/keymatrix.php
le key ghosting doit répondre a ta prémiére question
sinon pour le clavier tout est ici : http://map.grauw.nl/articles/keymatrix.php
le key ghosting doit répondre a ta prémiére question
aoineko
Membre non connecté
Conseiller Municipal
Jipe :
et 2 joysticks ce serait pas plus facile a gérer pour un tel jeu ?
sinon pour le clavier tout est ici : http://map.grauw.nl/articles/keymatrix.php
le key ghosting doit répondre a ta prémiére question
sinon pour le clavier tout est ici : http://map.grauw.nl/articles/keymatrix.php
le key ghosting doit répondre a ta prémiére question
Merci pour le lien, je lis ça de suite.
Pour les 2 joysticks, ça me semble plus difficile à manipuler et puis, tout le monde à pas 2 joystick.
2 sets de touches, j'utilisai ça à l'époque des 1er FPS sur PC : ZQSD pour orienter la camera et les flèches pour se déplacer.
En fait, à l'origine, c'était un projet de jeu pour le PlaystationNetwork (PS3) et le XboxLiveArcade (X360) ; le concept s'applique bien aux manettes à double stick de ces consoles.
J'ai bon espoir que ce soir jouable au clavier (en terme de jouabilité) mais au pire, je ferai autre chose.
EDIT : J'suis un peu rouillé
Le code pour récupérer le contenu du clavier est bien :
Code :
ld a,4(ix)
call 0x0141
ld l,a
Ou 4(ix) est l'adresse de ma variable matrixRow lors de l'appel de fonction. J'ai le même genre de code pour le joystick qui, de mémoire, marche bien.
J'ai fait un code de test qui affiche un point à l'écran pour chaque bit à un mais j'obtiens un gros pavé... c-à-d tous les bits à 1.
EDIT 2 : Ne pas programmer quand on est crevé devrait être une règle absolue
En fait tout marche ; erreur d'algo plus pas fait gaffe que le 1 signifie "non appuyé" et 0 "appuyé". Du coup, c'est nickel, sauf que quand j'appui sur trop de touche en même temps, les suivantes sont pas prise en comte. Problème de BlueMSX ou du PC ? Si qq'un peut tester sur un vrai MSX, voici la rom de test : test.zip Edité par aoineko Le 10/01/2011 à 16h40
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Qq'un peut t'il tester mon programme sur un vrai MSX ? test.zip (rom + asm + bin)
Une fois lancer, appuyer sur plein de touches, chacune devant afficher un pixel en haut à gauche.
Sur PC via BlueMSX, au bout de qq touches appuyé, les autres sont plus prise en compte. Edité par aoineko Le 09/01/2011 à 13h03
Une fois lancer, appuyer sur plein de touches, chacune devant afficher un pixel en haut à gauche.
Sur PC via BlueMSX, au bout de qq touches appuyé, les autres sont plus prise en compte. Edité par aoineko Le 09/01/2011 à 13h03
On est toujours ignorant avant de savoir.
sur un vrai msx je n'ai pas assez de doigts pour tout allumer en même temps mais ça fonctionne bien
toutes les touches sonr scrutées sauf les fonction ,stop ,cls ,select ,ins ,del,esc, tab, ctrl,shift, return,,graph,space ,code
j'arrive a déplacer le sprite en appuyant un peu partout mais je ne trouve pas a trouver les combinaisons exactes des touches
le graph derriére suit bien le déplacement
on voit bien les limitations du clavier pc sur émulateur par rapport au vrai MSX
par contre la combinaison 1, A et 6 donne le même résultat : on allume un 4éme point parasite non attendu
ça se voit aussi en replaçant le 1 par 0 2 3 4 5 on active 4 points en appuyant sur chaque groupe de 3 touches
ça marche aussi avec A U G etc....
toutes les touches sonr scrutées sauf les fonction ,stop ,cls ,select ,ins ,del,esc, tab, ctrl,shift, return,,graph,space ,code
j'arrive a déplacer le sprite en appuyant un peu partout mais je ne trouve pas a trouver les combinaisons exactes des touches
le graph derriére suit bien le déplacement
on voit bien les limitations du clavier pc sur émulateur par rapport au vrai MSX
par contre la combinaison 1, A et 6 donne le même résultat : on allume un 4éme point parasite non attendu
ça se voit aussi en replaçant le 1 par 0 2 3 4 5 on active 4 points en appuyant sur chaque groupe de 3 touches
ça marche aussi avec A U G etc....
On en avait déjà parlé dans un autre post, extrait:
Tu vois que l'on peut scruter plusieurs touches par ce biais, en espérant que ça t'aidera!
Citation :
Il y aune alternative à INKEY si tu veux, elle est plus rapide et plus "réactive" car elle concerne l'adressage des ports du PPI (Au secours ).
Mais non rien d'affolant on va pas non plus entrer directement dans la programmation ASM, .
Il faut, dans un premier temps, s'équiper du tableau suivant.:
Le truc est simple si je veux scruter la touche "B", je dois envoyer dans le port C la valeur correspondante de la ligne où se situe "B", en l'occurrence: 2.
Ensuite je dois lire la valeur renvoyé dans le port B, c'est une valeur binaire codé sur 8 bit chaque colonne correspondant à un bit (vous savez: &B00010010,&B11001100,...) dans le cas présent si la touche "B" est enfoncée cela renverra la valeur &B01111111 (Le B se situant en début de rangée)autrement dit 127(en décimale). les touches non-enfoncées renvoyant '1' et les touches enfoncées '0'.
Pour la programmation ça se complique un peu:
Pour écrire dans C c'est: OUT &HAA,n° de ligne
Pour lire dans B c'est: variable=INP( &HA9)
Au final en programmation ça donne ça:
10 OUT &HAA,2: Z=INP(&hA9): IF Z=127THEN 'saut dans l'espace'
Attention cette méthode ne s'affranchit pas de l'appui sur une touche de la même ligne du port C, il existe une astuce mais cette petite ligne est déjà bien efficace!
Mais non rien d'affolant on va pas non plus entrer directement dans la programmation ASM, .
Il faut, dans un premier temps, s'équiper du tableau suivant.:
Le truc est simple si je veux scruter la touche "B", je dois envoyer dans le port C la valeur correspondante de la ligne où se situe "B", en l'occurrence: 2.
Ensuite je dois lire la valeur renvoyé dans le port B, c'est une valeur binaire codé sur 8 bit chaque colonne correspondant à un bit (vous savez: &B00010010,&B11001100,...) dans le cas présent si la touche "B" est enfoncée cela renverra la valeur &B01111111 (Le B se situant en début de rangée)autrement dit 127(en décimale). les touches non-enfoncées renvoyant '1' et les touches enfoncées '0'.
Pour la programmation ça se complique un peu:
Pour écrire dans C c'est: OUT &HAA,n° de ligne
Pour lire dans B c'est: variable=INP( &HA9)
Au final en programmation ça donne ça:
10 OUT &HAA,2: Z=INP(&hA9): IF Z=127THEN 'saut dans l'espace'
Attention cette méthode ne s'affranchit pas de l'appui sur une touche de la même ligne du port C, il existe une astuce mais cette petite ligne est déjà bien efficace!
Tu vois que l'on peut scruter plusieurs touches par ce biais, en espérant que ça t'aidera!
Le MSXien le plus à l'ouest ... ou presque
aoineko
Membre non connecté
Conseiller Municipal
Merci les gars !
Ah bin zut... ça va pas être relou pour dev sur PC
Jipe :
on voit bien les limitations du clavier pc sur émulateur par rapport au vrai MSX
Ah bin zut... ça va pas être relou pour dev sur PC
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie