Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Gint problème while
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Gint problème while

Posté le 26/11/2020 19:39

Bonjour !
J'ai fait ce code :
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/gint.h>
#define bool int
#define true 1
#define false 0

int main(void)
{
        extern bopti_image_t img_Vaisseau;
        int key = 0;
        int x = 0;
        int yballe = 150;
        bool isNotGood = false;

        dclear(C_WHITE);
        bool isFinish = false ;
        while(!isFinish){
                dclear(C_WHITE);
                dimage(x, 150,&img_Vaisseau);
                dupdate();
                key = getkey_opt(GETKEY_DEFAULT & ~GETKEY_MOD_SHIFT,0).key;
                if(key == KEY_EXIT)
                                gint_osmenu();
                if(key == KEY_LEFT)
                        x = x-10;
                if(key == KEY_RIGHT)
                        x = x+10;
                if(key == KEY_SHIFT)
                {
                        yballe = 150;
                        if(yballe <= 0)
                        {

                                isNotGood = true;

                        }
                        while(isNotGood != true )
                        {
                                dclear(C_WHITE);
                                dtext(x+49,yballe,C_BLACK,"|");
                                yballe = yballe-10;
                                dimage(x,150,&img_Vaisseau);
                                dupdate();
                        }
                }

        }

        getkey();
        return 1;
}

Mais ma boucle while(isNotGood != true) tourne à l'infini !
Si vous avez des idées, je suis preneur !


Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

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

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] },
};

/* 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);

/* ... */

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

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
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

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 as déjà défini anim non ?

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Citer : Posté le 21/12/2020 18:41 | #


Mais déjà : ca sert à quoi les structures ?
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Citer : Posté le 21/12/2020 19:01 | #


J'ai ca : https://linx.breizh.pm/9e4ol24s.jpg
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

Citer : Posté le 21/12/2020 19:05 | #


Un pointeur nul s'est glissé dans ton code.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

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/display.h>
#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
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

Citer : Posté le 22/12/2020 21:56 | #


Tu n'initialises pas l'animation :

struct anim *current_anim;

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 ^^"
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Citer : Posté le 23/12/2020 16:27 | #


Lephenixnoir a écrit :
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 :
struct anim *current_anim;

Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

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 :

/* Pour passer à l'anim normale */
current_anim = &anim_idle[0];
current_anim_time_left = current_anim->duration;

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Citer : Posté le 23/12/2020 16:36 | #


Donc, si j'ai bien compris, avant
struct anim *current_anim;
, il faut que je mette :
current_anim = &anim_idle[0];
current_anim_time_left = current_anim->duration;
?
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

Citer : Posté le 23/12/2020 16:36 | #


Est-ce que tu penses que ça va compiler si tu le mets avant ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Citer : Posté le 23/12/2020 16:38 | #


Si tu me le dis c'est que non, mais je vois pas pourquoi
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

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.

x = 2;
y = 3;
int x;
int y;

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

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 :
Lephenixnoir a écrit :
il faut l'initialiser


Justement, struct anim *current_anim; l'inistialise non ?
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

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; // Pas initialisé (valeur imprévisible)

int score = 0; // Initialisé à 0

int score;
score = 0; // Initialisé à 0 aussi

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Citer : Posté le 23/12/2020 16:43 | #


Donc :
struct anim *current_anim = &anim_idle[0];
?
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24572 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1254 Défis: 2 Message

Citer : Posté le 23/12/2020 16:46 | #


Ca :
        struct anim *current_anim = &anim_idle[0];
        int current_anim_time_left = 0;

C'est bon ?

Ajouté le 23/12/2020 à 17:43 :
Avec :
#include <gint/display.h>
#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'
Globalement, coder. Mal, mais coder.
Cakeisalie5 En ligne Ancien administrateur Points: 1959 Défis: 11 Message

Citer : Posté le 23/12/2020 18:59 | #


Je ne vois pas de dupdate().
Respirateur d'air, BDFL de Cahute, des utilitaires de communication pour calculatrices CASIO.


Mon blogMes autres projets

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 v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 249 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