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 :

Aide pour créer un effet de clignotement


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Points : 31
    Points
    31
    Par défaut Aide pour créer un effet de clignotement
    Bonjour/soir ! C'est encore moi , voila j'ai créer une fonction qui me permet de saisir du texte en SDL (qui marche très bien d'ailleurs), une barre verticale indique la position du curseur. Je souhaite maintenant la faire clignoter, et après de nombreuses recherches et m'être beaucoup cassé la tête je n'y arrive toujours pas, pourtant ça n'a pas l'air très compliqué

    Le code de la fonction :

    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
    void SDL_TxtInput(int nbchar_max, char *string, SDL_Rect txtPosition, SDL_Color color, TTF_Font *font, SDL_Surface *screen)
    {
        SDL_Event event;
        char continueLoop = 1;
     
        unsigned char key = 0;
        int curent_charNumber = 0;
        SDL_Surface *txtSurface = NULL;
     
        SDL_Surface *cursorSurface = NULL;
        SDL_Rect cursorPosition;
     
        cursorSurface = TTF_RenderText_Blended(font, "|", color);
     
        cursorPosition.x = txtPosition.x;
        cursorPosition.y = txtPosition.y;
     
        SDL_EnableUNICODE(1);
        SDL_EnableKeyRepeat(90, 90);
     
        string[0] = '\0';
     
        while(continueLoop)
        {
            while(SDL_PollEvent(&event))
            {
                if(event.type == SDL_KEYDOWN)
                {
                    if(event.key.keysym.unicode == SDLK_RETURN)
                        continueLoop = 0;
                    else if(event.key.keysym.unicode == SDLK_BACKSPACE && string[0] != '\0')
                    {
                        curent_charNumber--;
                    }
                    else if(event.key.keysym.unicode >= 32 && event.key.keysym.unicode <= 255 && curent_charNumber < nbchar_max - 1)
                    {
                        key = event.key.keysym.unicode;
                        string[curent_charNumber] = key;
                        curent_charNumber++;
                    }
     
                    string[curent_charNumber] = '\0';
                    event.key.keysym.unicode = 0;
     
                    SDL_FreeSurface(txtSurface);
                    txtSurface = TTF_RenderText_Blended(font, string, color);
     
                    if(string[0] != '\0')
                        cursorPosition.x = txtPosition.x + txtSurface->w;
                    else if(string[0] == '\0')
                        cursorPosition.x = txtPosition.x;
                }
            }
     
            SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
            SDL_BlitSurface(txtSurface, NULL, screen, &txtPosition);
            SDL_BlitSurface(cursorSurface, NULL, screen, &cursorPosition);
     
            SDL_Flip(screen);
            SDL_Delay(5);
        }
     
        SDL_EnableUNICODE(0);
     
        SDL_FreeSurface(cursorSurface);
        SDL_FreeSurface(txtSurface);
    }
    Je ne souhaite pas utiliser de timer, je trouve ça assez bordélique. Alors comment faire avec seulement des SDL_GetTicks() ? Merci.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Alors soit tu fais un truc tous simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int clignote = 0;
     
    //code
     
    if(clignote == 0)
    SDL_BlitSurface(txtSurface, NULL, screen, &txtPosition);
     
    clignote = !clignote;
    Avec SDL_GetTicks() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int time = 0;
     
    //code
     
    if(SDL_GetTicks() > time)
    {
    SDL_BlitSurface(txtSurface, NULL, screen, &txtPosition);
    time = SDL_GetTicks() +100;
    }
    Apres il y a plein d'autre façon , mais comme autre je trouve que les problèmes que tu es confronté est beaucoup trop simple , j’espère que tu postera pas a chaque difficulté et essayerai de résoudre ces problème seul.
    Faut mieux apprendre a pécher que a demandé aux autres a pécher a ta place.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Salut, j'avais déjà réussi à avoir ce résultat, mais j'aimerais en fait que le curseur puisse apparaître pendant un certain temps (disons 500 millisecondes), avant de disparaître. Ce dont je n'arrive pas. Je n'ai sans doute pas très bien exprimé mon problème.

    Il ne faut pas qu'il apparaisse seulement une fois toute les x millisecondes, mais qu'il apparaît pendant disons 500 millisecondes, et n'apparaisse pas pendant le même laps de temps. C'est là ma véritable difficulté.

    "Je trouve que les problèmes que tu es confronté est beaucoup trop simple , j’espère que tu postera pas a chaque difficulté et essayerai de résoudre ces problème seul.
    Faut mieux apprendre a pécher que a demandé aux autres a pécher a ta place."


    Je suis d'accord avec toi et j'en suis désolé, j'ai déjà essayé de résoudre ce problème tout seul, mais n'y suis pas arrivé. Bizarrement j'ai plus de difficultés avec les petits problèmes, que ceux qui sont plus compliqués

  4. #4
    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
    Bonjour,

    Il ne faut pas qu'il apparaisse seulement une fois toute les x millisecondes, mais qu'il apparaît pendant disons 500 millisecondes, et n'apparaisse pas pendant le même laps de temps. C'est là ma véritable difficulté.
    Tu affiches, pendant 500ms, une surface où il apparait; puis une autre surface, pendant le même temps et au même endroit où il n'apparait pas.
    Les 2 surfaces peuvent être créées quasiment avec la même chaîne en remplaçant le curseur par un espace.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Je pense que c'est possible de le faire avec une seule surface.
    D'ailleurs j'ai trouvé une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          if(SDL_GetTicks() > time)
            {
                time = SDL_GetTicks() + 550;
                blit_cursor = !blit_cursor;
            }
            //Je blite selon un booléen qui change toute les 550 millisecondes
            if(blit_cursor)
                SDL_BlitSurface(cursorSurface, NULL, screen, &cursorPosition);
    Je trouve quand même ça un peu lourd, si quelqu'un a une solution pour optimiser ça, je suis partant

  6. #6
    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
    Je pense que c'est possible de le faire avec une seule surface.
    Tu as quand même txtSurface et cursorSurface

    Je te parlais de 2 surfaces texte pour pouvoir faire revenir le curseur comme dans une "vraie" saisie, mais il y a un peu plus de chose à gérer.

    Je trouve quand même ça un peu lourd, si quelqu'un a une solution pour optimiser ça, je suis partant
    Tout dépend de ce que tu veux optimiser, personnellement je ne ferais pas l'affichage à l'intérieur de la fonction de saisie.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Je comprend maintenant ce que tu voulais faire : deux surfaces texte dont on inter-change le blittage selon le nombre de millisecondes écoulés
    Non, je ne trouve pas ça très intuitif

    "Tu as quand même txtSurface et cursorSurface"

    En fait je ne voulais pas créer une surface (" ") en plus, pour cacher la barre verticale (deux surfaces pour la gestion du curseur). Pas beaucoup d’intérêt, alors qu'il suffit juste de bliter la surface | un fois sur deux

  8. #8
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je rejoins Halarp27 , deux surface je trouve pas cela top personnellement je le fais pas.

    Sinon on quoi est- t il lourd ton code ?
    Au pire si tu trouve qu'il est dur a manipuler met le dans une fonction.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    "Sinon on quoi est- t il lourd ton code ?"

    C'est juste due au fait que je pensais, pouvoir faire cet effet de clignotement avec une seule condition if. C'est tout. Sinon le code actuel fonctionne très bien. Merci de ton aide Kannagi

  10. #10
    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
    OK,

    je ne voulais pas créer une surface (" ") en plus, pour cacher la barre verticale
    Ce n'est pas ce que je voulais proposer mais :
    on inter-change le blittage selon le nombre de millisecondes écoulés
    (c'est bien ce que tu fais avec txtSurface et cursorSurface qui sont 2 surfaces de texte)

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Non, ici je blite à chaque tours de boucle txtSurface, alors que cursorSurface n'est blité q'une fois toute les 550 millisecondes.

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

Discussions similaires

  1. [Photoshop] Besoin d'aide pour créer un effet
    Par Nico2a dans le forum Imagerie
    Réponses: 4
    Dernier message: 16/05/2013, 19h01
  2. aide pour créer une faq sur inno setup
    Par fsx999 dans le forum Langage
    Réponses: 3
    Dernier message: 12/06/2006, 20h16
  3. besoin d'aide pour créer un uml
    Par bob75018 dans le forum UML
    Réponses: 9
    Dernier message: 11/03/2006, 12h18
  4. aide pour créer un jeu
    Par cstefany dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/10/2005, 03h51
  5. [FLASH MX2004] Aide pour créer une animation
    Par SnakeTales dans le forum Flash
    Réponses: 5
    Dernier message: 04/08/2005, 10h50

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