Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » Multi-getkey en Gint
Potter360 En ligne Rédacteur Points: 715 Défis: 0 Message

Multi-getkey en Gint

Posté le 12/04/2021 11:54

Bonjour,
Je voudrais ajouter le saut à mon projet de jeu Elphorina, mais j’ai besoin que gint détecte l’appui de plusieurs touches en même temps, celle de saut et celle pour avancer pour pouvoir sauter et avancer, pareil pour reculer.
Est ce possible ?
Merci !


Kikoodx En ligne Labélisateur Points: 2503 Défis: 11 Message

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/display.h>
#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 !
Je devrais dormir, et pourtant me voilà.
Lephenixnoir En ligne Administrateur Points: 19811 Défis: 142 Message

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.
Potter360 En ligne Rédacteur Points: 715 Défis: 0 Message

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 ?
Hop là... toi qui lis cette signature... tu pourrais aussi aller voir mon projet Elphorina, un jeu de RPG-building !
Lephenixnoir En ligne Administrateur Points: 19811 Défis: 142 Message

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.
Potter360 En ligne Rédacteur Points: 715 Défis: 0 Message

Citer : Posté le 12/04/2021 18:24 | #


Oui, mais un waitevent() va couper les animations extérieures des personnages...
Hop là... toi qui lis cette signature... tu pourrais aussi aller voir mon projet Elphorina, un jeu de RPG-building !
Lephenixnoir En ligne Administrateur Points: 19811 Défis: 142 Message

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 :

while(<timer n'a pas fini de compter>) sleep()

(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.)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 92 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