Posté le 26/11/2020 19:39
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 77 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 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);
/* ... */
Citer : Posté le 21/12/2020 18:33 | #
En fait, ca me dérange pas, mais je trouve ca bizzare de recopier un code sans comprendre...
Ajouté le 21/12/2020 à 18:36 :
genre ca : struct anim *next;
tu as déjà défini anim non ?
Tu définis anim dans anim
Citer : Posté le 21/12/2020 18:38 | #
Mais il n'est pas question de recopier mon code sans le comprendre (il ne peut pas de toute façon marcher d'un coup). Ce serait inutile et pas productif. Tout le but du jeu c'est que tu comprennes justement. Comme tu m'as déjà demandé « où mettre le code ? » ou « concrètement le code est comment ? » quand je donnais pas de code, eh bien j'en donne.
Tu définis anim dans anim
Attention à pas confondre le vocabulaire. La définition de struct anim c'est toute la région struct anim { ... }; qui décrit les contenus.
Dans ces contenus, il y a un pointeur. Chaque struct anim possède un pointeur vers une autre struct anim et ça forme une chaîne. C'est légal parce que tous les pointeurs sont sensiblement identiques donc ce n'est pas grave si j'annonce pointer vers un type qui est en train d'être défini.
Citer : Posté le 21/12/2020 18:41 | #
Mais déjà : ca sert à quoi les structures ?
Citer : Posté le 21/12/2020 18:43 | #
Ça sert à grouper ensemble des variables. Une structure c'est un « paquet » contenant plusieurs variables, et on s'en sert pour éviter d'avoir des variables de partout.
Ici struct anim représente un frame d'animation, avec trois attributs : l'image à afficher, la durée du frame, et un pointeurs vers le frame qu'il faut afficher ensuite. Ça représente la notion complexe de « frame d'animation » en une seule variable.
Citer : Posté le 21/12/2020 19:01 | #
J'ai ca : https://linx.breizh.pm/9e4ol24s.jpg
Citer : Posté le 21/12/2020 19:05 | #
Un pointeur nul s'est glissé dans ton code.
Citer : Posté le 21/12/2020 19:11 | #
Le problème c'est que je vois pas, et que mettre le code sur GitHub me donne un : error: failed to push some refs to 'https://github.com/OrPas/Elphorina.git'
Ajouté le 21/12/2020 à 19:11 :
Je fais ca demain, je vais voir
Ajouté le 22/12/2020 à 20:49 :
Voici mon code :
#include <gint/keyboard.h>
#include <gint/clock.h>
extern bopti_image_t img_personnage;
extern bopti_image_t img_personnagemarche;
struct anim {
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] },
};
int main(void)
{
struct anim *current_anim;
int current_anim_time_left = 0;
int y = 40;
extern bopti_image_t img_personnage;
extern bopti_image_t img_personnagemarche;
int a = 0;
int x = 0;
int key;
int inAnimation = 0;
int timeout = 1;
while(a != 1)
{
/* Affichage */
if(x >= 140)
x = 0;
dimage(x, y, current_anim->img);
/* Lecture des entrées */
clearevents();
key = getkey_opt(GETKEY_DEFAULT, &timeout).key;
if(keydown(KEY_EXE))
a = 1;
if(keydown(KEY_RIGHT))
{
inAnimation = 1;
}
/*Changement de frame*/
/* Simulation du monde */
if(inAnimation == 1)
{
if(current_anim_time_left == 0)
{
current_anim = current_anim->next;
} current_anim_time_left = current_anim->duration;
}
/* Délai */
sleep_us(25000);
}
getkey();
return 1;
}
Qui me donne l'erreur citée précedemment
Citer : Posté le 22/12/2020 21:56 | #
Tu n'initialises pas l'animation :
Quand tu démarres ce pointeur a une valeur aléatoire (ce qui existait sur la pile quand la fonction a démarré), il faut l'initialiser (et current_anim_time_left avec).
La simulation a aussi un problème, tu ne décrémentes current_anim_time_left nulle part, tu tu le réinitialises à tous les tours parce qu'une de tes accolades fermantes est mal placée !
Peut-être que tu n'as pas encore finement compris les enjeux de ce système ^^"
Citer : Posté le 23/12/2020 16:27 | #
il faut l'initialiser
C'est à dire ?
Ajouté le 23/12/2020 à 16:30 :
Enfin je vois ce que ca veut dire mais je vois pas quelle est la structure définie par :
Citer : Posté le 23/12/2020 16:34 | #
Ça ne définit pas de structure, juste un pointeur. L'idée c'est que current_anim doit pointer vers la structure représentant l'animation en cours. Pour changer d'animation il suffit de réaffecter current_anim vers une des animations préalablement définies (anim_idle et anim_walk) et de mettre à jour la durée restante.
C'est ça que j'ai décrit dans mon post en haut de cette page par :
current_anim = &anim_idle[0];
current_anim_time_left = current_anim->duration;
Citer : Posté le 23/12/2020 16:36 | #
Donc, si j'ai bien compris, avant
current_anim_time_left = current_anim->duration;
Citer : Posté le 23/12/2020 16:36 | #
Est-ce que tu penses que ça va compiler si tu le mets avant ?
Citer : Posté le 23/12/2020 16:38 | #
Si tu me le dis c'est que non, mais je vois pas pourquoi
Citer : Posté le 23/12/2020 16:39 | #
Pour la même raison que le code suivant ne marche pas, je suis sûr que ça va te sauter aux yeux.
y = 3;
int x;
int y;
Citer : Posté le 23/12/2020 16:40 | #
Oui là je vois
Ah oui non oui d'accord j'ai compris
Ajouté le 23/12/2020 à 16:41 :
il faut l'initialiser
Justement, struct anim *current_anim; l'inistialise non ?
Citer : Posté le 23/12/2020 16:42 | #
Non ça déclare la variable mais ça ne donne pas de valeur. Pour donner une valeur, il faut un "=" quelque part. Par exemple :
int score = 0; // Initialisé à 0
int score;
score = 0; // Initialisé à 0 aussi
Citer : Posté le 23/12/2020 16:43 | #
Donc :
Citer : Posté le 23/12/2020 16:44 | #
Voilà par exemple. Attention par contre il y a deux variables à changer pour que l'animation soit dans le bon état : current_anim et current_anim_time_left. De façon générale tu changes toujours les deux en même temps. Donc il faut aussi initialiser la seconde.
Citer : Posté le 23/12/2020 16:46 | #
Ca :
int current_anim_time_left = 0;
C'est bon ?
Ajouté le 23/12/2020 à 17:43 :
Avec :
#include <gint/keyboard.h>
#include <gint/clock.h>
extern bopti_image_t img_personnage;
extern bopti_image_t img_personnagemarche;
struct anim {
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] },
};
int main(void)
{
struct anim *current_anim = &anim_idle[0];
int current_anim_time_left = 0;
int y = 40;
extern bopti_image_t img_personnage;
extern bopti_image_t img_personnagemarche;
int a = 0;
int x = 0;
int key;
int inAnimation = 0;
int timeout = 1;
while(a != 1)
{
/* Affichage */
if(x >= 140)
x = 0;
dimage(x, y, current_anim->img);
/* Lecture des entrées */
clearevents();
key = getkey_opt(GETKEY_DEFAULT, &timeout).key;
if(keydown(KEY_EXE))
a = 1;
if(keydown(KEY_RIGHT))
{
inAnimation = 1;
}
/*Changement de frame*/
/* Simulation du monde */
if(inAnimation == 1)
{
if(current_anim_time_left == 0)
{
current_anim = current_anim->next;
current_anim_time_left = current_anim->duration;
}
}
/* Délai */
sleep_us(25000);
}
getkey();
return 1;
}
Rien ne s'affiche...
Ajouté le 23/12/2020 à 18:58 :
Là, je suis perdu, et j'implore Lephe'
Citer : Posté le 23/12/2020 18:59 | #
Je ne vois pas de dupdate().
Mon blog ⋅ Mes autres projets