Posté le 12/04/2021 11:54
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 215 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 12/04/2021 12:03 | #
Bonjour Potter !
La méthode que j'utilise est d'utiliser clearevents() pour « raffraichir » les entrées clavier (lis les headers de gint pour les détails) et keydown() pour savoir si une touche est pressée. Pour détecter plusieurs touches, tu peux donc faire quelque chose similaire à ceci (codé à l'aveugle) :
#include <gint/keyboard.h>
int main(void) {
/* Boucle principale. */
do {
/* N'appelle cette fonction qu'une fois par boucle ! */
clearevents();
/* Tu peux vérifier qu'une touche est pressée avec keydown() */
const int left_down = keydown(KEY_LEFT);
const int right_down = keydown(KEY_RIGHT);
const int jump_down = keydown(KEY_SHIFT);
/* ... logique ici ... */
/* ... dessin là ... */
} while(!keydown(KEY_EXIT)); /* sors de la boucle quand EXIT est pressée */
return 1;
}
Bon courage !
Citer : Posté le 12/04/2021 12:15 | #
Ce que KikooDX a dit est très bien mais du coup tu n'as plus de repos dans la boucle, il faut un sleep() quelque part.
Citer : Posté le 12/04/2021 14:14 | #
Merci Kikoodx, cependant je ne comprends pas pourquoi il faudrait un timer Lephenixnoir...
J'en ai un à la fin de ma boucle principale, est ce correct ?
Citer : Posté le 12/04/2021 15:42 | #
Il faut quelque chose qui permette au processeur de dormir. Ta boucle elle va aisément s'exécuter entre plusieurs centaines et plusieurs dizaines de milliers de fois par seconde, ce qui représente beaucoup de travail inutile surtout que l'utilisateur n'appuie que très rarement sur des touches en comparaison.
Avec un programme pareil, la batterie de la calculatrice va fondre alors que le programme pourrait "attendre" qu'une touche soit pressée entre chaque tour de boucle. Le plus simple pour ça est de mettre un waitevent() au début de la boucle, juste avant le clearevents(), qui endormira le processeur jusqu'à ce qu'une touche soit pressée, comme ça tu conserves ta batterie.
sleep() est une autre option mais c'est moins prévisible.
Citer : Posté le 12/04/2021 18:24 | #
Oui, mais un waitevent() va couper les animations extérieures des personnages...
Citer : Posté le 12/04/2021 18:31 | #
C'est vrai. Et c'est ce qui amène une question importante, à savoir comment tu cadences ton programme. D'un côté tu veux endormir le matériel pour économiser la batterie, de l'autre tu veux te réveiller « régulièrement » pour lire les entrées clavier, afficher les animations, et simuler la physique.
La bonne solution à ce problème est d'utiliser un timer (comme KikooDX a mentionné). L'idée d'un timer c'est que tu peux le programmer pour qu'il te réveille par exemple 30 ou 60 fois par seconde, et à chaque fois qu'il te réveille tu peux clearevents() les événements qui se sont produits depuis le frame précédent, simuler la physique, afficher les animations, et te rendormir.
Cette méthode a un avantage très important, qui est que tes frames se produisent à des intervalles réguliers et prévisibles. Comme tu sais que chaque frame fait, par exemple, 20 ms (50 FPS), alors tu peux programmer tes animations pour que telle image dure 100 ms ou telle autre dure 40 ms. C'est beaucoup plus élégant (et solide) que de spécifier « 5 tours de boucle » ou « 2 tours de boucle ».
Dans cette situation, l'attente se fera avec une boucle while de ce genre :
(Il y a plein de choses dans la calculatrice qui réveillent le programme donc un seul sleep() ne suffit pas, il faut les enchaîner jusqu'à ce que ton timer spécifiquement ait fini de compter les 20 ms.)