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_Event la souris qui fait tout acceler


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut SDL_Event la souris qui fait tout acceler
    Bonjour,

    j'ai actuellement un problème que je n'arrive pas résoudre malgré mes nombreuses tentatives, je fais un jeu avec la sdl mais quand je le lance, a chaque fois que la souris est bouger tout est accéléré.

    voici mon 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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    #include "Menu.h"
    #include <iostream>
    #include <string>
    #include <SDL/SDL.h>
    #include <SDL_image.h>
    #include "Images.h"
    #include <fmodex/fmod.h>
    #include <SDL_ttf.h>
    #include "Jeu.h"
     
    using namespace std;
    Menu::Menu()
    {
     
    }
     
    int Menu::menuDeJeu()
        {
            SDL_Surface *menu = NULL, *ecran = NULL, *texteMenu = NULL, *texteMenu1 = NULL, *texteMenu2 = NULL, *texteMenu3 = NULL;
            int continuer = 1,  changement = 0, tempsPrecedent = 0, tempsActuel = 0, i = 2;
            Images img;
            Jeu suite;
            FMOD_SYSTEM *system1, *system2;
            FMOD_SOUND *musiqueMenu = NULL, *selection = NULL;
            FMOD_RESULT resultatMenu, resultatSelection;
            SDL_Rect positionTexte, positionTexte1, positionTexte2, positionTexte3;
            TTF_Font *policeMenu = NULL;
            SDL_Color couleurTexte = {0, 255, 0}, couleurTexte1 = {255, 0, 0}, couleurTexte2 = {255, 0, 0}, couleurTexte3 = {255, 0, 0};
     
            TTF_Init();
     
            SDL_putenv ("SDL_VIDEO_CENTERED=center"); //mais la fenetre au centre de l'écran
            ecran = SDL_SetVideoMode(800, 500, 32,SDL_HWSURFACE| SDL_DOUBLEBUF);
            SDL_WM_SetCaption("Menu", NULL);
            menu = IMG_Load("Images/menu.jpg");
     
            FMOD_System_Create(&system1);
            FMOD_System_Init(system1, 3, FMOD_INIT_NORMAL, NULL);
     
            FMOD_System_Create(&system2);
            FMOD_System_Init(system2, 2, FMOD_INIT_NORMAL, NULL);
     
            resultatMenu = FMOD_System_CreateStream(system1, "Musiques/MusiqueMenu.wma", FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &musiqueMenu);
            resultatSelection = FMOD_System_CreateStream(system2, "Musiques/2181.mp3", FMOD_HARDWARE | FMOD_2D, 0, &selection);
     
                  // On vérifie si elle a bien été ouverte (IMPORTANT)
            if (resultatMenu != FMOD_OK)
            {
                fprintf(stderr, "Impossible de lire le fichier mp3\n");
                exit(EXIT_FAILURE);
            }
            if (resultatSelection != FMOD_OK)
            {
                fprintf(stderr, "Impossible de lire le fichier mp3\n");
                exit(EXIT_FAILURE);
            }
            FMOD_System_PlaySound(system1, FMOD_CHANNEL_FREE, musiqueMenu, 0, NULL);
     
     
            policeMenu = TTF_OpenFont("Polices/Stencil Style New.ttf", 30);
            SDL_EnableKeyRepeat(100, 100);
            tempsActuel = SDL_GetTicks();
            while(continuer)
                {
                    continuer = img.quitter();
                    texteMenu = TTF_RenderText_Blended(policeMenu, "Nouvelle partie", couleurTexte); // assigne la police, ce qui est écrit, la couleur
                    texteMenu1 = TTF_RenderText_Blended(policeMenu, "ContrÔles", couleurTexte1);
                    texteMenu2 = TTF_RenderText_Blended(policeMenu, "Credits", couleurTexte2);
                    texteMenu3 = TTF_RenderText_Blended(policeMenu, "Quitter", couleurTexte3);
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
                    if(SDL_GetTicks() - tempsActuel> 1)
                    {
                        Uint8 *keystate = SDL_GetKeyState(NULL); // gère le déplacement du héros
                        img.blittage(-150, 0, menu, ecran);//blittage du fond
                        img.texte(350, 300, texteMenu, ecran); //tout comme les images mais pour le blittage du texte
                        img.texte(350, 350, texteMenu1, ecran);// (x, y, source, destination)
                        img.texte(350, 400, texteMenu2, ecran);
                        img.texte(350, 450, texteMenu3, ecran);
                        SDL_Flip(ecran);
                        if (keystate[SDLK_DOWN])
                        {
                            switch(i) // à chaque appuie touche du bas la ligne du menu change et devient verte
                            {
                                case 1:
                                couleurTexte3 = {255, 0, 0};
                                couleurTexte = {0, 255, 0};
                                i = 2;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
                                case 2:
                                couleurTexte = {255, 0, 0};
                                couleurTexte1 = {0, 255, 0};
                                i = 3;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                 if (keystate[SDLK_UP])
                                 {
                                    couleurTexte = {255, 0, 0};
                                    couleurTexte3 = {0, 255, 0};
                                    i = 4;
                                    FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                    }
                                break;
                                case 3:
                                couleurTexte1 = {255, 0, 0};
                                couleurTexte2 = {0, 255, 0};
                                i = 4;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
                                case 4:
                                couleurTexte2 = {255, 0, 0};
                                couleurTexte3 = {0, 255, 0};
                                i = 1;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
                            }
                        }
                     else if (keystate[SDLK_RETURN])
                        {
                            switch(i)
                            {
                                case 1:
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                continuer = false;
                                break;
                                case 2: //3
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                FMOD_Sound_Release(musiqueMenu);
                                FMOD_Sound_Release(selection);
                                FMOD_System_Close(system1);
                                FMOD_System_Release(system1);
                                FMOD_System_Close(system2);
                                FMOD_System_Release(system2);
                                TTF_CloseFont(policeMenu);
                                TTF_Quit();
                                SDL_FreeSurface(texteMenu);
                                SDL_FreeSurface(menu);
                                SDL_Quit();
                                suite.ecranDeJeu();
     
                                break;
                                case 3:
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
                                case 4:
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
                            }
     
                        }
                        else if (keystate[SDL_BUTTON_LEFT])
                        {
                            FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                        }
                        tempsActuel = SDL_GetTicks();
                    }
                }
            FMOD_Sound_Release(musiqueMenu);
            FMOD_Sound_Release(selection);
            FMOD_System_Close(system1);
            FMOD_System_Release(system1);
            FMOD_System_Close(system2);
            FMOD_System_Release(system2);
            TTF_CloseFont(policeMenu);
            TTF_Quit();
            SDL_FreeSurface(texteMenu);
            SDL_FreeSurface(menu);
            SDL_Quit();
            return EXIT_SUCCESS;
        }
    Si vous avez une solutions je suis preneur

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    Par défaut
    Ton SDL_GetTicks retourne la valeur depuis l'initialisation http://sdl.beuc.net/sdl.wiki/SDL_GetTicks Donc si tu veux ton delta entre chaque frame tu dois soustraire la dernière valeur de ton SDL_GetTicks au retour du SDL_GetTicks courant.

    Sinon c'est SDL_EnableKeyRepeat qui n'est pas setup correctement

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    c'est ce que je fait ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(SDL_GetTicks() - tempsActuel> 1)

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 791
    Par défaut
    Hello,

    Ton erreur vient de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(SDL_GetTicks() - tempsActuel> 1)
    SDL_GetTicks() renvoie une valeur en millisecondes, donc ton test sera toujours vrai. Si tu avais voulu tester un délai d'une seconde, tu devais mettre >= 1000

    De plus, ces lignes ne code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    texteMenu = TTF_RenderText_Blended(policeMenu, "Nouvelle partie", couleurTexte); // assigne la police, ce qui est écrit, la couleur
                    texteMenu1 = TTF_RenderText_Blended(policeMenu, "ContrÔles", couleurTexte1);
                    texteMenu2 = TTF_RenderText_Blended(policeMenu, "Credits", couleurTexte2);
                    texteMenu3 = TTF_RenderText_Blended(policeMenu, "Quitter", couleurTexte3);
    n'ont pas de raison de se trouver dans ta boucle. Fais-les une fois pour toute, et libére-le en sortie de ta boucle.
    Il faut savoir qu'à chaque appel de TTF_RenderText(), une nouvelle surface est créée.... en mettant le code dans ta boucle while, imagine le nombre de surfaces créées....

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    merci pour cette réponse qui a presque résolus mon problème mais maintenant que j'ai mis ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                   texteMenu = TTF_RenderText_Blended(policeMenu, "Nouvelle partie", couleurTexte); // assigne la police, ce qui est écrit, la couleur
                    texteMenu1 = TTF_RenderText_Blended(policeMenu, "ContrÔles", couleurTexte1);
                    texteMenu2 = TTF_RenderText_Blended(policeMenu, "Credits", couleurTexte2);
                    texteMenu3 = TTF_RenderText_Blended(policeMenu, "Quitter", couleurTexte3);
    en dehors du main, quand je change de couleur dans le switch(i) il ne les mets pas a jour visuellement pourtant j'ai vérifié il prend bien en compte le switch, les couleurs qui devraient être changées ne le sont pas
    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
      switch(i) // à chaque appuie touche du bas la ligne du menu change et devient verte
                            {
                                case 1:
                                couleurTexte3 = {255, 0, 0};
                                couleurTexte = {0, 255, 0};
                                i = 2;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
     
                                case 2:
                                couleurTexte = {255, 0, 0};
                                couleurTexte1 = {0, 255, 0};
                                i = 3;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                 if (keystate[SDLK_UP])
                                 {
                                    couleurTexte = {255, 0, 0};
                                    couleurTexte3 = {0, 255, 0};
                                    i = 4;
                                    FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                    }
                                break;
     
                                case 3:
                                couleurTexte1 = {255, 0, 0};
                                couleurTexte2 = {0, 255, 0};
                                i = 4;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
     
                                case 4:
                                couleurTexte2 = {255, 0, 0};
                                couleurTexte3 = {0, 255, 0};
                                i = 1;
                                FMOD_System_PlaySound(system2, FMOD_CHANNEL_FREE, selection, 0, NULL);
                                break;
                            }
    le i indique la position actuelle du "curseur"

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    c'est bon le problème est réglé merci a toi

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

Discussions similaires

  1. combobox qui fait tout planté
    Par sambzh24 dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/10/2008, 14h26
  2. fieldset qui fait tout peter sous IE
    Par pop_up dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 21/03/2008, 20h42
  3. [POO] Une classe qui fait tout ?
    Par Nasky dans le forum Langage
    Réponses: 23
    Dernier message: 26/05/2006, 20h02
  4. Un retour à la ligne qui fait tout foirer !!!!
    Par sami_c dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 27/02/2006, 10h20

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