Partage
  • Partager sur Facebook
  • Partager sur Twitter

Déplacement d'un perso

Sujet résolu
    27 mai 2006 à 15:47:13

    Bonjour,

    J'ai encore un petit problème^^

    J'attaque le chapitre sur le temps, et je voudrais que mon personnage (Link :p ) puisse se déplacer tout seul. Je viens a peine de commencer le chapitre, mais avant tout j'aimerais que mon personnage apparaisse sur ma fenêtre.
    Le problème c'est que j'ai des erreurs, mais aucune ligne n'est surlinger (contrairement a quand il y a des fautes !)

    Voici mon code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "main.h"

    int main(int argc, char *argv[])
    {
        //Déclaration & initialisation de nos fonctions
        SDL_Event event;
        SDL_Surface *ecran = NULL, *linkActuel = NULL;
        SDL_Surface *link[4] = {NULL};
        int continuer = 1;
        SDL_Rect position, positionLink;

        SDL_Init(SDL_INIT_VIDEO); //Ouverture de la SDL


        //On ouvre une fenêtre
        ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
        //On donne un titre a notre fenêtre
        SDL_WM_SetCaption("Le temps avec la SDL", NULL);
        link[BAS] = IMG_Load("link_bouclier_bas.gif");
        link[GAUCHE] = IMG_Load("link_bouclier__gauche.gif");
        link[HAUT] = IMG_Load("link_bouclier__haut.gif");
        link[DROITE] = IMG_Load("link_bouclier__droite.gif");
        //Link est positionné vers le bas !
        linkActuel = link[BAS];
        //Activation de la répétition des touches !
        SDL_EnableKeyRepeat(100,100);
        //On entre dans les evenements
        while(continuer)
        {
            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;
                }
                break;
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,250,250,250));
            SDL_BlitSurface(link,NULL,ecran,&positionLink);
            SDL_FreeSurface(link);
            SDL_Flip(ecran);
        }

        SDL_Quit(); //On quitte la SDL pour vider la mémoire
        return EXIT_SUCCESS;
    }


    Voila, il ne m'ouvre pas ma fenêtre et dans le debugger il me met sa:

    Citation : Erreur

    Switching to target: default
    Linking console executable: SDLapp.exe
    .objs\main.o:main.c:(.text+0x0): multiple definition of `SDL_main'
    .objs\main.o:main.c:(.text+0x0): first defined here
    .objs\main.o:main.c:(.text+0x7f): undefined reference to `IMG_Load'
    .objs\main.o:main.c:(.text+0x8e): undefined reference to `IMG_Load'
    .objs\main.o:main.c:(.text+0x9d): undefined reference to `IMG_Load'
    .objs\main.o:main.c:(.text+0xac): undefined reference to `IMG_Load'
    .objs\main.o:main.c:(.text+0x7f): undefined reference to `IMG_Load'
    .objs\main.o:main.c:(.text+0x8e): more undefined references to `IMG_Load' follow
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)



    Voila, pourquoi mon code ne fonctionne pas ?

    A+
    • Partager sur Facebook
    • Partager sur Twitter
      27 mai 2006 à 15:50:54

      Salut
      Y a quoi dans main.h ?
      Et sinon t'aurais pas ton programme qui serais déjà lancé ( celui que t'essaye de compiler) ?
      • Partager sur Facebook
      • Partager sur Twitter
        27 mai 2006 à 15:52:46

        Tu es sur d'avoir linker le compilateur SDL_image ?
        • Partager sur Facebook
        • Partager sur Twitter
          27 mai 2006 à 15:57:39

          rom1504 >> Dans la main.h j'ai :


          #ifndef DEF_CONSTANTES
          #define DEF_CONSTANTES

              enum {HAUT, BAS, GAUCHE, DROITE};
             
          #endif


          Sinon Lydriel >> Heu tu as peut être raison, il faut que je rajoute quoi comme ligne ?

          A+
          • Partager sur Facebook
          • Partager sur Twitter
            27 mai 2006 à 16:02:32

            Dans les options du compilateur, va dans LINKER et tu ajoute un fichier comportant quelque chose comme SDL_image.a ou .lib (je suis sous Linux, je ne connais pas les noms sous windows...)
            • Partager sur Facebook
            • Partager sur Twitter
              27 mai 2006 à 16:28:56

              Salut,

              J'ai bien relinker tout sa, mais bon la fenêtre ne s'ouvre toujours pas :(

              Voici ce qu'il me met (dans le debugger):

              Citation : Erreur

              Switching to target: default
              Linking console executable: SDLapp.exe
              .objs\main.o:main.c:(.text+0x0): multiple definition of `SDL_main'
              .objs\main.o:main.c:(.text+0x0): first defined here
              collect2: ld returned 1 exit status
              Process terminated with status 1 (0 minutes, 0 seconds)



              Voila, pourquoi me met-il sa ?

              A+
              • Partager sur Facebook
              • Partager sur Twitter
                27 mai 2006 à 16:32:50

                Bon, SDL_image n'est pas un compilateur, et le debuggeur n'affiche pas d'erreur, apprenez le vocabulaire !!!

                Il te dit que tu as deux SDL_main, c'est à dire deux fonctions main. Donc t'as un truc louche dans ton code.
                • Partager sur Facebook
                • Partager sur Twitter
                  27 mai 2006 à 16:37:58

                  essaie juste avec int main(void) pour voir
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 mai 2006 à 16:42:38

                    Il a changé de registre, maintenant il me trouve une erreur.

                    Voila mon code (il a pas beaucoup changé^^) :

                    #include <stdlib.h>
                    #include <stdio.h>
                    #include <SDL/SDL.h>
                    #include <SDL/SDL_image.h>
                    #include "main.h"

                    int main(int argc, char *argv[])
                    {
                        //Déclaration & initialisation de nos fonctions
                        SDL_Event event;
                        SDL_Surface *ecran = NULL, *linkActuel = NULL;
                        SDL_Surface *link[4] = {NULL};
                        int continuer = 1;
                        SDL_Rect position, positionLink;

                        SDL_Init(SDL_INIT_VIDEO); //Ouverture de la SDL


                        //On ouvre une fenêtre
                        ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
                        //On donne un titre a notre fenêtre
                        SDL_WM_SetCaption("Le temps avec la SDL", NULL);
                        link[BAS] = IMG_Load("link_bouclier_bas.gif");
                        link[GAUCHE] = IMG_Load("link_bouclier__gauche.gif");
                        link[HAUT] = IMG_Load("link_bouclier__haut.gif");
                        link[DROITE] = IMG_Load("link_bouclier__droite.gif");
                        //Link est positionné vers le bas !
                        linkActuel = link[BAS];
                        //Activation de la répétition des touches !
                        SDL_EnableKeyRepeat(100,100);
                        //On entre dans les evenements
                        while(continuer)
                        {
                            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;
                                }
                                break;
                            }
                            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,250,250,250));
                            SDL_BlitSurface(link, NULL, ecran, &positionLink);
                            SDL_Flip(ecran);
                        }

                        SDL_Quit(); //On quitte la SDL pour vider la mémoire
                        return EXIT_SUCCESS;
                    }


                    Voila, or il me met cette erreur:

                    Citation : Erreur

                    Warning : passing arg 1 of `SDL_UpperBit' from incompatible pointer type


                    Cette erreur concerne cette ligne:
                    SDL_BlitSurface(link, NULL, ecran, &positionLink);


                    Et bien sur la fenêtre ne s'ouvre pas^^

                    A+
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 mai 2006 à 16:44:30

                      link est un tableau, tu ne peux pas le passer à SDL_BlitSurface sans préciser d'indice, entre crochets.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 mai 2006 à 16:47:56

                        Il faut que j'écrive quoi alors ?

                        Car étant donnée que je ne sais pas quel est sa postion (BAS HAUT DROITE GAUCHE) je ne peux rien écrire d'autre ?

                        A+
                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 mai 2006 à 16:54:30

                          remrem44 -> j'ai oublier le mot "avec", je sais tres bien que SDL_image n'est pas un compilateur.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 mai 2006 à 17:13:56

                            J'ai bidouillé a tout, et j'ai trouvé pourquoi ma fenêtre ne s'ouvrait pas (en fait il se remettait tout seul en "Console Application", donc a chaque fois que j'ouvre le logiciel je doit modifier sa pour le mettre en "GUI Application !")

                            Merci pour votre aide, je ne met pas ce topic en "Résolu", car si j'ai d'autres petits soucis, je viendrais poster ici !

                            A+
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Déplacement d'un perso

                            × 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