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 !


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

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

Citer : Posté le 20/12/2020 20:37 | #


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

Ç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().
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 20/12/2020 20:50 | #


En mettant timeout à 0 ?
Globalement, coder. Mal, mais coder.
Lephenixnoir En ligne Administrateur Points: 24223 Défis: 170 Message

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é.
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 20/12/2020 21:11 | #


Mais concrétement il faut que je fasse quoi ?
Globalement, coder. Mal, mais coder.
Lephenixnoir En ligne Administrateur Points: 24223 Défis: 170 Message

Citer : Posté le 20/12/2020 21:23 | #


En principe rien, si je suis surpris si ça ne marche pas.
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 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 ?
Globalement, coder. Mal, mais coder.
Lephenixnoir En ligne Administrateur Points: 24223 Défis: 170 Message

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

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

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 à

--marche;
if(marche == 0) ...

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 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 :
dimage(x,40,marche ? &img_personnagemarche : &img_personnage);


Je comprends pas...

Ajouté le 21/12/2020 à 17:08 :
En particulier, si marche = -, quelle image va etre affichée ?
Globalement, coder. Mal, mais coder.
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 21/12/2020 17:11 | #


Potter360 a écrit :
Dans :
dimage(x,40,marche ? &img_personnagemarche : &img_personnage);


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 :
dimage(x, 40, (/*condition*/ marche) ? (/*si la condition est remplie*/ &img_personnagemarche) : (/*sinon*/ &img_personnage));

Tu peux remplacer par un if/else si ce n'est pas très clair pour toi :
if (marche) {
    dimage(x, 40, &img_personnagemarche);
} else {
    dimage(x, 40, &img_personnage);
}

J'espère que ça t'aura aidé.
ouais ouais
Lephenixnoir En ligne Administrateur Points: 24223 Défis: 170 Message

Citer : Posté le 21/12/2020 17:14 | #


En particulier, si marche = -, quelle image va etre affichée ?

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

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
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 21/12/2020 18:09 | #


Je vais regarder ca...
En attendant avec ce code l'animation marche mais le perso n'avance pas
Globalement, coder. Mal, mais coder.
Lephenixnoir En ligne Administrateur Points: 24223 Défis: 170 Message

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


if(marche>-5)
    marche--;

if(x >= 140)
    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 !)
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 21/12/2020 18:21 | #


J'ai supprimé mes 2 derniers messages, code modifié sur Github, mais ca ne marche pas plus...
Globalement, coder. Mal, mais coder.
Lephenixnoir En ligne Administrateur Points: 24223 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)

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