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 :

Jeu de voiture qui déconne


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Jeu de voiture qui déconne
    Bonjour,

    Je fais un petit jeu en SD ou l'on est un vaiseau a contresens sur un route et ou on doit éviter les voitures. Je n'ai pas encore fait la gestion des collisions. Le problème est que avec pollEvent, dès que j'appuis sur ue touch pour déplacer le vaiseau, ce edenier par chez pas ou, parfois on l'entrevoit quelque centième de seconde. Avec waitEvent, ca fonctionne mais (bien sur) je suis obligé de créer des évènements pour que le jeu avance.

    Voila le 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
    #include<SDL/SDL.h>
    #include<SDL/SDL_image.h>
    #include<stdio.h>
    #include<stdlib.h>
     
    void jeu(SDL_Surface *ecran);
     
    int main()
    {
        SDL_Surface *ecran = NULL, *menu = NULL;
        SDL_Rect positionMenu;
                 positionMenu.x = 0;
                 positionMenu.y = 0;
        SDL_Event event;
        int continuer = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Jeu de voiture", NULL);
        ecran = SDL_SetVideoMode(600, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
        menu = IMG_Load("menu.gif");
     
        while(continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                continuer = 0;
                break;
                case SDL_KEYDOWN:
                if(event.key.keysym.sym == SDLK_p)
                {
                    jeu(ecran);
                    continuer = 0;
                }
                break;
     
            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
            SDL_Flip(ecran);
        }
     
        SDL_FreeSurface(menu);
        SDL_Quit();
     
        return 0;
     
     
    }
     
    void jeu(SDL_Surface *ecran)
    {
        SDL_Surface *vaisseau = NULL, *rouge = NULL, *bleu = NULL, *vert = NULL, *fond = NULL;
        SDL_Rect positionVaiseau, positionRouge, positionBleu, positionVert, positionFond;
                                                                             positionFond.x = 0;
                                                                             positionFond.y = 0;
        int tempsActuel1 = 0, tempsPrecedent1 = 0, tempsActuel2 = 0, tempsPrecedent2 = 0,tempsActuel3 = 0, tempsPrecedent3 = 0, continuer = 1;
        SDL_Event event;
     
        vaisseau = IMG_Load("vaisseau.gif");
        rouge = IMG_Load("rouge.gif");
        bleu = IMG_Load("bleu.gif");
        vert = IMG_Load("vert.gif");
        fond = IMG_Load("fond.gif");
     
     
     
        positionBleu.x =  105;
        positionBleu.y =  0;
        positionVert.x = 205;
        positionVert.y = 0;
        positionRouge.x = 305;
        positionRouge.y = 0;
        positionVaiseau.x = 405;
        positionVaiseau.y = 450;
     
     
     
        while(continuer)
        {
     
        tempsActuel1 = SDL_GetTicks();
        tempsActuel2 = SDL_GetTicks();
        tempsActuel3 = SDL_GetTicks();
     
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
            continuer = 0;
            break;
     
            case SDL_KEYDOWN:
            if(event.key.keysym.sym == SDLK_RIGHT)
            {
               positionVaiseau.x += 100;
            }
            if(event.key.keysym.sym == SDLK_LEFT)
            {
               positionVaiseau.x -= 100;
            }
            break;
        }
     
        if(tempsActuel1 - tempsPrecedent1 > 500)
        {
            positionBleu.y += 50;
            tempsPrecedent1 = tempsActuel1;
        }
        if(tempsActuel2 - tempsPrecedent2 > 700)
        {
            positionVert.y += 50;
            tempsPrecedent2 = tempsActuel2;
        }
        if(tempsActuel3 - tempsPrecedent3 > 1000)
        {
            positionRouge.y += 50;
            tempsPrecedent3 = tempsActuel3;
        }
        if (positionBleu.y == 600)
        {
            positionBleu.y = 0;
        }
        if (positionRouge.y == 600)
        {
            positionRouge.y = 0;
        }
        if (positionVert.y == 600)
        {
            positionVert.y = 0;
        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_BlitSurface(fond, NULL, ecran, &positionFond);
        SDL_BlitSurface(bleu, NULL, ecran, &positionBleu);
        SDL_BlitSurface(rouge, NULL, ecran, &positionRouge);
        SDL_BlitSurface(vert, NULL, ecran, &positionVert);
        SDL_BlitSurface(vaisseau, NULL, ecran, &positionVaiseau);
        SDL_Flip(ecran);
        }
     
     
     
     
    }

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (SDL_PollEvent != 0)
    {
      faire code
    }
    sinon ton evenement ne change pas

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par coyotte507
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (SDL_PollEvent != 0)
    {
      faire code
    }
    sinon ton evenement ne change pas
    J'ai éssayé, avant de voir ton code, un SDL_Delay, et ca fonctionne


    Merci quand même!

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ton code comporte de nombreuses maladresses.

    - Tu ne devrais pas avoir plusieurs boucles d'affichage, une suffit, quitte à gérer des états ou à déléguer à des fonctions
    - Tu ne testes jamais le retour des fonctions... Au moins crash tu ne comprendras rien
    - Il faut toujours tester le retour de SDL_PollEvent ! Je dirais même que le if est insuffisant, il faut un while (il peut y avoir plusieurs évènements en attente)
    - Ta vitesse de déplacement est fixe, il faut qu'elle soit dépendante du framerate si tu veux assurer un déplacement constant

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Je reconnais que le code est relativement "sale", je vais l'améliorer, pour le retour des fonctions, dès que ca crache, c'est la première chose que je rajoute(j'en ai trop bavé a chercher une fois)

    Sinon, j'ai décidé de rajouter du son avec Fmod, mais il ne veut absolument pas m'ouvrir un son (je l'ai testé avec un retour de fonction)

    J'initialise fmod

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FSOUND_Init(44100, 32, 0);
    J'éssaye de télécharger un son dans la variable FSOUND_SAMPLE *explosion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FSOUND_SAMPLE *explosion
    Je teste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (explosion == NULL)
        {
            printf("erreur de chargement");
            exit(EXIT_FAILURE);
        }
    Et l'ordi rentre dans la boucle, la console a l'arrière me marque erreur de chargement


    EDIT: c'est un problème d'installation (j'ai éssayé avec un autre code, sur un site, l'erreur est la même), j'ai copié les .h dans /usr/include/FMOD/, le .so dans /usr/lib, et rajouté fmod-3.75 dans les options du linker

    PS: pour ceauq qu'avait pas encore compris, je suis sous linux (ubuntu plus précisément)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    tu peux télécharger SDL_mixer qui a été fait par le créateur de SDL et qui permet de gérer les sons.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse, mais je tiens tout de même a utiliser fmod.

  8. #8
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par mjfcolas
    Je reconnais que le code est relativement "sale", je vais l'améliorer, pour le retour des fonctions, dès que ca crache, c'est la première chose que je rajoute(j'en ai trop bavé a chercher une fois)
    Il faudrait donc commencer à nettoyer le code avant de rajouter fmod.

    Sinon, j'ai décidé de rajouter du son avec Fmod, mais il ne veut absolument pas m'ouvrir un son (je l'ai testé avec un retour de fonction)
    Il faudrait une version de ton code complet, propre et compilable qui montre l'erreur. Vérifie bien que tu testes le retour de chaque fonction !

    Jc

Discussions similaires

  1. [Access] Champ Date/Heure qui déconne
    Par portu dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/05/2006, 17h42
  2. glDisable(GL_LIGHTING) pour un plan 2D qui déconne
    Par Coelacanthe dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/12/2005, 22h03
  3. Jeu de voiture
    Par lucyole dans le forum Assembleur
    Réponses: 10
    Dernier message: 15/05/2005, 18h41
  4. Réalisation d'un jeu de voiture 2D
    Par gege2mars dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/01/2004, 22h40

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