Posté le 26/11/2020 19:39
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 79 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 20/12/2020 19:36 | #
Ca marche, merci ! Effectivement il n'avancait pas de 1 en 1, en fait le problème étant qu'il faut que je spamme le bouton pour avancer.
D'ailleurs, y a til un moyen de faire en sorte qu'il avance continuellement si la touche reste enfoncée ? (Avec le code dispo sur GitHub que je t'avais filé la dernière fois, et que je vais mettre à jour, je remets un message quand il est à jour...)
Ajouté le 20/12/2020 à 19:45 :
(GitHub mis à jour : https://github.com/OrPas/Elphorina/)
Citer : Posté le 20/12/2020 20:37 | #
Ça devrait automatique puisque getkey_opt() répète la touche (faut simplement ajuster le délai de répétition pour le caler sur le framerate du moteur).
Sinon tu peux utiliser des événements avec keydown().
Citer : Posté le 20/12/2020 20:50 | #
En mettant timeout à 0 ?
Citer : Posté le 20/12/2020 20:52 | #
C'est indépendant du timeout, que tu peux laisser à 1. getkey_opt() crée des répétitions de touches même entre plusieurs appels : si tu restes appuyé entre les deux appels il s'en rend compte et génère une répétition une fois que le délai de répétition est écoulé.
Citer : Posté le 20/12/2020 21:11 | #
Mais concrétement il faut que je fasse quoi ?
Citer : Posté le 20/12/2020 21:23 | #
En principe rien, si je suis surpris si ça ne marche pas.
Citer : Posté le 20/12/2020 22:55 | #
Ah...
Ca ne marche vraiment pas, j'ai beau rester appuyer, il faut que je réapuie pour que ca avance.
Pourrais tu à l'occasion tester le code chez toi et me dire ?
Citer : Posté le 20/12/2020 23:05 | #
Hap, my bad, j'ai lu un peu vite. Les répétitions ne sont pas générées quand le timeout expire.
Si tu n'as pas besoin de la logique interne, tu peux juste faire un test rapide de quelles touches sont pressées à chaque frame.
Par contre, fais vraiment attention à ne pas mélanger les différentes parties du programme. J'ai recollé plusieurs bouts et changé l'histoire de réinitialisation pour le remettre là où ça devrait être - dans la simulation du monde. Crois-moi, si tu gardes pas au moins ces trois phases (rendu, saisie des entrées, simulation) complètement séparées ton programme sera un monstre avant que tu aies le temps de dire « code spgahetti ».
#include <gint/keyboard.h>
#include <gint/clock.h>
int main(void)
{
extern bopti_image_t img_personnage;
extern bopti_image_t img_personnagemarche;
int a = 0;
int x = 0;
int inAnimation = 0;
int marche = 0;
while(a != 1)
{
/* Affichage */
dclear(C_WHITE);
dimage(x,40,marche ? &img_personnagemarche : &img_personnage);
dupdate();
/* Lecture des entrées */
clearevents();
if(keydown(KEY_EXE))
a = 1;
if(keydown(KEY_RIGHT) && marche==0)
{
marche = 5;
inAnimation = 1;
}
/* Simulation du monde */
if(marche>0)
{
x = x+1;
if(--marche==0)
inAnimation = 0;
}
if(x >= 140)
x = 0;
/* Délai */
sleep_us(25000);
}
getkey();
return 1;
}
(Désolé pour l'indentation un peu pétée)
Citer : Posté le 21/12/2020 16:00 | #
Merci pour le code mais ca marche pas...
Le code : https://github.com/OrPas/Elphorina/
Ajouté le 21/12/2020 à 16:01 :
En fait quand je reste appuyé ca laisse juste l'image personnagemarche jusqu'a ce que j'arrete d'appuyer...
Citer : Posté le 21/12/2020 16:06 | #
Tu peux pas mélanger la moitié de mon code et la moitié de ton code pendant que je t'explique les fonctions et espérer que ça marche... --"
Citer : Posté le 21/12/2020 16:09 | #
Je comprends pas ca : if(--marche==0)
Ajouté le 21/12/2020 à 16:10 :
Et l'indentation en général
Citer : Posté le 21/12/2020 16:10 | #
C'est le même principe que if(marche == 0) sauf que marche est décrémenté avant. C'est identique à
if(marche == 0) ...
Citer : Posté le 21/12/2020 16:22 | #
Ca marche !
J'ai juste mis x=x+1 dans if(--marche == 0), sinon on voyait pas personnagemarche
Ajouté le 21/12/2020 à 17:02 :
Dans :
Je comprends pas...
Ajouté le 21/12/2020 à 17:08 :
En particulier, si marche = -, quelle image va etre affichée ?
Citer : Posté le 21/12/2020 17:11 | #
Dans :
Je comprends pas...
La notation () ? () : () est un if/else inline (grossièrement, j'évite le nitpick ici).
Dans ce cas là il n'est pas très clair, tu les verras le plus souvent sous cette forme :
Tu peux remplacer par un if/else si ce n'est pas très clair pour toi :
dimage(x, 40, &img_personnagemarche);
} else {
dimage(x, 40, &img_personnage);
}
J'espère que ça t'aura aidé.
Citer : Posté le 21/12/2020 17:14 | #
Je prends ça pour un -1 ou un autre nombre négatif.
La condition marche toute seule signifie marche != 0 (en fait c'est le cas pour tout ; quand tu as une condition genre x == 2 c'est un booléen qui vaut soit 0 soit 1 et la condition est considérée comme remplie s'il ne vaut pas 0). Donc si marche est négatif le sprite en cours de marche s'affiche. Mais c'est pas une situation qui devrait arriver.
Citer : Posté le 21/12/2020 17:20 | #
J'explique mon problème : En laissant mon code tel qu'elle j'ai l'impression que mon personnage glisse en avançant dans la position personnagemarche.
Du coup, Je voudrais remplacer if(marche--==0) par if(marche--==-5), ce qui me permettrais d'avoir 5 frames ( de marche = 5 à marche =0) en personnagemarche, puis 5 frames( de marche = 0 à marche = -5 ) en personnage normal.
Mais pour cela lors de l'affichage il faut que les nombres négatifs ne rentrent pas comme des nombres positifs différents de 0, sinon cela reste sur personnagemarche.
Citer : Posté le 21/12/2020 17:34 | #
Oui il glisse. Mais la solution n'est pas vraiment de jouer avec des entiers. Il serait temps de formaliser correctement l'idée que tu as des animations formée de séquences d'images se répétant à l'infini (ici deux images alternantes), où chaque image a une certaine durée (en millisecondes ou en nombre de frames du jeu), et ajouter dans ta simulation du monde une fonction pour faire avancer les animations.
Parce que là c'est déjà le bordel avec une seule animation simple, je te dis pas quand tu vas vouloir transitionner vers une animation d'attaque ou de minage pendant la marche, tu t'en sortiras pas. >_o
Citer : Posté le 21/12/2020 18:09 | #
Je vais regarder ca...
En attendant avec ce code l'animation marche mais le perso n'avance pas
Citer : Posté le 21/12/2020 18:14 | #
marche--;
x = 0;
Ces deux machins-là ne sont pas à la bonne place. Comme je l'ai dit, tu dois te forcer à séparer l'affichage, la lecture des entrées et la simulation du monde à chaque frame, sinon ton programme sera ingérable avant que tu arrives à un jeu intéressant. (Le seul fait qu'il y ait plus d'une page d'échanges sur ce topic rien que pour l'animation de marche montre qu'il l'est déjà un peu !)
Citer : Posté le 21/12/2020 18:21 | #
J'ai supprimé mes 2 derniers messages, code modifié sur Github, mais ca ne marche pas plus...
Citer : Posté le 21/12/2020 18:32 | #
Oui si tu déplaces ces instructions-là elles ne marchent plus : cela montre que ta gestion des animations est bancale ou pas assez formalisée.
Donne-toi un système plus solide : quelques structures avec les détails de l'animation, une variable avec l'image actuelle, une avec la durée restante...
bopti_image_t *img;
int duration;
struct anim *next;
};
struct anim anim_idle[1] = {
{ &img_personnage, 1, &anim_idle[0] },
};
struct anim anim_walk[2] = {
{ &img_personnagemarche, 5, &anim_walk[1] },
{ &img_personnage, 5, &anim_walk[0] },
};
/* Dans main() */
struct anim *current_anim;
int current_anim_time_left = 0;
/* Pour passer à l'anim de marche */
current_anim = &anim_walk[0];
current_anim_time_left = current_anim->duration;
/* Pour passer à l'anim normale */
current_anim = &anim_idle[0];
current_anim_time_left = current_anim->duration;
/* À la fin de chaque frame, durant la simulation */
current_anim_time_left--;
if(current_anim_time_left == 0)
{
current_anim = current_anim->next;
current_anim_time_left = current_anim->duration;
}
/* Pour dessiner */
dimage(x, y, current_anim->img);
/* ... */