IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Faire du Text Input [SDL 1.2]


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Windev
    Inscrit en
    Janvier 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Windev

    Informations forums :
    Inscription : Janvier 2013
    Messages : 27
    Points : 24
    Points
    24
    Par défaut Faire du Text Input
    Bonsoir à tous !

    Alors voila, je travaille sur un projet visant à réaliser un forum en C + SQL.
    Pour l'instant je m'attaque surtout à la partie graphique et j'ai décidé d'utiliser la très sympathique SDL.

    Rien de bien compliqué jusqu'à ce que je m'attaque à un point important pour créer un forum : rentrer des chaines de caractères.

    D'après ce que j'ai compris il n'existe pas en SDL de fonctions toute faite pour simuler un "scanf".

    Bref, en m'inspirant de ce que j'ai pu trouver sur le net (dont certains guides était en C++), j'ai essayé de rédiger une fonction qui se charge de prendre la saisie de l'utilisateur, voici la partie importante du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_image.h>
    #include "param.h"
     
     
    typedef struct StringInput
    {
        //The storage string
        char* str;
     
        //The text surface
        SDL_Surface *text;
     
    } SDL_StringInput;
     
     
     
     
    SDL_StringInput handle_input(SDL_StringInput textinput,SDL_Event event,TTF_Font *police,SDL_Color couleur)
    {
        //If a key was pressed
        if( event.type == SDL_KEYDOWN )
        {
            //Keep a copy of the current version of the string
            char* temp = textinput.str;
     
            //If the string less than maximum size
            if( strlen(textinput.str) <= 16 )
            {
                //If the key is a space
                if( event.key.keysym.unicode == (Uint16)' ' )
                {
                    //Append the character
                    textinput.str += (char)event.key.keysym.unicode;
                }
                //If the key is a number
                else if( ( event.key.keysym.unicode >= (Uint16)'0' ) && ( event.key.keysym.unicode <= (Uint16)'9' ) )
                {
                    //Append the character
                    textinput.str += (char)event.key.keysym.unicode;
                }
                //If the key is a uppercase letter
                else if( ( event.key.keysym.unicode >= (Uint16)'A' ) && ( event.key.keysym.unicode <= (Uint16)'Z' ) )
                {
                    //Append the character
                    textinput.str += (char)event.key.keysym.unicode;
                }
                //If the key is a lowercase letter
                else if( ( event.key.keysym.unicode >= (Uint16)'a' ) && ( event.key.keysym.unicode <= (Uint16)'z' ) )
                {
                    //Append the character
                    textinput.str += (char)event.key.keysym.unicode;
                }
            }
             //If backspace was pressed and the string isn't blank
            if( ( event.key.keysym.sym == SDLK_BACKSPACE ) && ( strlen(textinput.str) != 0 ) )
            {
                //Remove a character from the end
                textinput.str[strlen(textinput.str)-1] =0;
            }
            //If the string was changed
            if( textinput.str != temp )
            {
                //Free the old surface
                //SDL_FreeSurface( textinput.text );
     
                //Render a new text surface
               textinput.text = TTF_RenderText_Blended( police, textinput.str, couleur );
            }
            }
            return textinput;
        }

    Déjà là, je suis persuadé qu'il a plein d'erreur, étant donné que je me suis inspiré fortement d'un guide en C++, j'ai donc essayé de traduire après avoir plus ou moins bien compris le code.

    (si vous voulez voir le code originel http://lazyfoo.net/SDL_tutorials/lesson23/index.php)



    Voila, si vous pouviez me donner un coup de pouce, juger mon code je dirais pas non !
    En plus ce n'est qu'une fonction parmi d'autre, je ne sais pas trop comment procéder pour que mon texte s'affiche pendant que je le tape par exemple.

    Merci d'avance, cordialement.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonsoir,

    En plus ce n'est qu'une fonction parmi d'autre, je ne sais pas trop comment procéder pour que mon texte s'affiche pendant que je le tape par exemple.
    Je pense que je ferais 2 fonctions distinctes :
    - une fonction qui modifie la chaîne en fonction des évènements clavier
    - une fonction qui affiche la chaîne (assez classiquement et appelée en boucle)

    Chaque rafraichissement de l'affichage permet de voir ce que l'on tape et la chaîne peut rester affichée une fois que tu as terminé ta saisie (et éventuellement passer à une autre).

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    J'ai écrit il ya +/- 2 ans une fonction qui permet de faire du text input sous SDL, avec gestion des clics de souris, etc...
    La seule chose qu'elle ne gère pas, c'est le scrolling horizontal du texte si le texte devient trop long pour la zone à afficher. Par contre, elle gère l'arrière-plan: si l'arrière-plan est une image, seuls les caractères sont affichés.
    Elle fonctionne sous le principe suivant: elle reçoit une structure (longue à remplir, mais tous les paramètres ne sont pas obligatoires):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    struct GETT_Info {
        SDL_Surface *wnd;								// écran sur lequel on blitte
    	TTF_Font *font;								// police utilisée pour le texte
    	Uint32 *stringBgColor;							// Couleur du fond dans la zone d'entrée. Si NULL utilise le fond présent
    	SDL_Rect stringCoord;							// coordonnées du string en entrée
    	SDL_Color stringColor;							// couleur du text
    	int stringMaxLength;							// nbre max de caractères
    	char *stringInput;							// le string en entrée/sortie
    	int displayZoneWidth;							// longueur de la zone d'affichage
    	void *userValue;							// géré par le programme appelant
    	int (*checkFunction)(int keyPressed,char *string,void *userValue);	// fonction appelée qd appui sur enter ou escape
    	int (*checkLeftMouseButtonFunction)(int x,int y,void *userValue);	// fonction appelée qd clic gauche en-dehors de la zone d'entrée
    	SDL_Surface *clear;							// Usage interne, doit être NULL lors du premier appel
    	int xMouse,yMouse;							// Position lors du dernier clic gauche
    };
     
    extern int GETT_GetText(struct GETT_Info *);
    et renvoie la dernière touche pressée.

    Je peux mettre ce code à disposition, avec des exemples éventuellement, sur le site ou chez un hébergeur.

    Attention les yeux: je pense que le code est bien écrit, avec peu de commentaires, mais la fonction principale fait malgré tout 200 lignes....

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Windev
    Inscrit en
    Janvier 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Windev

    Informations forums :
    Inscription : Janvier 2013
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Merci d'avoir répondu à ma question.

    edgarjacobs, j'apprécierais beaucoup d'avoir le code de ta fonction (voir même du main pour voir comme tu l'implémente) si tu veux bien me le présenter !
    De ce que je vois, c'est vrai que ta structure a l'air assez complexe

  5. #5
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Well well well,

    Ne flinguez pas le pianiste svp

    Le code et deux exemples se trouvent ici

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Windev
    Inscrit en
    Janvier 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Windev

    Informations forums :
    Inscription : Janvier 2013
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Un grand merci pour ton code Edgar !

    J'ai commencé à regarder en détail ton gett.c .

    J'ai aussi regardé un peu ton exemple1, très très bien commenté et très compréhensible, j'adore !

    J'aurais une question : d'où proviens la fonction setmem ?
    Je ne peux faire compiler cette fonction en l'état !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct GETT_Info *GETT_CreateInfo(int n)
    {
    	struct GETT_Info *new;
    	new=malloc(n*sizeof(struct GETT_Info));
    	if(new!=NULL) setmem(new,sizeof(struct GETT_Info)*n,0);
    	return(new);
    }

  7. #7
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    setmem n'est qu'une macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define setmem(dest,length,value) (void)memset(dest,value,length)
    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Windev
    Inscrit en
    Janvier 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Windev

    Informations forums :
    Inscription : Janvier 2013
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,

    j'ai un problème :
    quand je tape quelque chose à l'écran, rien ne s'affiche.

    J'ai alors essayé de reprendre l'ex1 en modifiant des détails 1 par 1, jusqu'à ce que j'essaye de modifier "Entre ton nom, coyote", ou j'ai à nouveau le même problème.
    J'ai constaté en faisant de nombreux tests que ça fonctionnait quand la chaine que je mettait à la place de "Entre ton nom, coyote" contenait au moins 11 caractères, seulement sur ex1 d'ailleurs.


    Une idée de l'origine du problème ?



    Autre question, comment récupérer le contenu tapé ?

    Merci.

  9. #9
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Pour récupérer le contenu tapé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *stringInput; // le string en entrée/sortie
    Et si l'utilisateur a appuyé sur escape, le string passé à GETT n'aura pas été modifié.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH 8] Tuto pour faire disparaitre texte
    Par Gary dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 27/12/2006, 11h35
  2. Réponses: 5
    Dernier message: 15/09/2006, 18h22
  3. Comment faire un texte qui defile ?
    Par alyas dans le forum Flash
    Réponses: 4
    Dernier message: 21/02/2006, 07h16
  4. Faire defiler Texte dans un label
    Par Techsan dans le forum Composants VCL
    Réponses: 5
    Dernier message: 08/06/2003, 23h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo