Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jouer un son différent si la cible est touché

avec SDL_MIXER

    2 juillet 2018 à 18:45:37

    Bonjour,

    Je débute et sur un essai de jeu de tir, j'aimerais jouer un son différent (sons) quand la cible est touché, c'est à dire quand je clic gauche de la souris avec le viseur (appelé cible dans le programme, je sais c'est pas malin) sur homer. Lorsque je clic en dehors de homer un son de tir est joué (son). Mais avec ce que j'ai fait j'ai toujours le même son de tir (son) que je cible homer où pas, pouvez vous m'aider. J'aimerais donner aussi un mouvement aléatoire à homer, est ce possible et surtout abordable pour un débutant ? d'avance merci.

    Je n'ai pas préciser le viseur fait une taille de 30x30 et homer 90x60 c'est peut être important.

    voici le main

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL_image.h>
    #include <SDL_mixer.h>
    
    #include "constantes.h"
    
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *cible = NULL, *homer = NULL, *homerG = NULL;
        SDL_Event event;
        SDL_Rect positionCible, positionHomer;
        int continuer = 1, versLaDroite = 1, tempsPrecedent = 0, tempsActuel = 0;
    
        if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024) == -1)
        {
            printf("%s", Mix_GetError());
        }
        Mix_Music *musique;  //  creation du pointeur de type mix_music
        musique = Mix_LoadMUS("alma.ogg");  //  chargement de la musique
        Mix_PlayMusic(musique, -1);  //  -1 joue la musique à l'infini
        Mix_VolumeMusic(20);
    
        Mix_AllocateChannels(10);  //  allouer 10 canaux
    
    
        Mix_Chunk *son;
        Mix_Chunk *son2; //  crée un pointeur pour stocker le son
        son = Mix_LoadWAV("pan.wav");  //  charge le son
        son2 = Mix_LoadWAV("yes.wav");
        Mix_VolumeChunk(son, MIX_MAX_VOLUME / 2);  //  defini un volume pour ce son
        Mix_VolumeChunk(son2, MIX_MAX_VOLUME);
    
        SDL_Init(SDL_INIT_VIDEO);
    
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Jeu de tir", NULL);
    
        if (ecran == NULL)
        {
            fprintf(stderr, "impossible de charger le mode video : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
    
        cible = IMG_Load("cible.bmp");
        SDL_SetColorKey(cible, SDL_SRCCOLORKEY, SDL_MapRGB(cible->format, 0, 0, 255));
    
        positionCible.x = ecran->w / 2 - cible->w / 2;
        positionCible.y = ecran->h / 2 - cible->h / 2;
    
        homerG = IMG_Load("homerG.bmp");
        homer = IMG_Load("homer.bmp");
        SDL_SetColorKey(homer, SDL_SRCCOLORKEY, SDL_MapRGB(homer->format, 255, 0, 0));
    
        positionHomer.x = 0;
        positionHomer.y = 300;
    
    
        SDL_ShowCursor(SDL_DISABLE);
    
        while (continuer)
        {
            SDL_PollEvent(&event);
            switch (event.type)
            {
                case SDL_QUIT:
                continuer = 0;
                break;
    
                case SDL_MOUSEMOTION:
                positionCible.x = event.motion.x - (cible->w / 2);
                positionCible.y = event.motion.y - (cible->h / 2);
                break;
    
                case SDL_MOUSEBUTTONDOWN:
                if (event.button.button == SDL_BUTTON_LEFT)
                    {
                        Mix_PlayChannel(1, son, 0);
                    }
                else if(event.button.button == SDL_BUTTON_LEFT && &positionCible == &positionHomer)
                    {
                        Mix_PlayChannel(2, son2, 0);
                    }
                    break;
    
                case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_p:
                    if (Mix_PausedMusic() == 1)  //  si la musique est en pause
                    {
                        Mix_ResumeMusic();  //  reprendre la musique
                    }
                    else
                    {
                        Mix_PauseMusic();  //  mettre la musique en pause
                    }
                    break;
    
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                }
                break;
            }
    
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 30)  /* si 30ms se sont écoulé depuis le dernier tour de la boucle
            plus le temps est petit plus il se deplace vite */
            {
                tempsPrecedent = tempsActuel;  // le temps actuel devient le temps présent
            }
            else
            {
                SDL_Delay(30 - (tempsActuel - tempsPrecedent));
            }
            if (versLaDroite)
            {
                if (positionHomer.x >= 870)
                {
                    versLaDroite = 0;
                }
                 else
                 {
                     positionHomer.x++;
                 }
            }
            else
            {
                if (positionHomer.x <= 0)
                    {
                        versLaDroite = 1;
                    }
                else
                    {
                        positionHomer.x--;
                    }
            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(cible, NULL, ecran, &positionCible);
            SDL_BlitSurface(homer, NULL, ecran, &positionHomer);
            SDL_Flip(ecran);
        }
        SDL_FreeSurface(cible);
        SDL_FreeSurface(homer);
        SDL_Quit();
    
        /* On libère le son  */
        Mix_FreeMusic(musique);
        Mix_FreeChunk(son);
        Mix_FreeChunk(son2);
        Mix_CloseAudio();  //  on ferme l'api
    
        return EXIT_SUCCESS;
    }
    
    


    et le header

    #ifndef DEF_CONSTANTES
    #define DEF_CONSTANTES
    
        #define TAILLE_BLOC         30 // Taille d'un bloc (carré) en pixels
        #define NB_BLOCS_LARGEUR    30
        #define NB_BLOCS_HAUTEUR    30
        #define LARGEUR_FENETRE     TAILLE_BLOC * NB_BLOCS_LARGEUR
        #define HAUTEUR_FENETRE     TAILLE_BLOC * NB_BLOCS_HAUTEUR
    
    
        enum {HAUT, BAS, GAUCHE, DROITE};
        enum {VIDE, MUR, CAISSE, HOMER, HOMER_PAN};
    
    #endif
    
    

    Le programme est en cours c'est pour ça qu'il y a des choses qui y sont mais ne servent pas encore.

    -
    Edité par BrunoAlma 2 juillet 2018 à 18:48:48

    • Partager sur Facebook
    • Partager sur Twitter
      3 juillet 2018 à 14:22:21

      La réponse est très simple.

      Ton erreur est ici :

      case SDL_MOUSEBUTTONDOWN:
                  if (event.button.button == SDL_BUTTON_LEFT)
                      {
                          Mix_PlayChannel(1, son, 0);
                      }
                  else if(event.button.button == SDL_BUTTON_LEFT && &positionCible == &positionHomer)
                      {
                          Mix_PlayChannel(2, son2, 0);
                      }
                      break;

      Tu ne vois pas pourquoi ?
      N'oublie pas que le programme va executer chacune des lignes les unes après les autres, par conséquent, ici le programmes regarde si ton event est de type SDL_MOUSEBUTTONDOWN, supposons que oui.
      Ensuite il va regarder si le bouton est le clic gauche.
      Oui ? il execute donc :

      Mix_PlayChannel(1, son, 0);

      Non ? il va donc regarder le else if.
      Est-ce qu'il est de type SDL_MOUSEBUTTONDOWN ? impossible sinon il serait rentrer dans le if précédent.

      En clair, si tu appuie sur le clic gauche il rentrera toujours dans le if, jamais dans le else if puisque le if sera executé avant.
      Si il rentre dans le if, il ne testera pas le else if.

      • Partager sur Facebook
      • Partager sur Twitter
        16 juillet 2018 à 16:01:54

        Merci j'ai compris mon erreur je vais voir pour une autre solution, peut être intervertir le if avec le else if ou autre chose; en tout cas merci pour ta réponse.
        • Partager sur Facebook
        • Partager sur Twitter

        Jouer un son différent si la cible est touché

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown