Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Lenteur dans le deplacement d'un personnage

et accesoirement demande d'idee sur comment crée une map

    8 août 2006 à 17:26:46

    Bonjour a tous ,

    Apres avoir reussis a resoudre 2 ou 3 petits probleme de pointeur j'arrive enfin a deplacer un petit personnage sur mon ecran ^^

    Mais voila des que je change la resolution : Passage de 640*480 a 800*600 ma petite application bouffe tout le CPU et le personnage avance beaucoup beaucoup moins vite ! (normale ça rame !!)

    Pour information j'utilise un Pentium3 800 mhz avec 256 de ram

    Je ne blitt sur la surface que mon personnage , pas de fond ou autre.

    Le personnage est conpressé en png , le passage en bmp me fera gagner beaucoup au niveau processeur ? Ou il y a t- il d'autre technique qui me permettrai d'oppimiser un peu mon code?

    Sinon juste une petit derniere question : L'un d'etre vous a t'il deja coder un petit systeme de map (tres simple) pour un rpg 2D ?

    Ps: Mon code si ça peut aider :

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

    #define LARGEUR_ECRAN 800
    #define HAUTEUR_ECRAN 600
    #define SPRITE_W 24
    #define SPRITE_H 32


    enum {HAUT, DROITE, BAS, GAUCHE};

    void Deplacer(int direction,SDL_Rect sprite[][3],SDL_Rect *zone,SDL_Rect *position);

    int main(int argc, char *argv[])
    {

        SDL_Surface *ecran = NULL, *perso = NULL;
        SDL_Event event;
        SDL_Rect positionPerso, zone, sprite[4][3];
        int continuer = 1;
        int tempsPrecedent = 0, tempsActuel = 0;
        int i = 0, j = 0,z = 0;

        if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1)
            {
                fprintf(stderr, "Erreur d\'initialisation de la SDL : %s\n", SDL_GetError());
                exit(EXIT_FAILURE);
            }

        ecran = SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);

        if (ecran == NULL)
            {
                fprintf(stderr, "Erreur lors du chargement du mode video : %s\n", SDL_GetError());
                exit(EXIT_FAILURE);
            }

        SDL_WM_SetCaption("RedWorld 0.0.02 WiP by Ptidel", NULL);

        SDL_EnableKeyRepeat(10, 10);

        perso = IMG_Load("Perso\\perso.png");

        positionPerso.x = ((LARGEUR_ECRAN/2)-(SPRITE_W/2));
        positionPerso.y = ((HAUTEUR_ECRAN/2)-(SPRITE_H/2));

        for(i=0; i<=3; i++)
            {
                for(j=0; j<=4; j++)
                    {
                        sprite[i][j].x = j*SPRITE_W;
                        sprite[i][j].y = i*SPRITE_H;
                        sprite[i][j].w = SPRITE_W;
                        sprite[i][j].h = SPRITE_H;
                    }
            }


        while(continuer)
            {


                tempsActuel = SDL_GetTicks();
                if ((tempsActuel - tempsPrecedent) > 30)
                    tempsPrecedent = tempsActuel;
                else
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));

                SDL_PollEvent(&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_UP:
                                        Deplacer(HAUT,sprite,&zone,&positionPerso);
                                        break;
                                    case SDLK_RIGHT:
                                        Deplacer(DROITE,sprite,&zone,&positionPerso);
                                        break;
                                    case SDLK_DOWN:
                                        Deplacer(BAS,sprite,&zone,&positionPerso);
                                        break;
                                    case SDLK_LEFT:
                                        Deplacer(GAUCHE,sprite,&zone,&positionPerso);
                                        break;
                                }
                    }

                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                SDL_BlitSurface(perso, &zone, ecran, &positionPerso);
                SDL_Flip(ecran);
            }

        SDL_Quit();
        return EXIT_SUCCESS;
    }

    void Deplacer(int direction,SDL_Rect sprite[][3],SDL_Rect *zone,SDL_Rect *position)
        {
            static int z = 0;

            z++;
            if(z <= 8)
                *zone = sprite[direction][0]// corriger le probleme des pointeur //
            else if(z >= 8 && z <= 16)
                *zone = sprite[direction][1];
            else if(z >= 16 && z <= 24)
                {
                    *zone = sprite[direction][2];
                    if(z == 24)
                        z = 0;
                }
            switch(direction)
                {
                    case HAUT:
                        position->y--;
                        break;
                    case DROITE:
                        position->x++;
                        break;
                    case BAS:
                        position->y++;
                        break;
                    case GAUCHE:
                        position->x--;
                        break;
                }
        }


    Je vous remercis d'avance .
    • Partager sur Facebook
    • Partager sur Twitter
      8 août 2006 à 17:51:30

      Coucou,
      Essaie de remplacer ce code :

      SDL_PollEvent(&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_UP:
              Deplacer(HAUT,sprite,&zone,&positionPerso);
              break;
          case SDLK_RIGHT:
              Deplacer(DROITE,sprite,&zone,&positionPerso);
              break;
          case SDLK_DOWN:
              Deplacer(BAS,sprite,&zone,&positionPerso);
              break;
          case SDLK_LEFT:
              Deplacer(GAUCHE,sprite,&zone,&positionPerso);
              break;
          }
      }


      par celui-ci :

      while(SDL_PollEvent(&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_UP:
                  Deplacer(HAUT,sprite,&zone,&positionPerso);
                  break;
              case SDLK_RIGHT:
                  Deplacer(DROITE,sprite,&zone,&positionPerso);
                  break;
              case SDLK_DOWN:
                  Deplacer(BAS,sprite,&zone,&positionPerso);
                  break;
              case SDLK_LEFT:
                  Deplacer(GAUCHE,sprite,&zone,&positionPerso);
                  break;
              }
          }
      }


      Je sais pas si ca va changer grand chose mais tu peux toujours essayer. Je sais que j'avais eu un problème une fois à cause de ça (la pile ne se vidait pas assez vite je crois).
      • Partager sur Facebook
      • Partager sur Twitter
        8 août 2006 à 17:57:05

        Comment sors tu ensuite de ta boucle while ? car on ne peut plus changer la variable continuer qui sert de booleen pour quitter la boucle !
        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2006 à 17:58:18

          Nan mais la boucle avec la variable continuer tu la laisse. Remplace juste le bout de code que j'ai mis en haut. En fait la boucle while que j'ai mise la tu en sort des que tu as dépilé tous les événements (pollevent renvois alors 0).
          • Partager sur Facebook
          • Partager sur Twitter
            8 août 2006 à 18:06:52

            Oui escuse moi je n'avais pas bien compris ce que tu me disais , j'ai essayer j'ai gagner pres de 10% d'utilisation du CPU en moins ^^

            Mais bon ça va etre dur de blitter d'autre chose car mon pauvre CPU va pas aimer ....

            Sinon quelqu'un aurais une idée sur comment faire un systeme de map ? j'y reflechit depuis un moment mais j'ai un peu de mal a trouver ...
            • Partager sur Facebook
            • Partager sur Twitter
              8 août 2006 à 18:11:11

              Je ne connais pas bien la SDL je peux pas vraiment t'aider, mais en tout cas je doute que ton utilisation du CPU soit normale... Il y a peu etre une erreur quelque part.

              Essaye d'uploader un zip avec ton projet qu'on puisse tester (avec les fichiers images et tout pour pouvoir compiler et exécuter).
              • Partager sur Facebook
              • Partager sur Twitter
                8 août 2006 à 18:14:30

                Citation : Ptidel

                Le personnage est compressé en png, le passage en bmp me fera gagner beaucoup au niveau processeur ? Ou il y a t- il d'autres techniques qui me permettraient d'optimiser un peu mon code ?


                Le passage en BMP fera rien gagner du tout. Quand à ton code, désolé il est trop moche pour que je m'y penche, merci d'indenter correctement et de placer des commentaires (c'est la moindre des choses quand on demande de l'aide).

                Citation : Ptidel

                Sinon juste une petite dernière question : L'un d'entre vous a t'il déjà co un petit système de map (très simple) pour un rpg 2D ?


                Oui, je m'y suis déjà penché, pose ta question.
                • Partager sur Facebook
                • Partager sur Twitter
                  8 août 2006 à 18:38:00

                  Voila un zip de mon projet Le projet

                  Remram44, pour ton sytème de map comment relies tu le la structure de la map au tiles ?

                  Je pensais utilisé un sytème de numerotation : Mon fichier map contient le chemain vers le charset utilise la taille de la map , puis une suite de numero correspondant au tiles.

                  Le tileset est ensuite lu et chaque tiles est numeroté et apres on blitte toute la map. Mais voila avec ce systeme je perds enorment de chose : la tile est-elle traversable , il y a t'il un son specifique a jouer dessus ?? Bref dans mon systeme je ne peut definir ça uniquement pour une tile et pas faire des caracteristique specifique pour une cas de la map.

                  Sinon l'indentation tu la prefere dans quelle style ??

                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 août 2006 à 19:39:22

                    Je trouve pas de problèmes...
                    Mais c'est apparement cette ligne qui utilise beaucoup trop ressources : SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));

                    EDIT:
                    (1h que je cherche je trouve pas... il n'y a peu etre pas de problème faudrais voir avec un expert ^^)
                    Bizar quand meme parceque j'ai fait une application 3D openGL dans laquelle je charge un model de 1000 polygones qui se déplace avec gestion des collisions et je suis à 10% de proc contre 30% avec ton appli.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [SDL] Lenteur dans le deplacement d'un personnage

                    × 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