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 :

Lire des chaines du clavier


Sujet :

SDL

  1. #1
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Par défaut Lire des chaines du clavier
    salut,
    j'ai crée un petit programme en C avec SDL...
    un genre de space invaders en fait...
    je voulais faire un système de "high score" mais pour cela il faut entrer son nom...
    comment faire pour lire le nom entré au clavier pendant l'exécution du programme???
    avec les evènement ça serait trop compliqué...
    merci d'avance!

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Bornerdogge
    salut,
    j'ai crée un petit programme en C avec SDL...
    un genre de space invaders en fait...
    je voulais faire un système de "high score" mais pour cela il faut entrer son nom...
    comment faire pour lire le nom entré au clavier pendant l'exécution du programme???
    avec les evènement ça serait trop compliqué...
    merci d'avance!
    Il n'y a pas vraiment d'autres solutions, j'ai écrit une petite source qui permet de faire ce que tu voudrais plus ou moins :

    http://www.developpez.net/forums/sho...d.php?t=302275
    Jc

  3. #3
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Par défaut
    avec scanf() ça ne marchertait pas?
    (ou gets(), etc.)

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Bornerdogge
    avec scanf() ça ne marchertait pas?
    (ou gets(), etc.)
    Non tu bloquerais le déroulement du programme. Il faudra passer par les événements.

    Jc

  5. #5
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Je sais pas comment tu as fais Fearyourself vu que j'ai pas encore regarder tes codes, cependant j'ai fais ainsi pour ma part :

    edit : desolé c'est pas commenté

    Une classe StringInput
    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
    class StringInput
    {
        private:
        std::string str;
     
        SDL_Surface *text;
     
        public:
        StringInput();
     
        ~StringInput();
     
        void handle_input();
     
        void show_centered();
    };
    Le constructeur (utilisation de l'unicode) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    StringInput::StringInput()
    {
        str = "";
     
        text = NULL;
     
        SDL_EnableUNICODE( SDL_ENABLE );
    }
    Le destructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    StringInput::~StringInput()
    {
        SDL_FreeSurface( text );
     
        SDL_EnableUNICODE( SDL_DISABLE );
    }
    La fonction de saisie :
    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
    void StringInput::handle_input()
    {
        if( event.type == SDL_KEYDOWN )
        {
            std::string temp = str;
     
            if( str.length() <= 16 )
            {
                if( event.key.keysym.unicode == (Uint16)' ' )
                {
                    str += (char)event.key.keysym.unicode;
                }
                else if( ( event.key.keysym.unicode >= (Uint16)'0' ) && ( event.key.keysym.unicode <= (Uint16)'9' ) )
                {
                    str += (char)event.key.keysym.unicode;
                }
                else if( ( event.key.keysym.unicode >= (Uint16)'A' ) && ( event.key.keysym.unicode <= (Uint16)'Z' ) )
                {
                    str += (char)event.key.keysym.unicode;
                }
                else if( ( event.key.keysym.unicode >= (Uint16)'a' ) && ( event.key.keysym.unicode <= (Uint16)'z' ) )
                {
                    str += (char)event.key.keysym.unicode;
                }
            }
     
            if( ( event.key.keysym.sym == SDLK_BACKSPACE ) && ( str.length() != 0 ) )
            {
                str.erase( str.length() - 1 );
            }
     
            if( str != temp )
            {
                SDL_FreeSurface( text );
                text = TTF_RenderText_Solid( font, str.c_str(), textColor );
            }
        }
    }
    Dans le main il te reste à faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bool nameEntered = false;
    StringInput name;
    while( ... )
        {
            while( SDL_PollEvent( &event ) )
            {
                if( nameEntered == false )
                {
                    name.handle_input();
                    ...

  6. #6
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Par défaut
    merci beaucoup, je vais étudier ça!

    mais c'est du C++, et le programme est en C...

  7. #7
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    C'est du C++ très facilement transformable en C

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par loka
    Je sais pas comment tu as fais Fearyourself vu que j'ai pas encore regarder tes codes, cependant j'ai fais ainsi pour ma part :
    Cela se ressemble mais il y a plus simple que ce que tu as fait en fait, je fais d'abord une citation de SDL_keyboard.h :

    - The 'unicode' translated character is only available when character
    translation is enabled by the SDL_EnableUNICODE() API. If non-zero,
    this is a UNICODE character corresponding to the keypress. If the
    high 9 bits of the character are 0, then this maps to the equivalent
    ASCII character:
    char ch;
    if ( (keysym.unicode & 0xFF80) == 0 ) {
    ch = keysym.unicode & 0x7F;
    } else {
    An international character..
    }
    Du coup, la seule chose à faire est, par exemple, d'ignorer les caractères internationaux dans un premier temps et faire un simple test. Cela simplifiera ton code

    Jc

  9. #9
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    En effet ça simplifie une partie du code et ça marche bien, j'y avais pas pensé

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 967
    Par défaut
    Un petit défaut des StringInput proposées : si il y en a deux et qu'on on supprime une seule, pouf! Plus d'unicode pour celle qui reste! Ce n'est bien sûr pas un problème quand il n'y en a qu'une seule.

    D'autre part, on peut utiliser wstring (ou WCHAR en C) car SDL_TTF peut afficher de l'unicode. Ce serait dommage de s'en priver.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    Bonjour,

    Une version en C pur, juste avec les events de la SDL ne serait pas de rufus

    Merci.

  12. #12
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Tu trouveras une version gérant le texte ici, http://www.developpez.net/forums/sho...d.php?t=302275
    (il y a une version C et une version C++), a noter que je pourrais passer directement le texte à la fonction Unicode comme cela a été suggéré.

    D'ici sous peu, elle sera directement sur la page Source

    Jc

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    bonjour,
    Petite question, est-ce que la SDL gère le type de clavier (qwerty, azerty ...) j'ai besoin de récupérer la lettre a par exemple, alors pour l'instant je demande juste la lettre q (event.key.keysym.sym = SDLK_q) mais ca sera pas pratique quand je voudrais récupere tout un text.

    Merci.

  14. #14
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Par défaut
    ça ne change rien, c'est le système d'exploitation qui gère tout ça non?

  15. #15
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par disturbedID
    bonjour,
    Petite question, est-ce que la SDL gère le type de clavier (qwerty, azerty ...) j'ai besoin de récupérer la lettre a par exemple, alors pour l'instant je demande juste la lettre q (event.key.keysym.sym = SDLK_q) mais ca sera pas pratique quand je voudrais récupere tout un text.

    Merci.
    Je ne comprends pas vraiment la question mais la solution est de passer par le code Unicode. Le code source que j'ai donné au-dessus le gére.

    Jc

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    On gros je demander s'il n'y avait pas de fonctions du genre SDL_SetKeybordMode("azerty") pour adapter le event.key.keysym.sym apparemment non donc vive l'unicode.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    Bonjour,

    Bon voila j'ai fait un petit prog de test SDL en C pour récupérer l'ASCII du caractère unicode que renvoi l'evenement. Et comme d'hab ca fonctionne mal. Au fait il affiche les lettres etc, mais des que j'appuie sur MAJ ou F1 ou autres il n'affiche plus rien. Alors que ca marche bien sur le prog de "fearyourself"

    Voici mon petit prog :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>
     
    int main(int argc, char *argv[])
    {
    	SDL_Surface *ecran,*text;  /*surface de l'ecran*/
    	TTF_Font *police;
    	SDL_Event event;
    	SDL_Color bleu = {70,100,255};
    	SDL_Rect pos = {0,0};
    	char ch, chaine[100] = "Tapez Votre Text...";
    	char continu = 1, taille = 0;
    	if (SDL_Init(SDL_INIT_VIDEO) < 0) // Démarrage de la SDL. Si erreur alors...
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL : %s", SDL_GetError()); // Ecriture de l'erreur
            exit(EXIT_FAILURE); // ...On quitte le programme
        }
    	ecran = SDL_SetVideoMode(800,600,32,SDL_SWSURFACE);
    	TTF_Init();
    	police = TTF_OpenFont("FreeSerif.ttf",50);
    	if( police == NULL)
    	{
            fprintf(stderr, "Erreur chargement de la police\n");
            return EXIT_FAILURE;
    	}
    	SDL_EnableUNICODE(1);
    	while(continu)
    	{
    	    if(SDL_PollEvent(&event))
    	    {
    	        switch(event.type)
    	        {
    	            case SDL_QUIT : continu = 0;
    	            break;
    	            case SDL_KEYDOWN:
                        if((event.key.keysym.unicode & 0xFF80) == 0 && taille < 100)
                            {
                                ch = event.key.keysym.unicode & 0x7F;
                                chaine[taille] = ch;
                                chaine[++taille] = '\0';
                            }
                        break;
    	        }
    	    }
    	    else
    	    {
    	        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
    	        text = (SDL_Surface*) TTF_RenderText_Solid(police,chaine,bleu);
    	        SDL_BlitSurface(text,NULL,ecran,&pos);
    	        SDL_FreeSurface(text);
    	        SDL_Flip(ecran);  /*Dessiner la surface*/
    	    }
    	}
    	TTF_CloseFont(police);
    	TTF_Quit();
    	SDL_Quit();
    	return 0;
    }
    Pourtant on fait presque la même chose .

  18. #18
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par disturbedID
    Pourtant on fait presque la même chose .
    La différence : tu supposes que si ton test avec 0xFF80 fonctionne alors le masque avec 0x7F sera != 0.

    Ce n'est pas vrai. Du coup, ton code qui suit provoque une erreur, tu ajoute un caractère nul et tu incrémentes la position du nouveau '\0'...

    il faudrait ajouter un
    Autre remarque : tu utilises SDL_Flip sans passer SDL_DOUBLEBUF à SDL_SetVideoMode (il faudrait utiliser UpdateRect à la place), tu utilises un if pour SDL_PollEvent il faudrait un while...

    Jc
    Jc

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    Citation Envoyé par fearyourself
    La différence : tu supposes que si ton test avec 0xFF80 fonctionne alors le masque avec 0x7F sera != 0.

    Ce n'est pas vrai. Du coup, ton code qui suit provoque une erreur, tu ajoute un caractère nul et tu incrémentes la position du nouveau '\0'...

    il faudrait ajouter un
    Ok je vois merci.

    Autre remarque : tu utilises SDL_Flip sans passer SDL_DOUBLEBUF à SDL_SetVideoMode (il faudrait utiliser UpdateRect à la place),
    Si le mode Double Buffering n'est pas activé alors SDL_Flip est équivalent a SDL_UpdateRect (lu dans la doc).
    tu utilises un if pour SDL_PollEvent il faudrait un while
    mouias c'est presque la même chose en fin le while est plus rapide c'est vrai. (H.S c'est vrai qu'en C chaque ouverture d'accolade équivaut à un simili appel de fonction? qui pourrait provoqué une saturation de la pile systeme si on en abuse graaaaaaaaandement ?)
    ...
    ???

  20. #20
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    mouias c'est presque la même chose en fin le while est plus rapide c'est vrai
    C'est surtout qu'avec un while tu vas traiter tous les évènements en attente au lieu du premier uniquement.

    H.S c'est vrai qu'en C chaque ouverture d'accolade équivaut à un simili appel de fonction? qui pourrait provoqué une saturation de la pile systeme si on en abuse graaaaaaaaandement ?
    Pas vraiment non. Un bloc d'accolades définit simplement une portée, tout ce qui se passe c'est que les variables déclarées à l'intérieur sont détruites à l'accolade fermante (ce qui équivaut à un décalage de pointeur en gros -- pas de quoi faire péter la pile).

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/08/2009, 16h03
  2. créer des racourci clavier pour des chaine de caractères
    Par samworkflow dans le forum Windows XP
    Réponses: 3
    Dernier message: 11/05/2009, 19h12
  3. [sscanf] Lire une chaine formatée contenant des []
    Par gangsoleil dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 11/09/2008, 10h09
  4. Réponses: 2
    Dernier message: 23/03/2008, 10h46
  5. Lire des fichiers texte (des chaines de caracteres) ifstream
    Par jamesleouf dans le forum SL & STL
    Réponses: 1
    Dernier message: 23/03/2006, 00h58

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