Posté le 15/07/2017 13:54
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 270 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 24/12/2018 14:44 | #
DBon bref peu importe mais le OVER c'est le meilleur non ?
On pourrait le croire, mais en fait... pas vraiment. Quand tu utilises OVER, tu écrases forcément un rectangle complet, tu ne peux pas dessiner quelque chose qui a une autre forme. Les cas où c'est utilisable sont assez rares finalement.
Les petits problèmes de ce genre niveau encodage, sont la raison pour laquelle la prochaine version de fxconv prend du PNG et le décode avec libpng. Ça marche à tous les coups et ça m'évite d'entretenir un lecteur de BMP maison. Tant mieux si tu as réussi à t'en sortir ! De façon générale le ARGB32 est le plus safe.
Citer : Posté le 24/12/2018 23:40 | #
Salut, juste pour te dire que ton boulot est génial J'aimerais bien savoir coder aussi proche de la machine mais ça viendra plus tard Ce moteur de gris est si fantastique
Citer : Posté le 25/12/2018 15:23 | #
Ravi que ça te plaise ! C'est gentil, merci <3
Citer : Posté le 27/12/2018 13:30 | #
Salut, pour srand() je n'ai pas trouvé d'équivalent à GetTicks() dans la biblio gint, seulement des fonctions pour avoir le nombre de secondes/minutes/heures... J'ai peut-être mal vu, as-tu une piste ?
Citer : Posté le 27/12/2018 13:34 | #
Non, effectivement, tu as bien vu. Cela dit c'est vite fait !
int RTC_GetTicks(void)
{
return RTC.time->R64CNT;
}
Citer : Posté le 27/12/2018 16:28 | #
Alors merci pour ta réponse mais j'ai un autre problème
J'ai besoin de rester appuyer sur mon bouton flèche gauche, je capture donc l'input comme ceci :
Mais même avec "getkey_repeat_arrow_keys" ça ne capture pas l'input continu, donc soit j'ai mal compris la fonction, soit c'est mon prog autour qui va pas, as-tu une autre piste ?
Citer : Posté le 27/12/2018 16:37 | #
1000/FRAMERATE contrôle le délai pendant lequel getkey_opt() attend, en millisecondes. Cette valeur veut dire que la fonction va récupérer un appui de touche par frame au plus, mais tu n'as aucune garantie que :
* Les appuis vont être détectés exactement sur les frames (tu peux en avoir 0 sur un frame et 2 sur l'autres)
* Le clavier produit des événements exactement à ton framerate
Si tu veux avoir un contrôle aussi fin, utilise un timer et fait une passe sur le buffer renvoyé par keyboard_stateBuffer() dedans.
Citer : Posté le 27/12/2018 16:39 | #
OUMPH bon je vais lire tes commentaires sur les .h alors merci
Ajouté le 27/12/2018 à 18:22 :
Bon j'ai fait cette fonction :
uint8_t *pointeur = keyboard_stateBuffer();
if(pointeur[8] == 4) return KEY_LEFT;
if(pointeur[8] == 2) return KEY_UP;
if(pointeur[7] == 4) return KEY_DOWN;
if(pointeur[7] == 2) return KEY_RIGHT;
if(pointeur[7] == 8) return KEY_EXIT;
return 0;
}
J'ai juste affiché ce que donnait keyboard_stateBuffer(), ensuite j'ai fait la fonction. Je l'utilise comme ceci:
input = keyRead();
Donc tout ça marche, as-tu des suggestions ?
Citer : Posté le 27/12/2018 18:31 | #
Es-tu bien conscient qu'ici tu ne peux pas appuyer sur gauche et haut en même temps ? Ce n'est pas forcément un problème, je signale juste que ça ne correspond peut-être pas à ce que tu veux.
Oui, je te conseille d'utiliser un timer au lieu de sleep() sinon tu n'auras pas les FPS que tu veux.
Citer : Posté le 27/12/2018 18:57 | #
Ok ok, et oui j'ai bien conscience des limites au niveau des inputs, j'arrangerai ça plus tard avec les opérateurs binaires... Sinon pour le timer, peux tu juste me dire quelle fonction tu me proposes d'utiliser ? Là je vais devoir faire des maths, je reviendrai peut-être à 21h-23h
Citer : Posté le 27/12/2018 18:59 | #
Utilise un timer virtuel, la première partie de timer.h. Regarde les trois fonctions à partir d'ici : https://git.planet-casio.com/lephe/gint/blob/master/include/timer.h#L35
Citer : Posté le 27/12/2018 20:18 | #
Bon j'ai compris le principe : C'est un timer qui va continuer de rouler même pendant mes instructions, je le crée avec timer_create() mais ensuite... ?
By default a virtual timer configured by timer_configure() will fire ET_Timer events
Ils sont cachés où les events ? Je suis obligé d'attacher le callback ? J'ai regardé toutes les fonctions du .h il y a rien qui me permet de lire les ET_Timer... j'ai jamais travaillé avec ce genre de chose
Citer : Posté le 27/12/2018 20:32 | #
Une fois que tu l'as créé tu le lances avec timer_start(). Désolé je t'ai menti, il faut aussi que tu regardes les fonctions en bas...
Oui, je te conseille d'attacher un callback.
L'autre solution consiste à récupérer les événements avec <events.h> mais c'est un mécanisme que j'ai tenté puis abandonné donc je ne te le conseille pas. Le callback c'est facile.
Citer : Posté le 27/12/2018 20:42 | #
Ok ok merci bien je vais voir tout ça
Ajouté le 27/12/2018 à 23:15 :
Bonsoir, en fait l'idée du callback me plait pas vraiment sauf si t'as une fonction qui me permet de break un sleep(), j'ai juste envie de mettre en pause mon prog. D'après ceci tu te sers de callback() pour animer ton sprite, or dans mon cas le callback devra tout gérer et je trouve que ça fait sale car je ne veux pas de variables globales (sauf les images et la police gérées par fxconv). J'ai peut être pas compris le truc . J'ai tenté d'utiliser les events malgré ton avertissement, j'ai fait :
while(input != KEY_UP) {
timer_start(chrono);
gclear();
input = keyRead();
//gestion input
//gestion dessin
waitevent();
gupdate();
}
timer_destroy(chrono);
De ce que j'ai compris, le timer est censé balancer un event dans la queue à sa fin donc je compte sur waitevent() pour bloquer ma boucle en attendant l'event sauf qu'avec ce code ça va à fond la caisse. J'ai bien-sûr déduit que waitevent() recevait des events autres à l'event du timer donc pour arranger ça je devrais faire while(waitevent() != eventTimer);
Bon en écrivant tout ça je remarque que la queue risque d'être rempli d'event de clavier ce qui retarderait l'enregistrement de l'event du timer (je sais pas).
Donc voilà, je me demande donc ce que renvoie waitevent() si il reçoit un event timer, j'ai essayé de lire les sources de gint pour savoir, j'ai pas trouvé
Si t'as des critiques sur mon utilisation du timer vas-y car franchement je sais pas si je dois faire un reload à la fin du timer bref bref
Et si c'est tout simplement mort pour les events dis le aussi
EDIT: Mon dieu je suis aveugle ou quoi je viens de voir "event_timer_underflow" on va tester ça.
Citer : Posté le 27/12/2018 23:23 | #
Ouh, il y a des choses à dire ici.
D'abord, pourquoi tu crées un timer avec 1 event en le relançant à chaque tour de boucle ? Ça ne sert strictement à rien. Si tu veux créer un timer, c'est pour avoir un signal régulier : tu es supposé le créer avec 0 pour deuxième paramètre et le démarrer une seule fois avant le boucle. Le timer_reload() est un truc qui ne te concerne pas, destiné au moteur de gris.
Ensuite, tu as bien compris le fonctionnement de waitevent(), le hic c'est que getkey() et ses amies prennent leur source dans pollevent(), autrement dit en utilisant les deux tu les fais interférer. Il faut que tu décides (dans la nouvelle version les événements disparaîtront, tu peux les utiliser quand même mais tant qu'à faire...). S'il reçoit un événement timer, waitevent() renvoie un event e qui vérifie e.type == event_timer_underflow.
Une fonction pour break un sleep(). Oui, le callback d'une interruption interromp un sleep. Une fois le callback terminé, le sleep reprend. Est-ce que tu comprends si je dis que l'exécution du timer est asynchrone ?
Citer : Posté le 27/12/2018 23:30 | #
Pour le timer, j'avais compris qu'il s’arrêtait à la fin du délai (c'est l'argument "int repeats" qui m'a fait penser ça) c'est pour ça que je le relançais à chaque fois Pour le timer asynchrone je suppose....................................................... que c'est une histoire de threads ? il est indépendant de ma fonction ? Je vais tenter le callback en faisant le plus propre possible.
EDIT : juste peux tu me donner un exemple de callback avec des arguments et la fonction car j'ai pas compris... le prototype
Citer : Posté le 27/12/2018 23:32 | #
En gros, ouais. Quand le timer arrive à expiration, ton programme est interrompu (ce qu'il faisait est mis en pause), le callback est exécuté, puis ton programme reprend comme si rien ne s'était produit. C'est très pratique faire un sleep() dans le programme et d'utiliser un timer pour exécuter un truc à la con toutes les sceondes, par exemple. C'est ce qui passe dans getkey(), par exemple.
Citer : Posté le 27/12/2018 23:39 | #
Merci bien lephenixnoir quel puit de sciences ce jeune homme, une autre question, cela concerne ma fonction keyRead(), à la compilation j'ai un petit warning :
uint8_t *pointeur = keyboard_stateBuffer();
^~~~~~~~~~~~~~~~~~~~
Mon intuition me dit que je dois copier "à la main" le tableau Buffer et pas juste copier le pointeur.
Ajouté le 28/12/2018 à 00:01 :
Bonne nouvelle (désolé pour tous mes double post) j'ai réussi à faire le callback() sans utiliser de variables globales (ou presque )
key_t input = 0, out = 0;
char frame = 0;
enum {RIEN, GAUCHE, DROITE} choix = RIEN;
void callback(void) {
gclear();
input = keyRead();
switch(input) {
case KEY_LEFT:
choix = GAUCHE;
break;
default:
choix = RIEN;
}
switch(choix) {
case GAUCHE:
spriteRun(0, 30, &img_jintrun, XJINT, YJINT, JRUNF, &frame);
break;
default:
spriteRun(0, 30, &img_jint, XJINT, YJINT, JIDLEF, &frame);
}
gupdate();
}
timer_t *chrono = timer_create(1000/FRAMERATE, 0);
timer_attach(chrono, callback, NULL);
timer_start(chrono);
while(out != KEY_EXIT) out = getkey();
timer_destroy(chrono);
}
Qu'en penses tu ? Je n'avais jamais mis de fonctions en param d'une autre fonction. C'était comme une première fois
Citer : Posté le 28/12/2018 00:07 | #
Tu pourrais, mais en l'occurrence il te suffit de mettre volatile devant le type du pointeur et ça ira.
Ouh, une fonction dans une fonction ? Pas trop une bonne idée. Je sais que c'est comme ça que tu fais pour accéder aux variables de main(), mais...
Bon, en principe c'est valide, garde ça si tu n'as pas trop envie de changer.
Une meilleure solution serait d'utiliser le paramètre "argument" de l'API timer, qui te permet de choisir un argument que tu passes à ton callback. Imagine que tu donnes l'adresse d'une variable... ou d'une structure avec des variables...
Citer : Posté le 28/12/2018 00:19 | #
Pour le volatile, j'avais testé mais ça me donnait quand même l'erreur, j'ai retenté la même chose et... ça marche J'avais sans doute oublié d'enregistrer main.c Pour la fonction dans la fonction moi non plus j'ai pas vraiment aimé, mais ça me permettait de ranger la fonction et de me faciliter la tâche pour les variables, mais ton idée d'utiliser une structure me plaît. Je vais donc de ce pas corriger tout ça. Merci de m'aider, j'espère que c'est pas à cause de moi que t'es levé à minuit
Citer : Posté le 28/12/2018 09:09 | #
Les fonctions imbriquées ont pas mal de défauts. Je t'en cite quelques-uns :
* Ce n'est supporté que par GCC.
* Tu ne peux pas les utiliser en-dehors de leurs fonctions parentes pour des raisons fondamentales, donc tu ne peux pas les renvoyer.
* Pour les appeler il faut exécuter du code sur la pile, ça ouvre la voie à un vecteur d'attaque classique.
Si tu arrives à utiliser une structure sans que ça soit trop lourd, je pense que c'est plus viable. Et rassure-toi, j'étais debout à minuit pour d'autres raisons.