Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec FMOD, et ? sur l'IA

l'un plante le prgm, l'autre ne marche pas

    23 octobre 2006 à 18:04:27

    Salut, il y a deux questions, si vous arrivez à m'expliquez l'une d'entre elle je serai déja très heureux . D'abord, le problème avec FMOD 3, et ensuite de l'aide pour mon code IA.

    I. Le Son
    </span>
    J'essayais de faire un petit Space Invaders en un contre un avec la SDL, et pour ce qui est du déplacement du joueur, ça fonctionne (c'était pas si dur :D ). Cependant, dès que j'insere de la musique, le programme ne compile pas (le jeu ne s'affiche pas du tout). Pourtant lorsque je mets:

    FSOUND_Init(44100, 32, 0);


        menuMusic = FSOUND_Stream_Open("menu_music.mp3", 0, 0, 0);
        if (menuMusic == NULL)
        {
            fprintf(stderr, "Impossible de lire menu_music.mp3\n");
            exit(EXIT_FAILURE);
        }

        FSOUND_Stream_SetLoopCount(menuMusic, -1);
        FSOUND_Stream_Play(FSOUND_FREE, menuMusic);

    en commentaire, le programme se déroule bien.

    Voici le code complet:

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <FMOD/fmod.h>
    #include <SDL/SDL_ttf.h>

    int main(int argc, char *argv[])
    {
        const long DIFF = 4;
        long turn;

        SDL_Surface *ecran = NULL, *W = NULL, *M = NULL;
        SDL_Rect positionFond, positionW, positionM;
        SDL_Event event;
        int continuer = 1;
        FSOUND_STREAM *menuMusic = NULL;

        positionW.x = 32;
        positionW.y = 500;
        positionM.x = 735;
        positionM.y = 100;

        FSOUND_Init(44100, 32, 0);


        menuMusic = FSOUND_Stream_Open("menu_music.mp3", 0, 0, 0);
        if (menuMusic == NULL)
        {
            fprintf(stderr, "Impossible de lire menu_music.mp3\n");
            exit(EXIT_FAILURE);
        }

        FSOUND_Stream_SetLoopCount(menuMusic, -1);
        FSOUND_Stream_Play(FSOUND_FREE, menuMusic);


        SDL_Init(SDL_INIT_VIDEO);

        SDL_WM_SetIcon(SDL_LoadBMP("w_ship.bmp"), NULL);

        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("War of the Letters", NULL);


        SDL_EnableKeyRepeat(40, 15);
        SDL_ShowCursor(SDL_DISABLE);

        W = SDL_LoadBMP("w_ship.bmp");
        SDL_BlitSurface(W, NULL, ecran, &positionW);
        M = SDL_LoadBMP("m_ship.bmp");
        SDL_BlitSurface(M, NULL, ecran, &positionM);

        SDL_Flip(ecran);

        while (continuer)
        {
            srand(time(NULL));
            turn = (rand() % (DIFF - 1 + 1)) + 1;

            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_LEFT:
                            if (positionW.x >=32)
                                positionW.x = positionW.x - 32;
                            break;
                        case SDLK_RIGHT:
                            if (positionW.x <=767)
                                positionW.x = positionW.x + 32;
                                break;
                    }
                default:
                    if (positionM.x > positionW.x && turn == 1)
                        positionM.x = positionM.x - 32;
                    else if (positionM.x > positionW.x && turn != 1 && positionM.x <= 766)
                        positionM.x = positionM.x + 32;
                    else if (positionM.x < positionW.x && turn == 1)
                        positionM.x = positionM.x + 32;
                    else if (positionM.x < positionW.x && turn != 1 && positionM.x >= 31)
                        positionM.x = positionM.x - 32;
                    break;
            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(W, NULL, ecran, &positionW);
            SDL_BlitSurface(M, NULL, ecran, &positionM);
            SDL_Flip(ecran);
        }

        SDL_FreeSurface(W);
        SDL_Quit();
        FSOUND_Stream_Close(menuMusic);
        FSOUND_Close();

        return EXIT_SUCCESS;
    }

    Et le message d'erreur:

    Project : SDL Application
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\Documents and Settings\HP_Administrateur\Bureau\Paul\Programs\C-C++\War_of_the_Letters-2552\
    --------------------------------------------------------------------------------
    Checking for existence: war_of_the_letters.exe
    Executing: "C:\Documents and Settings\HP_Administrateur\Bureau\Paul\Programs\C-C++\War_of_the_Letters-2552\war_of_the_letters.exe" (in .)
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings


    J'ai bien mis libfmod.a dans le bon dossier: C:\Program Files\CodeBlocks\mingw32\lib et les bibli SDL et SDL_image qui se trouvent dans le même dossier fonctionnent correctement.

    De plus, fmod.dll et menu_music.mp3 sont bien dans le même dossier que mon projet.

    Quelqu'un connaît la solution?

    II. L'IA
    </span>

    Vous remarquerez aussi que mon code IA n'est pas très développé.. J'avais réussi à faire ce jeu en TI-BASIC sur ma calculatrice en utilisant le même principe que ce que j'ai tenté pour l'ennemi (note: les commentaires ne sont pas dans le code, c'est simplement pour ceux qui ne connaissent pas le TI-BASIC)

    :randInt(1,D)->R ___//Génére un nombre entier R pour 1 <= R <= D

    pour D la difficulté donnée au début {entre 4 et 20} et R la donnée que j'utiliserai ensuite dans la boucle principale:


    :If A<X and R>3 ____//Si 'absisse de l'ennemi' < 'absisse du joueur' et R < 3
    :Then ______________//Alors
    :Output(B,A," " ____//Effacer la position actuelle de l'ennemi
    :A+1->A ____________//'absisse de l'ennemi' = 'absisse de l'ennemi' + 3
    :Goto 00 ___________//Retour au début de la boucle principale du jeu
    :Else ______________//Sinon (suivi du reste de la boucle principale)


    Si eG est le déplacement vers la gauche de l'ennemi, eD son déplacement vers la droite (c'est ce que je viens de mettre), et eT son tir; et jG le déplacement vers la gauche du joueur, jD son déplacement vers la droite, et jT son tir, alors dans la boucle principale 00, le code est mis de la manière suivante:
    eG ; jG ; eD ; jD ; eT ; jT.

    Ainsi en utilisant la variable R générée à chaque tour de boucle, on a 25% de chance que l'ennemi agisse avant le joueur en difficulté facile, et 85% de chance en difficulté dure.

    Je comprend bien que c'est un code IA archi-simple en conception, mais avant de passer à quelque chose de plus compliqué, j'aimerais au moins savoir le reproduire en C.

    Donc, si jamais quelqu'un a compri tout ça et sait ce qu'il faut faire pour le reproduire en C, svp répondez, car là le mien ne marche pas du tout.

    Merci,
    MagniH
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      23 octobre 2006 à 18:32:02

      Pour la question sur le TI Basic c'est pas le bon forum ;)
      Pour le C, essaye en plaçant le flag SDL_INIT_AUDIO dans la fonction SDL_Init();
      Et met la avant de lancer la musique. je pense que sa peut mieux marcher
      • Partager sur Facebook
      • Partager sur Twitter
        23 octobre 2006 à 18:56:11

        Non, ca ne marche pas, c'est pas SDL_AUDIO que j'utilise, mais FMOD (j'ai quand même essayé, mais avec le même résultat)

        Et pour le TI-BASIC, c'est pas une question sur ce language, mais une question sur comment on pourrait traduire en C ce que j'avais fait en TI-BASIC
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          23 octobre 2006 à 19:05:28

          Citation : MagniHarvald

          Et pour le TI-BASIC, c'est pas une question sur ce language, mais une question sur comment on pourrait traduire en C ce que j'avais fait en TI-BASIC



          Oops désolé j'avais pas vu.
          Pour le code TI, Mateo donne ce code dans le premier TP pour un nombre aléatoire :
          srand(time(NULL));
          nombreAleatoire = (rand() % (MAX - MIN + 1)) + MIN;


          Pour la suite :

          :If A<X and R>3 //Si 'absisse de l'ennemi' < 'absisse du joueur' et R < 3
          :Then //Alors
          :Output(B,A," ") //Effacer la position actuelle de l'ennemi
          :A+1->A //'absisse de l'ennemi' = 'absisse de l'ennemi' + 3
          :Goto 00 //Retour au début de la boucle principale du jeu
          :Else //Sinon (suivi du reste de la boucle principale) 


          La fonction Output prend des paramètres spécifiques à la TI, ensuite le goto est très déconseillé en C
          • Partager sur Facebook
          • Partager sur Twitter

          Problème avec FMOD, et ? sur l'IA

          × 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