Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL - Zone d'entrée de texte

Comment faire ?

Sujet résolu
    18 avril 2006 à 9:34:23

    Bonjour la communauté,

    Dans un projet C/C++, le tout allié avec un peu de SDL pour que l'utilisateur ne soit pas trop perdu. En gros je lui fait un interface graphique mimi pour que monsieur lambda ne panique pas et puisse cliquer gentillement sur tout plein de petits boutons... (si seulement il connaissait la ligne de commande :p )

    Bref, dans l'histoire j'aurais donc besoin de pouvoir faire des boutons et des zones de saisie en SDL, un peu comme un formulaire web et de pouvoir récupérer les données dans une ou plusieurs variables.

    Quelqu'un saurait-il faire celà ou peut être est-ce que celà fera parti d'un futur cours??

    Merci d'avance à vous

    phmorin
    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2006 à 10:19:35

      Déjà, tu auras besoin de la librairie SDL_TTF, pour l'affichage du texte dans la zone de saisie.

      Tu aura besoin d'une var (char saisieTexte[100] ou [200]..). Lorsque l'utilisateur de tonn prog appuie sur une touche, tu en récupère la valeur ascii, et tu l'affecte à un élément du tableau saisieTexte (saisieTexte[1],[45]..)

      Et à chaque tour de boucle tu affiche le texte sur ton écran.. :)

      J'ai jamais essayé, c'est surement du n'importe quoi ce que j'ai dit, mais ca devrait etre globalement ca.. :lol:
      • Partager sur Facebook
      • Partager sur Twitter
        18 avril 2006 à 11:44:50

        Tu peux simuler une zone de texte en sdl mais ça demande du travail et c'est jamais très pratique.
        Je te conseille plutôt d'utiliser une librairie comme GTK+ si tu veux créer des zones de texte et des fenêtres. La SDL est moyennement adaptée pour ce que tu veux faire.
        • Partager sur Facebook
        • Partager sur Twitter

        If you'd like to join us, read "How do we work at OpenClassrooms"! :)

          18 avril 2006 à 12:17:36

          Il me semble que c'est ce que je cherche, mais j'ai un peu de mal (pour ne pas dire beaucoup) à installer les librairies GTK+ sur CodeBlock et à configurer le compliteur... quelqu'un pourrait-il me donner un coup de pouce?
          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2006 à 12:24:20

            Mateo encore faut-il réussir à installer la librairie xD ( quelqu'un pourrait pas faire un tuto pour installer GTK+ ? siouplait ^^ )
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              18 avril 2006 à 12:28:34

              je l'ai installé, mais je ne pourrait pas vraiment t'espliquer, je vait cherche le post..

              Voila les liens :
              http://blog.developpez.com/index.php?blog=58&title=installation_de_gtk_sous_code_blocks&more=1&c=1&tb=1&pb=1
              a la fin de l'articles, il te demande de télécharger les runtimes, j'ai pris celui là qui marche bien :
              les runtimes http://www.clubic.com/lancer-le-telechargement-9881-0-the-gimp.html

              Lit ce sujet, il y asurement des infos qui vont t'intéresser.
              http://www.siteduzero.com/forum-83-26140-orientation-du-cours.html


              Voila un très bon tutoriel http://www.gtk-fr.org/wakka.php?wiki=PageAccueil
              • Partager sur Facebook
              • Partager sur Twitter
                18 avril 2006 à 12:46:10

                Moi j'ai fait une fonction, mais elle est pas encore terrible.
                Enfin je balance si tu veux:
                int createTextField(SDL_Surface* screen,
                    int x, int y, int w, SDL_Event* event, players *field,
                    char* fontName, int fontSize, Uint32 iColorText,
                    Uint32 iColorField) {

                //init et variables
                if(!TTF_WasInit())
                    TTF_Init();
                SDL_EnableUNICODE(1);
                x+=2;
                y+=2;

                //rects et couleurs
                SDL_Rect coord;
                coord.x = x;
                coord.y = y;
                SDL_Rect coord2;
                coord2.x = 0;
                coord2.y = 0;
                coord2.w = 0;
                coord2.h = 0;
                SDL_Color fontColor;
                SDL_Color fieldColor;

                fontColor.r = (iColorText & SDL_MapRGB(screen->format,255,0,0)) >> 16;
                fontColor.g = (iColorText & SDL_MapRGB(screen->format,0,255,0)) >> 8;
                fontColor.b = (iColorText & SDL_MapRGB(screen->format,0,0,255));

                fieldColor.r = (iColorField & SDL_MapRGB(screen->format,255,0,0)) >> 16;
                fieldColor.g = (iColorField & SDL_MapRGB(screen->format,0,255,0)) >> 8;
                fieldColor.b = (iColorField & SDL_MapRGB(screen->format,0,0,255));

                //surfaces
                TTF_Font *font = TTF_OpenFont(fontName, fontSize);
                if(font == NULL)
                    return -1;
                SDL_Surface *textSurface = NULL,
                            *barre_hori = NULL,
                            *barre_verti = NULL,
                            *fond = NULL,
                            *cursor = NULL;

                if(field->text[0] == 0) {
                    field->text[0] = 'a';
                    textSurface = TTF_RenderText_Blended(font, field->text, fieldColor);
                    field->text[0] = 0;
                }
                else
                    textSurface = TTF_RenderText_Blended(font, field->text, fontColor);

                fond = SDL_CreateRGBSurface(SDL_HWSURFACE, w, textSurface->h, 32, 0, 0, 0, 0);
                SDL_FillRect(fond, NULL, iColorField);
                coord2.x = 0;
                coord2.y = 0;
                coord2.w = fond->w - 6;
                coord2.h = fond->h;
                if(textSurface->w > fond->w - 6)
                    coord2.x = textSurface->w - fond->w + 6;

                switch(event->type) {
                    case SDL_MOUSEBUTTONUP:
                        if(event->motion.x > x && event->motion.x < x+fond->w && event->motion.y > y && event->motion.y < y+fond->h)
                            field->active = (int*)1;
                        else
                            field->active = (int*)0;
                    break;
                    case SDL_KEYDOWN:
                        if(event->key.keysym.sym == SDLK_BACKSPACE && field->active == (int*)1) {
                            if(strlen(field->text) > 1) {
                                field->text[strlen(field->text)] = 0;
                                field->text[strlen(field->text)-1] = '\0';
                            }
                            else if(strlen(field->text) == 1 && field->active == (int*)1) {
                                field->text[1] = 0;
                                field->text[0] = 0;
                            }
                        }
                        else if(event->key.keysym.unicode < 256 && field->active == (int*)1) {
                            field->text[strlen(field->text)+1] = '\0';
                            field->text[strlen(field->text)] = event->key.keysym.unicode;
                            SDL_FreeSurface(textSurface);
                            textSurface = TTF_RenderText_Blended(font, field->text, fontColor);

                        }

                    break;
                }



                SDL_BlitSurface(fond, NULL, screen, &coord);
                coord.x += 3;
                SDL_BlitSurface(textSurface, &coord2, screen, &coord);


                //barre horizontale
                barre_hori = SDL_CreateRGBSurface(SDL_HWSURFACE, w+4, 2, 32, 0, 0, 0, 0);
                SDL_FillRect(barre_hori, NULL, SDL_MapRGB(screen->format, 0, 0, 100));
                coord.x = x-2;
                coord.y = y-2;
                SDL_BlitSurface(barre_hori, NULL, screen, &coord);
                coord.y = y+fond->h;
                SDL_BlitSurface(barre_hori, NULL, screen, &coord);

                //barre verticale
                barre_verti = SDL_CreateRGBSurface(SDL_HWSURFACE, 2, fond->h+4, 32, 0, 0, 0, 0);
                SDL_FillRect(barre_verti, NULL, SDL_MapRGB(screen->format, 0, 0, 100));
                coord.x = x-2;
                coord.y = y-2;
                SDL_BlitSurface(barre_verti, NULL, screen, &coord);
                coord.x = x+fond->w;
                SDL_BlitSurface(barre_verti, NULL, screen, &coord);

                //curseur
                cursor = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, textSurface->h-4, 32, 0, 0, 0, 0);
                SDL_FillRect(cursor, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
                coord.x = x+textSurface->w+3;
                coord.y = y+2;
                if(field->text[0] == 0)
                    coord.x = x+2;
                if(coord.x > x+fond->w-2)
                    coord.x = x+fond->w - 2;
                if(field->active == (int*)1)
                    SDL_BlitSurface(cursor, NULL, screen, &coord);

                //libération
                SDL_FreeSurface(barre_hori);
                SDL_FreeSurface(barre_verti);
                SDL_FreeSurface(textSurface);
                SDL_FreeSurface(fond);
                SDL_FreeSurface(cursor);
                TTF_CloseFont(font);
                if(TTF_WasInit()) {
                    TTF_Quit();
                }
                return 0;
                }


                Un peu long hein?
                En fait tu passes en param ton screen, l'x, y et largeur, une struct de type players que j'ai créée et qui contient
                typedef struct players {
                    char* pseudo, text[50], *affPoints;
                    int points, *active;
                }players;

                Tu peux modifier ca c'est pour mon morpion en fait la variable text contient le texte du champ, pseudo le pseudo du joueur (je fais un strcpy après), et active contient 1 si tu cliques sur le champ et 0 si tu cliques a coté.

                Donc on reprend les arguments :
                le chemin vers la police (exemple "font/arial.ttf"), la taille et deux SDL_MapRGB, un pour la couleur du texte et l'autre pour la couleur du champ.

                Bug connu : quand on est au début du champ, si on appuie sur majuscule, le prog quitte, je sais pas pourquoi!
                Donc à améliorer.
                • Partager sur Facebook
                • Partager sur Twitter
                  18 avril 2006 à 15:25:57

                  Bon, après avoir passé prêt de 5 heures à essayer d'installer ces fichus librairies, j'abandonne le coeur lourd et plein de regrets (surtout passablement nerveux).

                  Petite question, M@teo21 fera t'il un cours sur GTK+ ou quelque chose du genre afin d'inserer des boutons, zones de texte, barres déroulantes et autres widgets ?

                  A bientôt et bravo pour ceux qui ont compris comment installer tout ce joyeux foutoire. Je suppose qu'une fois qu'on sait comment le faire, c'est simple. Moi, je ne sais pas!^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    19 avril 2006 à 17:46:31

                    Salut tout le monde!
                    Je suis pas sur de ce que je dis mais sa pourait être possible de dessiner les boutons et les zones de saisi texte.
                    Pour les boutons déja tu peus dessiner trois bouton
                    Un normal
                    Un appuyer
                    Un relacher
                    Ensuite tu verifie quand l'utilisateur clique si les coordonné correspondent à la place de ton bouton met l'image du bouton appuyer et quand il relache l'image du bouton relacher puis agit en fonction du bouton cliquer.
                    Pour la zone de saisie du texte tu peus faire un rectangle blanc(comme c'est original) et le truc qui clignote quand tu clique dans cette fenetre(un gif animé)tu peus telecharger quelque chose pour gerer les lettres avec la sdl mais tu peus aussi prendre la police que tu veu faire une capture d'ecrans et enregistrer chaque lettre dans un jpeg puis a chaque fois qu'il appui au clavier tu ecrit dans un fichier texte à part et inscrit l'image de la lettre à l'écran et avance le truc qui clignote de la langueur de l'image de la lettre...
                    Voila je sais pas si je me suis bien fait comprendre ^^ en tout cas ce que j'ai dis me parait possible et comprehensible après avoir lus les cours de m@teo
                    • Partager sur Facebook
                    • Partager sur Twitter

                    SDL - Zone d'entrée de texte

                    × 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