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: 1221 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 !


Précédente 1, 2, 3, 4
Cakeisalie5 En ligne Ancien administrateur Points: 1909 Défis: 11 Message

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


Je ne vois pas de dupdate().

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Potter360 Hors ligne Rédacteur Points: 1221 Défis: 2 Message

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/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;
                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/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;
                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
Globalement, coder. Mal, mais coder.
Kbd2 Hors ligne Membre Points: 269 Défis: 0 Message

Citer : Posté le 26/12/2020 12:18 | #


You don't ever change x...
Potter360 Hors ligne Rédacteur Points: 1221 Défis: 2 Message

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

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 :

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

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 !
Globalement, coder. Mal, mais coder.
Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 29/12/2020 18:06 | #


Je vais mettre ca sur Github si j'y arrive !

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Potter360 Hors ligne Rédacteur Points: 1221 Défis: 2 Message

Citer : Posté le 29/12/2020 19:45 | #


Sur le lien de la forge PlanetCasio il y a écrit :
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...
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24229 Défis: 170 Message

Citer : Posté le 29/12/2020 20:04 | #


Déjà prends une image non bruitée et en résolution originale.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Potter360 Hors ligne Rédacteur Points: 1221 Défis: 2 Message

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

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

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

EDIT
Cliquer pour enrouler
EDIT :
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
Potter360 Hors ligne Rédacteur Points: 1221 Défis: 2 Message

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


C'est totalement ca, merci beaucoup, je vais mettre ca en noir et blanc !
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24229 Défis: 170 Message

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

Citer : Posté le 29/12/2020 22:29 | #


Mp envoyé !
Globalement, coder. Mal, mais coder.
Lephenixnoir Hors ligne Administrateur Points: 24229 Défis: 170 Message

Citer : Posté le 29/12/2020 22:31 | #


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

Citer : Posté le 30/12/2020 11:58 | #


Github mis à jour ! : https://gitea.planet-casio.com/Potter360/Elphorina/
Globalement, coder. Mal, mais coder.
Tituya Hors ligne Administrateur Points: 2141 Défis: 26 Message

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
Bretagne > Reste du globe
(Et de toute façon, vous pouvez pas dire le contraire)
Projet en cours : Adoranda

Mes programmes
Hésite pas à faire un test !


Potter360 Hors ligne Rédacteur Points: 1221 Défis: 2 Message

Citer : Posté le 30/12/2020 18:38 | #


Ouaip mais j'avais mis ce message avant de créer une page de projet
Globalement, coder. Mal, mais coder.
Précédente 1, 2, 3, 4

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