Question sur les define

Question sur les define - C++ - Programmation

Marsh Posté le 31-05-2005 à 12:15:12    

Bonjour à tous!
 
J'ai une petite question sur les defines:
 
Comme dans tous les jeux lorsque l'on presse sur une touche, on récupère le code de la touche appuyée.
J'ai donc créé un define pour chaque action  
exemple :  

Code :
  1. #define AVANCE 35
  2. if (keyCode == AVANCE )


La condition est vérifié si le code touche est égale a 35. Jusque la aucun problème ;) mais j'essaie d être le plus clair possible.
 
On a donc pour les téléphones portables  
#define KUP2 Canvas.KEY_NUM2
#define KUP3 Canvas.KEY_NUM3.  
 
Pour des raisons d'ergonomie et de facilité on refait un define : #define PAUSE KUP2  
Et donc le code ressemble a ceci (en incluant les define) :

Code :
  1. if (keycode == PAUSE)


Si le joueur appuie sur la touche 2 alors la condition est vérifiée.
Maintenant mon problème est le suivant : je veux que deux touches aient la meme action.
J'aimerais pouvoir faire  

Code :
  1. #define PAUSE KUP2
  2. #define PAUSE KUP3


et que si le joueur appuie sur la touche 2 cela vérifie la condition du "if". Mais forcément cela n'est pas possible. La solution

Code :
  1. #define PAUSE1 KUP2
  2. #define PAUSE2 KUP3
  3. if (keycode == PAUSE1 || keycode == PAUSE2)


n'est pas une solution au final car je dois pouvoir rajouter autant de touche possible sur une meme action :(
 
SI quelqu'un aurait une idée ;))
 
merci de m'avoir lu et bonne journée


Message édité par bonyama le 31-05-2005 à 12:32:49
Reply

Marsh Posté le 31-05-2005 à 12:15:12   

Reply

Marsh Posté le 31-05-2005 à 12:53:07    

Salut,
Plutôt que de passer par des defines, tu devrais lier tes touches à des actions.
Par exemple, tu as un enum pour chacun d'eux, et tu les lies par une map.

Reply

Marsh Posté le 31-05-2005 à 15:21:28    

Avec Qt, il n'y aurait pas aussi des possibilités similaires ?

Reply

Marsh Posté le 31-05-2005 à 15:30:09    

:heink:  
Il n'a pas parlé de Qt ?!

Reply

Marsh Posté le 31-05-2005 à 15:57:39    

ouaip
 
déjà merci pour vos reponses :)
ensuite le probleme cest qu'il s'agit de coder ceci en java. (C'est du preprocess donc les includes sont utils ;) )
Et donc je crois que ca empeche de faire ceci :
"Plutôt que de passer par des defines, tu devrais lier tes touches à des actions.
Par exemple, tu as un enum pour chacun d'eux, et tu les lies par une map." Tu parlais de pointeur sur fonction non ?
 
Si vous avez d'autres idées "your welcome" !

Reply

Marsh Posté le 31-05-2005 à 16:40:23    

Si tu veux du Java, c'est pas la bonne sous-cat...
 
Pour te répondre, je ne parlais pas de pointeurs sur fonctions, bien que ce soit une solution...
 
Je pensais plutôt à quelque chose du type

Code :
  1. //Définition des types
  2. enum KeyPad
  3. {
  4.    KP_Key1,
  5.    KP_Key2,
  6. [...]
  7. };
  8. enum Action
  9. {
  10.    Act_Advance,
  11.    Act_Pause,
  12. [...]
  13. };
  14. typedef map<KeyPad, Action> KeyBindings;
  15. // Initialisation des liens touches <-> actions
  16. KeyBindings keyBinds;
  17. keyBinds[KP_Key2] = Act_Pause;
  18. [...]
  19. // Utilisation
  20. if( keyBinds[keyCode] == Act_Pause )
  21.    // mettre en pause

Reply

Marsh Posté le 31-05-2005 à 18:06:52    

il y a même une solution en temps constant,
(peut être au prix d'un re-étalonage des codes)
 

Code :
  1. long map[MAX_KEYS];
  2. #define setAction(key,action) map[key]=action
  3. #define getAction(key) map[key]


 
ensuite quelque part :
 

Code :
  1. setAction('p',PAUSE);
  2.     setAction('P',PAUSE);
  3.     setAction(' ',PAUSE);


 
et autre part
 

Code :
  1. if(getAction(keycode)==PAUSE)
  2.    {
  3.        // ...
  4.    }

Reply

Marsh Posté le 01-06-2005 à 23:44:29    

Peux-tu me dire ce que tu apelles une "solution en temps constant" ?
D'après ce que je vois de ton code, tu as remplacé 2 opérations par des  defines (pour rester C++ on peut en faire des fonctions inline ?). Pourquoi ?

Reply

Marsh Posté le 02-06-2005 à 03:44:29    

en général, le temps d'accès de std::map n'est pas constant,
certaines clés sont retrouvées plus rapidement que d'autres,
ce qui n'est peut être pas souhaitable pour un jeu.
 
Après pour le défine... le topic était déjà tellement absurde.

Reply

Marsh Posté le 02-06-2005 à 08:15:26    

fra0 a écrit :

en général, le temps d'accès de std::map n'est pas constant,


 
 
source ?


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 02-06-2005 à 08:15:26   

Reply

Marsh Posté le 02-06-2005 à 15:36:12    

tree.cc

Reply

Marsh Posté le 02-06-2005 à 15:42:37    

url ? (des tree.cc, j'en ai un paquetà


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 02-06-2005 à 15:45:39    

Code :
  1. map<int,int> toto;
  2.     toto[7]=3;
  3.     toto[42]=1;
  4.     int d=toto[42]; // lance ton debugger ici

Reply

Marsh Posté le 03-06-2005 à 23:07:50    

En quoi remplacer par des defines est-il meilleur ? A la compilation, l'appel de la macro est remplacé par son code, non ? Si c'est le cas, il ne devrait pas y avoir d'écart de performance ?
J'espère pas être trop lourd, mais j'aimerais vraiment comprendre ça...

Reply

Marsh Posté le 04-06-2005 à 01:32:50    

// parfois les define sont plus lents, ce bout de code (mauvais)

Code :
  1. int X=1;
  2. for(int Y=0;Y<10;Y++)
  3. {
  4.     fois10(X);
  5.     ::Sleep(X);
  6. }


 
// s'exécute en 10ms lorsque

Code :
  1. void fois10(int Z)
  2. {
  3.     Z*=10;
  4. }


 
// et plus de 4 mois* lorsque

Code :
  1. #define fois10(Z) Z*=10;


 
ça devrait te mettre sur la piste


Message édité par fra0 le 04-06-2005 à 01:49:54
Reply

Marsh Posté le 04-06-2005 à 21:10:34    

Maintenant que c'est le week-end, je vais pouvoir faire quelque tests... Merci des pistes.

Reply

Marsh Posté le 04-06-2005 à 21:23:11    

les define ne sont pas typesafe, ca c'est vraiment mal !

Reply

Marsh Posté le 04-06-2005 à 21:56:46    

D'où ma question sur l'utilisation de fonctions inline.
Je vais essayer aussi avec ça...
Mais sans essayer, je ne comprends toujours pô :( Même après, j'ai bien peur de ne pas en comprendre l'origine...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed