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 :

SDL_ttf et récupération chiffre saisie


Sujet :

SDL

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut SDL_ttf et récupération chiffre saisie
    Bonjour

    Je doit remplir une matrice de chiffre entier. Il me faut dabord demander la saisie de la taille de la matrice et par la suite les valeurs de la matrice.

    Mais j'ai un problème pour récupérer les chiffres dans SDL. Il semble que le teste avec les SDLK_1... ou SDLK_KP2 ne marche pas et je ne sais pas pourquoi.

    Voici le code que j'utilise
    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
     
    case SDL_KEYDOWN:
              {
                   printf("touche %s \n",SDL_GetKeyName(event.key.keysym.sym));
                 switch (event.key.keysym.sym)
                 {
                    case SDLK_KP1:
                        surfDemandetaille = TTF_RenderText_Blended(police, SDL_GetKeyName(event.key.keysym.sym), couleurNoire);
                        SDL_BlitSurface(surfDemandetaille, NULL, ecran, &posSurf); 
                        break;
                    case SDLK_KP2:
                        surfDemandetaille = TTF_RenderText_Blended(police, SDL_GetKeyName(event.key.keysym.sym), couleurNoire);
                        SDL_BlitSurface(surfDemandetaille, NULL, ecran, &posSurf); 
                        break;
                    case SDLK_KP3:
    J'ai ajouter cette ligne printf("touche %s \n",SDL_GetKeyName(event.key.keysym.sym)); pour voir la touche sur laquelle on a appuyer mais j'arrives pas à entrer dans les cas pour afficher la surface avec la valeur saisie.

    Merci.
    Amicalement

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut

    Un moyen simple pour voir si tu entres dans les cas: rajoute un exit(1) bien placé, et si le programme quitte, alors tu est bien rentré dans le cas.

    Pour ce que je vois, l'erreur peut très bien venir de la police invalide, ...

    Ensuite la manière dont tu testes les chiffres est un peu extrême

    Je changerais le code comme ça:

    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
    case SDL_KEYDOWN:
    {
        printf("touche %s \n",SDL_GetKeyName(event.key.keysym.sym));
        /* Le nombre rentré */
        Uint8 number;
        /* La chaine dont on va se servir pour l'affichage */
        char number_string[2] = {0, 0};
        if (event.key.keysym.sym >= SDLK_KP0 && event.key.keysym.sym <= SDLK_KP9)
        {
           number = event.key.keysym.sym - SDLK_KP0;
        } else if (event.key.keysym.sym >= SDLK_0 && event.key.keysym.sym <= SDLK_9)
        {
           number = event.key.keysym.sym - SDLK_0;
        } else goto notanumber;
     
        /* témoin que l'on a appuyé sur un nombre */
        printf("Appui sur le nombre %d\n",number);
        /* On met le nombre dans la chaine */
        number_string[0] = '0' + number;
        /* On fait le rendu */
        surfDemandetaille = TTF_RenderText_Blended(police, number_string, couleurNoire);
        SDL_BlitSurface(surfDemandetaille, NULL, ecran, &posSurf);
     
        break;
        /* Code à exécuter si ce n'est pas un nombre */
    notanumber:
    /*    switch(...)
             ... */
    }
    Ou alors si tu as mis l'unicode c'est plus simple (avec SDL_EnableUNICODE(1) au début du programme):

    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
    case SDL_KEYDOWN:
    {
        printf("touche %s \n",SDL_GetKeyName(event.key.keysym.sym));
        /* Le nombre rentré */
        Uint8 number;
        /* La chaine dont on va se servir pour l'affichage */
        char number_string[2] = {0, 0};
        if (event.key.keysym.unicode >= '0' && event.key.keysym.unicode <= '9')
        {
            number = event.key.keysym.sym - '0';
            /* témoin que l'on a appuyé sur un nombre */
            printf("Appui sur le nombre %d\n",number);
            /* On met le nombre dans la chaine */
            number_string[0] = '0' + number;
            /* On fait le rendu */
            surfDemandetaille = TTF_RenderText_Blended(police, number_string, couleurNoire);
            SDL_BlitSurface(surfDemandetaille, NULL, ecran, &posSurf);
     
            break;
        }
        else 
        {
            /* autre code... */
        }
    }

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Merci. La première méthode marche trés bien.

    J'ai fait une fonction du genre
    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
     
    Uint8 recupvaleur()
    {
        SDL_Event eventsaisie;
        int suite = 1; Uint8 valsaisie;
     
        SDL_WaitEvent(&eventsaisie);
        while(suite)
        {
            switch(eventsaisie.type)
               case SDL_KEYDOWN:
               {
                   if (event.key.keysym.sym >=SDLK_KP0 && event.key.keysym.sym <=SDLK_KP9)
                   {
                      valsaisie = event.key.keysym.sym - SDLK_KP0;
                      suite = 0;
                   }else if (event.key.keysym.sym >=SDLK_0 && event.key.keysym.sym <=SDLK_9)
                   {
                       valsaisie = event.key.keysym.sym - SDLK_0;
                       suite = 0;
                   }else
                      {suite = 1;}
                }break;
        }
            return (valsaisie);
    }
    Mon objectif c'est de remplir une matrice. Je demande dabord la taille de la matrice et ensuite les coef avec le code suivant. Le problème c'est que il faut appuyer deux fois avant que la valeur de la taille demander ne s'affiche mais par la suite les coef sont de la forme (0 tailleSaisie) qui se repete sans récupération des valeurs saisie pour les coef.
    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
     
        surfDemandetaille = TTF_RenderText_Blended(police, "Donner la taille de la matrice : ", couleurNoire);
        SDL_BlitSurface(surfDemandetaille, NULL, saisie, &posSurf);
        //SDL_UpdateRect(saisie, 0, 0, 0, 0);
        taillematrice = recupvaleur();
     
        number_string[0] = '0' + taillematrice;
     
        police = TTF_OpenFont("arial.ttf", 14);
        posSurf.x=320;
        posSurf.y=100;
        surftaille = TTF_RenderText_Blended(police, number_string, couleurNoire);
        SDL_BlitSurface(surftaille, NULL, saisie, &posSurf);
    	 //printf("taille matrice : %d",taillematrice);
        Ma=malloc(taillematrice*taillematrice*sizeof(float));
     
        if (taillematrice!=0)
        {
            posSurf.x=150;
            posSurf.y=150;
     
            surftaille = TTF_RenderText_Blended(police, "Donner les coef de la matrice ", couleurNoire);
            SDL_BlitSurface(surftaille, NULL, saisie, &posSurf);
     
     
            posSurf.y=170;
     
            for (i=0;i<taillematrice;i++)
            {
                posSurf.y = posSurf.y + 20;
    	    posSurf.x=170;
                for (j=0;j<taillematrice;j++)
                {
    		coefmatrice = recupvaleur();
    		Ma[indice(i,j,taillematrice)] = coefmatrice;
                    number_string[0] = '0' + coefmatrice;
    		SDL_FreeSurface(surftaille);
                    surftaille = TTF_RenderText_Blended(police, number_string, couleurNoire);
                    SDL_BlitSurface(surftaille, NULL, saisie, &posSurf);
                    SDL_UpdateRect(saisie, 0, 0, 0, 0);
    	        posSurf.x = posSurf.x + 20;
                }
            }
        }
    Merci encore.
    Amicalement

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Si les valeurs ne s'affichent pas à temps, c'est que tu n'appelles pas SDL_UpdateRect après le Blit (d'ailleurs utilise SDL_Flip(), c'est plus simple tant que le FPS n'est pas une priorité)

    Sinon je ne vois pas grand chose comme ça, est-ce que tu pourrais donner un code complet compilable qui reproduit le problème? Je pense qu'il n'y a plus beaucoup à changer pour que ça marche.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    J'ai utilisé SDL_UpdateRect après le Blit mais le problème reste entier à savoir la répétition des touches avant d'avoir quelque chose afficher déjà pour la taille mais pour les coef c'est toujours la des zéro suivi de la valeur de la taille précédémment saisie.

    J'ai voulu présenter les problèmes un à un mais il ya aussi souvent le plantage de l'application que je n'arrives pas à situer l'origine.

    Je termines par ce que j'aurais peut être du signaler depuis le début. je suis sous linux Mandriva 2008.1.

    voilla.
    Amicalement

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    La pluspart des problèmes est résolu après avoir repositionner certaines commande dans la bonne place.

    Maintenant j'ai cette fonction qui permet de récupérer les saisies numériques
    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
     
    Uint8 recupvaleur()
    {
    	SDL_Event eventsaisie;
    	int suite = 1;
    	Uint8 valsaisie;
     
    	while (suite)
    	{
    	    SDL_WaitEvent(&eventsaisie);
    		switch (eventsaisie.type)
    		{
    		case SDL_KEYDOWN:
    			if (eventsaisie.key.keysym.sym >=SDLK_KP0 && eventsaisie.key.keysym.sym <=SDLK_KP9)
    			{
    				valsaisie = eventsaisie.key.keysym.sym - SDLK_KP0;
    				suite = 0;
    			}else if (eventsaisie.key.keysym.sym >=SDLK_0 && eventsaisie.key.keysym.sym <=SDLK_9)
    			{
    				valsaisie = eventsaisie.key.keysym.sym - SDLK_0;
    				suite = 0;
    			}
    			break;
    		}
    	}
    	return (valsaisie);
    }
    La fonction n'intègre pas les nombres négatif ni les nombres à plus d'un chiffre. J'ai pensé utiliser une autre fonction avec une variable (Int EnSaisie) et la touche return comme marque de fin de saisie d'un valeur. Pour l'instant il y trop d'erreur dans ce nouveau code, mais je le posterais une fois que c'est un peu cohérent. En attendant toute indication est la bienvenue.
    Amicalement

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    Je crois que tu devrais utiliser les SDL UNICODE.

    Ensuite tu laisses l'utilisateur rentrer à peu près tout ce qu'il veut dans un tableau de char en récupérant la touche via le champ unicode (voir mon post plus haut qui présente ça), et tu attends qu'il appuie sur entrée pour terminer la saisie. (je trouve ça plus simple qu'utiliser SDL_GetKeyName, mais ce n'est qu'un avis personnel)

    Tu récupèrerais le nombre qu'il a rentré en utilisant la fonction de la librarie standard atoi() sur la chaine saisie.

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Le nouveau problème auquel je suis confronté est que mon tableau n'enregistre pas les valeurs ou du moins enregistre n'importe quoi.

    J'ai une fonction Saisir_matrice(SDL_Surface *saisie, float *Ma) dans laquelle j'initialise Ma après avoir demandé la taille de la matrice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ma=malloc(taillematrice*taillematrice*sizeof(float));
    ensuite les coef de la matrice sont saisie de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    coefmatrice = recupvaleur();
    Ma[indice(i,j,taillematrice)] = coefmatrice;
    L'affichage dans la surface ne pose aucun problème. Mais plus loin lorsque j'affiche le contenu de la matrice avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("a%d%d = %f",i,j,Ma[indice(i,j,taillematrice)])
    j'ai des 0 dans la console. et si c'est dans la surface c'est des signe bisard.

    J'ai par la suite tenter de remplir la matrice manuellement avec des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Ma[indice(0,0,3)] = 1; Ma[indice(0,1,3)] = 1; Ma[indice(0,2,3)] = 1;
    Ma[indice(1,0,3)] = 1; Ma[indice(1,1,3)] = 1; Ma[indice(1,2,3)] = 1;
    Ma[indice(2,0,3)] = 1; Ma[indice(2,1,3)] = 1; Ma[indice(2,2,3)] = 1;
    la aussi même problème.
    Amicalement

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Problème de saisie résolu.

    Il fallait déclarer les tableaux pointeurs en global, faire une allocation dans le main et une réallocation dans la procédure de saisie.
    Amicalement

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

Discussions similaires

  1. [Débutant] [Edit] Récupérer les chiffres saisis
    Par papi13 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 20/06/2011, 21h08
  2. champs de saisie et récupération après saisie
    Par soufiane669 dans le forum SAP
    Réponses: 17
    Dernier message: 19/05/2011, 11h12
  3. Fonction récupération chiffres uniquement
    Par benthebest dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/04/2009, 16h21
  4. Comment ignorer le dernier chiffre saisi ?
    Par J_F_David dans le forum Général Java
    Réponses: 2
    Dernier message: 13/03/2009, 10h05
  5. Réponses: 5
    Dernier message: 26/12/2007, 11h13

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