MSX Village forum

La Place des Développeurs [Fusion-C] Différences entre KeyboardRead et WaitKey

DarkNekros Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 27/01/2019 à 13h34

Messages: 61

Le 19/07/2019 à 09h43
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 :
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

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5481

Le 19/07/2019 à 15h46
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.


banniere-ericb59e
Site web    
DarkNekros Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 27/01/2019 à 13h34

Messages: 61

Le 19/07/2019 à 16h12
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' :
Code C :
 
getKeyMatrix(2) == 01000000 
 


et pour la touche 'd' :
Code C :
 
 getKeyMatrix(3) == 00000010
 
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5481

Le 19/07/2019 à 16h43
Ca doit être ça ! :D


banniere-ericb59e
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5481

Le 19/07/2019 à 18h06
ericb59 :
Ca doit être ça ! :D


PS : Attention les matrices clavier ne sont pas toutes identiques sur les ordinateurs MSX.


banniere-ericb59e
Site web    
DarkNekros Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 27/01/2019 à 13h34

Messages: 61

Le 22/07/2019 à 10h15
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.

DarkNekros :
[...]
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.


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
   
DarkNekros Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 27/01/2019 à 13h34

Messages: 61

Le 22/07/2019 à 15h48
Bon, j'ai résolu mon soucis avec ce bout de code :
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

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5481

Le 23/07/2019 à 09h12
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.


banniere-ericb59e
Site web    
DarkNekros Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 27/01/2019 à 13h34

Messages: 61

Le 23/07/2019 à 12h20
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