Partage
  • Partager sur Facebook
  • Partager sur Twitter

RGB-GEN-3.2.

Mon premier "vrai" programme en C

    29 octobre 2006 à 16:48:10

    Alors voilà après environ 3 heures de travail acharné, j'ai pondu ce petit programme en C, le premier ayant une certaine utilité de ceux que j'ai créés.

    On peut télécharger tout ce qui est nécéssaire là:

    http://s1.quicksharing.com/v/318551/RGB_GEN.zip.html

    Et le code du main.c est ici:
    ATTENTION: Code tordu accrochez-vous! J'imagine que plusieurs n'auraient pas procédé comme moi.


    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <FMOD/fmod.h>
    #include <SDL/SDL_ttf.h>

    void pause();
    int main(int argc, char *argv[])
    {
        FILE* file = NULL;
        file = fopen("color.txt", "a+");
        if (file == NULL)
        return 0;
        SDL_Surface *ecran = NULL;
        SDL_Surface *texte = NULL;
        SDL_Rect position;
        SDL_Event event;
        SDL_Color couleur = {255, 255, 255};
        TTF_Font *police = NULL;
        FMUSIC_MODULE *musique = NULL;
        unsigned char r = 0, g = 0, b = 0;
        char texteAffiche[45] = " ";
        long continuer = 1;

        TTF_Init();
        FSOUND_Init(44100, 32, 0);
        musique = FMUSIC_LoadSong("music.mid");
        SDL_Init(SDL_INIT_VIDEO);

        police = TTF_OpenFont("police.ttf", 35);
        SDL_WM_SetIcon(IMG_Load("icon.gif"), NULL);
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE);
        SDL_WM_SetCaption("RGB-GEN", NULL);

            FMUSIC_SetLooping(musique, 1);
            FMUSIC_SetMasterVolume(musique, 100);
            FMUSIC_PlaySong(musique);
            couleur.r = 255;
            couleur.g = 255;
            couleur.b = 255;
            SDL_EnableKeyRepeat(30, 30);
            while (continuer)
            {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    return 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        break;
                        case SDLK_ESCAPE:
                        {
                            continuer = 0;
                            break;
                        }
                        case SDLK_UP:
                        {
                            b++;
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                            SDL_Flip(ecran);
                        }
                            break;
                        case SDLK_DOWN: // Flèche bas
                        {
                            b--;
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                            SDL_Flip(ecran);
                            break;
                        }
                        case SDLK_RIGHT: // Flèche droite
                        {
                            g++;
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                            SDL_Flip(ecran);
                            break;
                        }
                        case SDLK_LEFT: // Flèche droite
                        {
                            g--;
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                            SDL_Flip(ecran);
                            break;
                        }
                        case SDLK_z:
                        {
                            r++;
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                            SDL_Flip(ecran);
                            break;
                        }
                        case SDLK_x:
                        {
                            r--;
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                            SDL_Flip(ecran);
                            break;
                        }
                        case SDLK_s:
                        {
                            fprintf(file, "Couleur choisie au format Rouge/Vert/Bleu: %ld/%ld/%ld\n", r, g, b);
                            SDL_Delay(500);
                            break;
                        }
                        case SDLK_p:
                        {
                            if (FMUSIC_GetPaused(musique))
                            {
                            FMUSIC_SetPaused(musique, 0);
                            SDL_Delay(100);
                            }
                            else
                            {
                            FMUSIC_SetPaused(musique, 1);
                            SDL_Delay(100);
                            }
                        }
                    break;
            }
            couleur.r = g;
            couleur.g = b;
            couleur.b = r;
            if (couleur.r <= 128 && couleur.g <= 128 && couleur.b <= 128)
            {
            couleur.r = 255;
            couleur.g = 255;
            couleur.b = 255;
            }
            else if (couleur.r > 129 && couleur.g > 129 && couleur.b > 129)
            {
            couleur.r = 0;
            couleur.g = 0;
            couleur.b = 0;
            }
            sprintf(texteAffiche, "R: %ld V: %ld B: %ld", r, g, b);
            texte = TTF_RenderText_Solid(police, texteAffiche, couleur);
            position.x = 640 / 2 - texte->w;
            position.y = 480 / 2 - texte->h;
            SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte contenant le temps */
            SDL_Flip(ecran);
            }
            }
        fclose(file);
        TTF_CloseFont(police);
        TTF_Quit();
        FMUSIC_FreeSong(musique);
        FSOUND_Close();
        SDL_Quit();

        return EXIT_SUCCESS;
    }
    void pause()
    {
        int continuer = 1;
        SDL_Event event;

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }



    Instructions:

    1. On bleuit l'écran avec les flèches par en haut(-) et par en bas(+)
    2. On verdit l'écran avec les flèches droite(+) gauche(-).
    3. On rougit l'écran avec les touches "x"(-) et "z"(+).
    4. On peut appuyer sur "s" à tout moment: le code de la couleur au format RGB sera enregistré dans color.txt.
    5. ESC termine le programme automatiquement.

    Lorsque la valeur de r, de g ou de b est égale à 0, elle va monter à 255 si vous continuer à appuyer sur la même touche. Lorsque la valeur de r, de g ou de b est égale à 255, elle va continuer à 0 si vous continuez à appuyer sur la même touche.


    Bonne génération de couleur!

    P.S: Il me reste un petit défaut de couleur... dans les gris et tout ca, la couleur du texte est quasiment égale ou très mal contrastée avec la couleur de fond et on ne vois pas. Comment régler ça?
    • Partager sur Facebook
    • Partager sur Twitter
      30 octobre 2006 à 12:00:59

      Personne n'est intéressé à me laisser un p'tit commentaire? ;)
      • Partager sur Facebook
      • Partager sur Twitter
        30 octobre 2006 à 14:00:30

        C'est vrai que ça peut être intéressant pour trouver des couleur, mais je pense que les touches sont à revoir, car pas très facile.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          30 octobre 2006 à 14:06:52

          Peut être en mettant des touches du pavé numérique, (1/7 + 2/8 + 3/9), ou encore des lettres (a/w + z/x + e/c). Sinon le


          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                                  SDL_Flip(ecran);

          Je l'aurait mis après le switch.

          Aussi, je ne voit pas bien a quoi sert la fonction de pause ici ? Sinon c'est pas mal e trouve.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            30 octobre 2006 à 14:45:18

            C'est juste un conseil, mais à mon avis tu commentes pas assez ton code...
            ^^
            • Partager sur Facebook
            • Partager sur Twitter
              31 octobre 2006 à 2:47:40

              Ouais désolé je ne commente jamais mes codes...

              Ben, j'ai juste fait les touches comme je pensais, et voilà ;) je les trouve plus ou moins faciles à retenir!

              La fonction de pause, eh, c'est vrai! J'ai oublié de l'enlever, je croyais en avoir besoin. Merci du signalement
              • Partager sur Facebook
              • Partager sur Twitter
                2 novembre 2006 à 12:20:56

                Pour ton problème de couleur du texte, tu peux essayer de faire en sorte que sa couleur varie avec les changements de couleurs du fond : par exemple, en retirant 100 à chacune des données de couleurs. (si ton fond est en rgb(241,121,99) alors le texte sera en rgb(141,21,254) par exemple).
                Ce n'est qu'une idée, et tu peut faire des changements plus subtils (opposition par rapport au cercle des couleurs, etc...)
                • Partager sur Facebook
                • Partager sur Twitter
                  2 novembre 2006 à 20:15:42

                  Citation : xstg

                  P.S: Il me reste un petit défaut de couleur... dans les gris et tout ca, la couleur du texte est quasiment égale ou très mal contrastée avec la couleur de fond et on ne vois pas. Comment régler ça?


                  Tu ecris le texte de la couleur inverse de la couleur affichée ! ;) (Le probleme ne se posera que pour les gris moyens)
                  Sinon, tu ecrire le texte sur une couleur d'arrière-plan !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 novembre 2006 à 0:50:36

                    Voilà la nouvelle version:

                    #include <stdlib.h>
                    #include <stdio.h>
                    #include <SDL/SDL.h>
                    #include <SDL/SDL_image.h>
                    #include <FMOD/fmod.h>
                    #include <SDL/SDL_ttf.h>

                    int main(int argc, char *argv[])
                    {
                        FILE* file = NULL;
                        file = fopen("color.txt", "a+");
                        if (file == NULL)
                        return 0;
                        SDL_Surface *ecran = NULL;
                        SDL_Surface *texte = NULL;
                        SDL_Rect position;
                        SDL_Event event;
                        SDL_Color couleur = {255, 255, 255};
                        TTF_Font *police = NULL;
                        FMUSIC_MODULE *musique = NULL;
                        unsigned char r = 0, g = 0, b = 0;
                        char texteAffiche[45] = " ";
                        long continuer = 1;

                        TTF_Init();
                        FSOUND_Init(44100, 32, 0);
                        musique = FMUSIC_LoadSong("music.mid");
                        SDL_Init(SDL_INIT_VIDEO);

                        police = TTF_OpenFont("police.ttf", 35);
                        SDL_WM_SetIcon(IMG_Load("icon.gif"), NULL);
                        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE);
                        SDL_WM_SetCaption("RGB-GEN", NULL);

                            FMUSIC_SetLooping(musique, 1);
                            FMUSIC_SetMasterVolume(musique, 100);
                            FMUSIC_PlaySong(musique);
                            couleur.r = 255;
                            couleur.g = 255;
                            couleur.b = 255;
                            SDL_EnableKeyRepeat(30, 30);
                            while (continuer)
                            {
                            SDL_WaitEvent(&event);
                            switch(event.type)
                            {
                                case SDL_QUIT:
                                    return 0;
                                    break;
                                case SDL_KEYDOWN:
                                    switch(event.key.keysym.sym)
                                    {
                                        break;
                                        case SDLK_ESCAPE:
                                        {
                                            continuer = 0;
                                            break;
                                        }
                                        case SDLK_UP:
                                        {
                                            b++;
                                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                                            SDL_Flip(ecran);
                                        }
                                            break;
                                        case SDLK_DOWN: // Flèche bas
                                        {
                                            b--;
                                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                                            SDL_Flip(ecran);
                                            break;
                                        }
                                        case SDLK_RIGHT: // Flèche droite
                                        {
                                            g++;
                                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                                            SDL_Flip(ecran);
                                            break;
                                        }
                                        case SDLK_LEFT: // Flèche droite
                                        {
                                            g--;
                                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                                            SDL_Flip(ecran);
                                            break;
                                        }
                                        case SDLK_z:
                                        {
                                            r++;
                                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                                            SDL_Flip(ecran);
                                            break;
                                        }
                                        case SDLK_x:
                                        {
                                            r--;
                                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, r, g, b));
                                            SDL_Flip(ecran);
                                            break;
                                        }
                                        case SDLK_s:
                                        {
                                            fprintf(file, "Couleur choisie au format Rouge/Vert/Bleu: %ld/%ld/%ld\n", r, g, b);
                                            SDL_Delay(500);
                                            break;
                                        }
                                        case SDLK_p:
                                        {
                                            if (FMUSIC_GetPaused(musique))
                                            {
                                            FMUSIC_SetPaused(musique, 0);
                                            SDL_Delay(100);
                                            }
                                            else
                                            {
                                            FMUSIC_SetPaused(musique, 1);
                                            SDL_Delay(100);
                                            }
                                        }
                                    break;
                            }
                            couleur.r = 255 - r;
                            couleur.g = 255 - g;
                            couleur.b = 255 - b;
                            sprintf(texteAffiche, "R: %ld V: %ld B: %ld", r, g, b);
                            texte = TTF_RenderText_Solid(police, texteAffiche, couleur);
                            position.x = ecran->w / 2 - texte->w;
                            position.y = ecran->h / 2 - texte->h;
                            SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte contenant le temps */
                            SDL_Flip(ecran);
                            }
                            }
                        fclose(file);
                        TTF_CloseFont(police);
                        TTF_Quit();
                        FMUSIC_FreeSong(musique);
                        FSOUND_Close();
                        SDL_Quit();

                        return EXIT_SUCCESS;
                    }
                    • Partager sur Facebook
                    • Partager sur Twitter

                    RGB-GEN-3.2.

                    × 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