La Place des Développeurs [Fusion-C] Différences entre KeyboardRead et WaitKey
Bonjour,
J'essaie de capturer l'action du joueur avec les touches, mais je n'arrive pas. J'ai essayé avec les fonctions KeyboardRead et WaitKey, mais ça ne marche pas comme je le souhait.
Quelqu'un aurait une idée, SVP ?
Voici le code :
J'essaie de capturer l'action du joueur avec les touches, mais je n'arrive pas. J'ai essayé avec les fonctions KeyboardRead et WaitKey, mais ça ne marche pas comme je le souhait.
Quelqu'un aurait une idée, SVP ?
Voici le code :
Code C :
#include "fusion-c/header/msx_fusion.h" #include <stdio.h> #include <stdlib.h> #include<time.h> void main(void) { // Init variables unsigned int energy = 100; unsigned int attack = 30; unsigned int defense = 15; unsigned int energyen = 90; unsigned int attacken = 20; unsigned int defenseen = 10; // Let's start! Cls(); srand(time(NULL)); while (1) { Cls(); // Print stats printf("PLAYER [%d] (a%d) (d%d)\r\n", energy, attack, defense); printf("ENEMY [%d] (a%d) (d%d)\r\n", energyen, attacken, defenseen); // Wait for a or d key to be pressed while (Inkey()!=97 && Inkey()!=99) { KeyboardRead(); } // PLAYER ATTACKS! if (Inkey()==97){ energyen -= attack; } else { // PLAYER DEFENDS! if (Inkey()==99){ energy += defense; } } // ENEMY DECIDE if ((rand() % 4) >= 3) { energyen += defenseen; } else { energy -= attacken; } } // End while } // End main
ericb59
Membre non connecté
Conseiller Municipal
salut,
Inkey() : capture le clavier et te retourne le code ascii de la touche enfoncée.
La fonction est assez lente et bouffe des ressources pour pas grand chose. Donc il faut plutôt la réserver pour des choses basiques.
WaitKey : Idem que Inkey, à la différence prêt que WaitKey met le déroulement du programme en pause, et attends l'appuis sur une touche pour continuer
KeyboardRead : Fait une capture de certaines touches du clavier, et retourne leur état dans un Octet
dans cet l'octet, 1 représente une touche enfoncée, 0 une touche relâchée :
octet 7 : Right
octet 6 : Down
Octet 5 : Up
Octet 4 : Left
Octet 3 : Del
Octet 2 : Ins
Octet 1 : Home
Octet 0 : Space
L'octet 10000001 veut dire que les touches Right et Space sont enfoncées
KeyBoard Read est assez rapide à executer.
Si tu souhaites contrôler d'autres touches, Il faut utiliser GetKetMatrix
Si tu souhaites juste utiliser les touches fléchées et Space, alors utilise plutôt JoystickRead(0) et TriggerRead(0)
(0 en paramètre veut dire joystick 0, équivalent au clavier)
Voilà , j'espère que cel va t'aider.
Inkey() : capture le clavier et te retourne le code ascii de la touche enfoncée.
La fonction est assez lente et bouffe des ressources pour pas grand chose. Donc il faut plutôt la réserver pour des choses basiques.
WaitKey : Idem que Inkey, à la différence prêt que WaitKey met le déroulement du programme en pause, et attends l'appuis sur une touche pour continuer
KeyboardRead : Fait une capture de certaines touches du clavier, et retourne leur état dans un Octet
dans cet l'octet, 1 représente une touche enfoncée, 0 une touche relâchée :
octet 7 : Right
octet 6 : Down
Octet 5 : Up
Octet 4 : Left
Octet 3 : Del
Octet 2 : Ins
Octet 1 : Home
Octet 0 : Space
L'octet 10000001 veut dire que les touches Right et Space sont enfoncées
KeyBoard Read est assez rapide à executer.
Si tu souhaites contrôler d'autres touches, Il faut utiliser GetKetMatrix
Si tu souhaites juste utiliser les touches fléchées et Space, alors utilise plutôt JoystickRead(0) et TriggerRead(0)
(0 en paramètre veut dire joystick 0, équivalent au clavier)
Voilà , j'espère que cel va t'aider.
Merci pour la réponse Eric !! . En effect, je veux savoir si les touches 'a' et/ou 'd' on été utilisés, si j'ai bien compris à la fonction GetKeyMatrix, elles devraient être pour la touche 'a' :
et pour la touche 'd' :
Code C :
getKeyMatrix(2) == 01000000
et pour la touche 'd' :
Code C :
getKeyMatrix(3) == 00000010
Des nouvelles :
Les matrices ne sont pas bonnes, en effet le 1 correspond à une touche pas enfoncé et le 0 à une touche enfoncé, donc c'est l'inverse.
Par contre, même en les inversant, je n'arrive pas à avoir le comportement désiré, soit c'est le mappage comme Eric a dit :
soit c'est la boucle qui va trop vite :/
Je continue à investiguer
PS: @Eric il n'y a pas une autre manière de savoir quelle touche a été enfoncé ? Edité par DarkNekros Le 22/07/2019 à 10h17
Les matrices ne sont pas bonnes, en effet le 1 correspond à une touche pas enfoncé et le 0 à une touche enfoncé, donc c'est l'inverse.
DarkNekros :
[...]
pour la touche 'a' :
et pour la touche 'd' :
pour la touche 'a' :
Code C :
getKeyMatrix(2) == 10111111
et pour la touche 'd' :
Code C :
getKeyMatrix(3) == 11111101
Par contre, même en les inversant, je n'arrive pas à avoir le comportement désiré, soit c'est le mappage comme Eric a dit :
ericb59 :
PS : Attention les matrices clavier ne sont pas toutes identiques sur les ordinateurs MSX.
PS : Attention les matrices clavier ne sont pas toutes identiques sur les ordinateurs MSX.
soit c'est la boucle qui va trop vite :/
Je continue à investiguer
PS: @Eric il n'y a pas une autre manière de savoir quelle touche a été enfoncé ? Edité par DarkNekros Le 22/07/2019 à 10h17
Bon, j'ai résolu mon soucis avec ce bout de code :
Si quelqu'un connaît mieux, je suis preneur :P
Code C :
// PLAYER ATTACKS! switch (WaitKey()) { case 97: energyen -= attack; // ENEMY DECIDE if((rand() % 4) >= 3) { energyen += defenseen; } else { energy -= attacken; } break; case 100: energy += defense; // ENEMY DECIDE if ((rand() % 4) >= 3) { energyen += defenseen; } else { energy -= attacken; } break; } // End switch (WaitKey())
Si quelqu'un connaît mieux, je suis preneur :P
ericb59
Membre non connecté
Conseiller Municipal
Ben utilise Inkey() plûtot non ? Quoi que en fait ta boucle n'a pas l'air de faire quoi que ce soit d'autre en attendant l'appui d'une touche... Donc ca peut fonctionner effectivement.
ericb59 :
Ben utilise Inkey() plûtot non ? Quoi que en fait ta boucle n'a pas l'air de faire quoi que ce soit d'autre en attendant l'appui d'une touche... Donc ca peut fonctionner effectivement.
Merci pour la réponse Eric, mais si j'utilise Inkey(), les lettres des stats clignotent (dû au Cls()) car ils sont dans la bucle infinie du jeu (voir le code plus haut) et qu' Inkey() n'arrête pas l'exécution de cette bucle :/
De toute façon c'est un POC et je dois encore faire des améliorations au code, donc, je ne me prends trop la tête par rapport aux bonnes formes (de moment) :P Edité par DarkNekros Le 23/07/2019 à 12h37
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie