Partage
  • Partager sur Facebook
  • Partager sur Twitter

animation sur ncurses

    4 février 2023 à 18:26:13

    Bonjour,

    J'aimerais afficher le message "attrape" et retirer le chat de la fenetre, mais mon code n'affiche par le message et le chat clignote comment pourrais-je corriger mon code, s'il vous plaît ?

    Je vous remercie d'avance.

    #include <ncurses.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
    #define DELAI 500
    
    void effacer_chat(int y, int x) {
    	/*
    	efface le message et le texte 
    	*/
        mvprintw(0, 0, "             ");
        mvprintw(y, x, "␣␣␣␣␣");
        mvprintw(y + 1, x, "␣␣␣␣␣");
        mvprintw(y + 2, x, "␣␣␣␣␣");
       
    
    }
    void dessiner_chat(int y, int x, int compt) {
    	/*
    	dessine un chat puis affiche le message 
    	"attrape lorsqu'on clique sur le chat
    	avec la souris 
    	*/
        if(compt == 1){
           // mon problème est ici 
            refresh();
            compt = 0;
            mvprintw(0 , 0 , "Attrape !");
            effacer_chat(y , x);
            usleep(DELAI);
            refresh();
        }
    
        mvprintw(y, x, "*****");
        mvprintw(y + 1, x, "*␣*␣*");
        mvprintw(y + 2, x, "*****");
    }
    
    
    
    
    int main() {
        int touche;
        int chat_x, chat_y;
        int souris_x, souris_y;
        int compt = 0;
        MEVENT ev;
    
        srand(time(NULL));
    
        initscr();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);
        nodelay(stdscr, TRUE);
        curs_set(FALSE);
        mousemask(ALL_MOUSE_EVENTS| REPORT_MOUSE_POSITION, NULL);
    
        chat_x = rand() % (COLS - 4);
        chat_y = rand() % (LINES - 2);
    
        while (1) {
            
            touche = getch();
            if (touche == KEY_MOUSE && getmouse(&ev) == OK) {
                souris_x = ev.x;
                souris_y = ev.y;
                
    
            if ((chat_x <= souris_x) && (souris_x <= chat_x + 4) && (chat_y <= souris_y) && (souris_y <= chat_y + 2)) {
                compt = 1;
                effacer_chat(chat_y, chat_x);
                
                chat_x = rand() % (COLS - 4);
                chat_y = rand() % (LINES - 2);
            }
            } 
            
            dessiner_chat(chat_y, chat_x, compt);
            
            refresh();       
        }
    
        getch();
        endwin();
    }



    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2023 à 20:40:09

      Hello,

      Je ne connais pas ncurses, et je n'ai pas cherché à comprendre ton raisonnement (il manque pas mal d'informations), mais où remets-tu compt à zéro ? (je suppose que cette variable doit avoir une importance).

      Edit: bien sur, tu remets compt à zéro dans la fonction dessiner_chat(), mais ce compt - là n'est qu'une copie de la variable compt du main(), et donc mettre la copie à zéro ne changera pas la valeur de la variable compt du main()

      -
      Edité par edgarjacobs 5 février 2023 à 0:17:28

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        5 février 2023 à 9:19:26

        Au passage, si on nomme une fonction dessiner_chat, elle doit s'occuper de dessiner un chat, et ne devrait rien modifier à part le contenu de l'écran.

        Apparemment elle fait trois choses

        • Afficher un message
        • Afficher ou pas le chat
        • Mettre à jour ou pas (pourquoi ?)  l'écran, attendre

        Ca serait plus simple d'avoir  dessiner_ecran  qui appelle ou pas dessine_chat, et afficher_message, et termine par la mise à jour de l'ecran

        A part ça, ça serait sans doute mieux aussi de regrouper les infos sur l'etat du jeu (positions etc) dans une structure, plutôt que de les éparpiller. Mais peut être ne connaissez vous pas encore les structures (je suppose que c'est dans le cadre d'un cours )

        ---

        Attention, y a plein de trucs qui vont pas bien

        • La fonction usleep est obsolète depuis 2008. A la place, il faut utiliser nanosleep.
        • c'est mieux de préciser les unités dans le nom des constantes, par exemple
        ce qui nous donne
        #define DELAI_MS 500
        
        const struct timespec demande_delai = {
          .tv_nsec = 1000 * 1000 * DELAI_MS
        }
        
        nanosleep(& demande_delai, NULL);
        

        Aussi

        • '␣' n'est pas un caractère 8 bits (du moins du coté de l'iso-latin 1 et cie)
        • on le trouve dans les documents, supports de cours, bouquins pour figurer un espace (ah, le package listings de LaTeX...)
        Il faut donc remplacer
          mvprintw(y, x, "␣␣␣␣␣");
        par
          mvprintw(y, x, "     ");
        etc.


        EDIT

        avec le nodelay(stdscr, TRUE);  on est parti pour faire un programme qui bouffe du temps processeur comme un goret. Un meilleur solution, c'est de faire nodelay(stdscr, FALSE); avec
        timeout(DELAI_MS);
        

        ce qui rend le getch() bloquant seulement un certain temps.  Et permet de se dispenser des délais : le programme réagit à des évènements quand ils se produisent, plutot que de surveiller pour voir si ils arrivent



        Suffit alors de regarder si le résultat c'est KEY_MOUSE qui signale un évènement venant de la souris, ou ERR si il y a eu un "timeout".

        Aussi:  mousemask(BUTTON1_CLICKED, NULL);   pour ne pas prendre en compte des évènements parasites (appui et relachement)

        -
        Edité par michelbillaud 5 février 2023 à 16:22:53

        • Partager sur Facebook
        • Partager sur Twitter

        animation sur ncurses

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown