Posté le 26/11/2020 19:39
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2025 | Il y a 196 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 23/12/2020 18:59 | #
Je ne vois pas de dupdate().
Mon blog ⋅ Mes autres projets
Citer : Posté le 23/12/2020 19:01 | #
Ah, mon dupdate() s'est barré...
Ajouté le 23/12/2020 à 19:14 :
Alors, 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;
dclear(C_WHITE);
dimage(x, y, current_anim->img);
dupdate();
/* 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;
}
current_anim_time_left--;
}
/* Délai */
sleep_us(25000);
}
getkey();
return 1;
}
Quand j'appuie sur la flèche ca marche pas...
Ajouté le 24/12/2020 à 12:45 :
Le personnage s'affiche mais il n'avance pas...
Ajouté le 25/12/2020 à 19:38 :
Up
Ajouté le 26/12/2020 à 12:06 :
Avec ça :
#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;
dclear(C_WHITE);
dimage(x, y, current_anim->img);
dupdate();
/* Lecture des entrées */
clearevents();
key = getkey_opt(GETKEY_DEFAULT, &timeout).key;
if(keydown(KEY_EXE))
a = 1;
if(keydown(KEY_RIGHT))
{
inAnimation = 1;
current_anim_time_left = current_anim->duration;
}
/*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;
}
current_anim_time_left--;
}
/* Délai */
sleep_us(25000);
}
getkey();
return 1;
}
Ca marche pas non plus...
Le personnage s'affiche mais quand j'appuie sur la touche il n'avance pas
Citer : Posté le 26/12/2020 12:18 | #
You don't ever change x...
Citer : Posté le 26/12/2020 12:20 | #
Oh, thin... In fact I was convinced that I had changed it... Sorry for the inconvenience...
Ajouté le 27/12/2020 à 19:24 :
Mais 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;
dclear(C_WHITE);
dimage(x, y, current_anim->img);
dupdate();
/* Lecture des entrées */
clearevents();
key = getkey_opt(GETKEY_DEFAULT, &timeout).key;
if(keydown(KEY_EXE))
a = 1;
if(keydown(KEY_RIGHT) && inAnimation == 0)
{
inAnimation = 1;
current_anim_time_left = current_anim->duration;
}
/*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;
x=x+1;
inAnimation = 0;
}
current_anim_time_left--;
}
/* Délai */
sleep_us(25000);
}
getkey();
return 1;
}
On ne voit pas l'animation
Citer : Posté le 27/12/2020 20:32 | #
Tu mélanges beaucoup de choses dans ce code.
Rien que if(x >= 140) x=0 ce n'est pas de l'affichage, sa place est dans la simulation du monde. Ça montre bien que les différentes parties de ton moteur sont toutes mélangées et donc tu ne risques pas de t'en sortir.
Ensuite, ta lecture des entrées mélange deux techniques différentes : getkey_opt() et clearevents()+keydown(). Si tu regardes le code que je t'ai montré je n'ai jamais mélangé les deux, et pour cause il faut choisir. Actuellement ton getkey_opt() ne fait rien et renvoie KEYEV_NONE avec key=0 puisque tu supprimes tous les événements juste avant : il ne sert donc à rien, tu devrais le supprimer.
Enfin ta logique sur les animations est très bizarre. Le but des animations c'est qu'elles avancent en permanence. À tous les frames où tu ne changes pas d'animation, tu dois faire avancer les animations :
current_anim_time_left--;
if(current_anim_time_left <= 0)
{
current_anim = current_anim->next;
current_anim_time_left = current_anim->duration;
}
Ici tu as une variable inAnimation un peu louche qui contrôle à la fois le timing de l'animation de marche et le fait que le personnage puisse avancer, et puis tu modifies current_anim_time_left quand on appuie sur la flèche droite alors qu'il n'y a pas de raison.
Le mot maître c'est indépendant. La simulation du monde (la physique) et les mises à jour des animations n'ont pas de raison d'avoir un timing lié, et pas de raison d'avoir du code qui se mélange. Le code qui lit le clavier n'a pas à toucher à current_anim_time_left, et le code qui déplace le joueur non plus. Il faut rendre ces choses indépendantes.
Le code qui fait avancer les animations doit être indépendant, différent, physiquement disjoint du code qui fait avancer ton personnage. Il ne sont reliés que par une seule donnée qui est l'état du personnage (à l'arrêt ou en marche), et rien d'autre. Ils ne doivent partager aucune variable à part ce minimum strict dont ils ont besoin pour fonctionner.
Voilà une version correctement séparée de ton 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 = &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 timeout = 1;
/* État du personnage : 0=arrêté, 1=marche */
int state = 0;
/* État du personnage au frame précédent */
int previous_state = 0;
while(a != 1)
{
/* Affichage */
dclear(C_WHITE);
dimage(x, y, current_anim->img);
dupdate();
/* Lecture des entrées ; si on n'appuie sur rien, state=0 */
clearevents();
state = 0;
if(keydown(KEY_EXE))
a = 1;
if(keydown(KEY_RIGHT))
state = 1;
/* Exécution des animations */
if(previous_state == 0 && state == 1)
{
/* On vient de commencer à marcher */
current_anim = &anim_walk[0];
current_anim_time_left = current_anim->duration;
}
else if(previous_state == 1 && state == 0)
{
/* On vient de s'arrêter */
current_anim = &anim_idle[0];
current_anim_time_left = current_anim->duration;
}
else
{
/* On continue l'anim précédente */
current_anim_time_left--;
if(current_anim_time_left <= 0)
{
current_anim = current_anim->next;
current_anim_time_left = current_anim->duration;
}
}
/* Simulation du monde */
if(state == 1)
{
x = x + 1;
if(x >= 140)
x = 0;
}
/* Délai */
sleep_us(25000);
/* Préparation des invariants du frame suivant */
previous_state = state;
}
getkey();
return 1;
}
Remarque que chaque bloc a une et une seule tâche :
• "Affichage" affiche à l'écran (et rien d'autre).
• "Lecture des entrées" détermine l'état demandé par le joueur (state) en lisant le clavier (et rien d'autre).
• "Exécution des animations" détermine l'animation à afficher en fonction de l'état du joueur (et rien d'autre).
• "Simulation du monde" simule la physique et les interactions entre le joueur et le monde (et rien d'autre).
Il faut absolument préserver le maximum de séparation et d'indépendance sinon ton code ne marchera pas et tu ne trouveras pas les bugs (ce qui est déjà le cas). Et il faut vraiment, vraiment, vraiment que tu sépares tout en plusieurs fonctions pour t'obliger à conserver cette indépendance. Quand tu auras une fonction par bloc les fonctions n'auront pas accès aux variables de main() et donc tu seras obligé de passer les informations en paramètre. Et tu verras tout de suite si tu as besoin de current_anim_time_left dans le moteur physique que ce n'est pas normal et que tu t'es planté.
Si malgré la séparation ton animation ne se produit pas comme prévu, tu sais que le problème est dans "Exécution des animations" et nulle part ailleurs. Il n'y a pas de variable magique qui interfère avec tous les blocs, pas de changement d'animation durant la lecture du clavier ou la simulation du monde, et tu sais où chercher.
Citer : Posté le 28/12/2020 18:27 | #
Bonjour !
Merci beaucoup pour ton long message, et pour le code que tu m'a filé.
Je l'ai relu et compris, puis transféré sur ma calculatrice et ca marche !
Je vais maintenant voir comment le personnage pourrait il reculer.
Merci encore !
EDIT : Pardonne moi, je code sous Vim
Ajouté le 28/12/2020 à 19:17 :
Enfin ! J'ai fini l'animation du personnage quand il recule, j'ai donc fini les animations de personnage !
Merci beaucoup pour ton aide, Lephe', j'ai conscience que tu a pris du temps que tu aurais pu prendre pour faire autre chose pour me répondre, et que je suis chiant !
Je vais mettre ca sur Github si j'y arrive !
Citer : Posté le 29/12/2020 18:06 | #
Pour tout ce qui est projet destiné à être partagé ici, on recommande plutôt d'utiliser la forge de Planète Casio : https://git.planet-casio.com
Après c'est toi qui choisis où tu met ton code
Citer : Posté le 29/12/2020 19:45 | #
Suite à une campagne de spam, les inscriptions sont fermées. Demandez à un admin de Planète Casio pour ouvrir un compte.
Je demande !
Ajouté le 29/12/2020 à 20:01 :
D'ailleurs, ca n'a pas trop de rapport mais je vais pas créer 50 000 topics :
HELP : J'ai besoin d'une image d'un bloc style Minecraft genre ca :
Mais avec l'outil Seuil de Gimp ca donne un truc bizarre :
Ou alors : (avec Image → Mode → Couleurs indexées → Floyd-Steinberg) :
Si vous avez une idée...
Citer : Posté le 29/12/2020 20:04 | #
Déjà prends une image non bruitée et en résolution originale.
Citer : Posté le 29/12/2020 20:11 | #
Je trouve pas ca...
(Si par résolution originale tu veux dire grande résolution après il faut que je la mette après en très petite résolution pour la mettre dans un jeu gint)
Citer : Posté le 29/12/2020 20:15 | #
La résolution originale est la plus petite, tu vois bien que c'est une version agrandie. Il suffit de chercher un texture pack Minecraft pour mettre la main dessus :3
Citer : Posté le 29/12/2020 21:39 | # | Fichier joint
Par votre serviteur… (c'est moi )
J'espère que c'est ça dont on parlait, j'ai passé 1/4 d'heure sur Gimp à le faire pixel par pixel… si c'est pas ça, pas trop grave, je faisais une petite pause x)
L'image en 16x16 pixels : https://www.planet-casio.com/storage/forums/min-bloc-180230.png
C'était peut être pas la meilleure façon de faire…
2 autres façons :
- Prendre une image pas bruitée et descendre à la résolution originale d'un bloc, c'est à dire 16x16 pixels.
Par exemple, avec cette image, on l'enregistre sous 11635.jpg, puis on met
convert 11635.jpg -scale 16 11635.jpg dans le Terminal => L'image 11635 est désormais en résolution originale 16x16 pixels.
- Prendre l'image originale dans le texture pack. Et c'est tout
Citer : Posté le 29/12/2020 21:41 | #
C'est totalement ca, merci beaucoup, je vais mettre ca en noir et blanc !
Citer : Posté le 29/12/2020 22:04 | #
Il me faut un email à lier au compte pour te créer un compte Gitea, envoie-moi ça par MP (ou dis-moi de prendre celui de ton compte PC).
Citer : Posté le 29/12/2020 22:29 | #
Mp envoyé !
Citer : Posté le 29/12/2020 22:31 | #
Envoyé
Citer : Posté le 30/12/2020 11:58 | #
Github mis à jour ! : https://gitea.planet-casio.com/Potter360/Elphorina/
Citer : Posté le 30/12/2020 15:48 | #
Maintenant que tu as une page du projet, ça ne sert à rien de l'indiquer ici...
Ta page est justement faite pour ça ainsi que de poser des questions dessus
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
Citer : Posté le 30/12/2020 18:38 | #
Ouaip mais j'avais mis ce message avant de créer une page de projet