Partage
  • Partager sur Facebook
  • Partager sur Twitter

SCROLLING

est ce que j'ai utiliser la bonne facon???

    24 juin 2007 à 21:37:55

    bonjour cher programeurs , j'ai besoin de vous voila:

    -je fais un jeu en c de tir-aventure et j'aimerai faire un mode libre ( ou un mode virer pour ceux qui connaissent gta san andreas ^^ )je veux utiliser la techniques de scrolling que j'en ai longuement entendue parler mais je ne trouve personne qu'il explique toutes les etapes pour reussir a faire un scrolling,ci dessous mon code:

    #include<stdio.h>
    #include<stdlib.h>
    #include<SDL\SDL.h>
    #include<SDL\SDL_image.h>
       
    int main(int argc,char *argv[])
    {
        SDL_Surface *ecran=NULL,*fond=NULL,*perso=NULL,*surface=NULL;;
        SDL_Event event;
        int continuer = 1;
        SDL_Rect positionFond,positionPerso,positionSurface;
       
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
       
        perso = IMG_Load("persoBas.gif");
        positionPerso.x=600;
        positionPerso.y=450;
       
        fond = IMG_Load("niveaux2.jpg");
       
        positionFond.x=0;
        positionFond.y=0;
       
       
       
        positionSurface.w=0;
        positionSurface.h=0;
       
       
        SDL_EnableKeyRepeat(10,10);
        while(continuer)
        {
                        SDL_WaitEvent(&event);
                        switch(event.type)
                        {
                                          case SDL_QUIT:
                                               continuer = 0;
                                          break;
                                         
                                          case SDL_KEYDOWN:
                                               switch(event.key.keysym.sym)
                                               {
                                                                           case SDLK_UP:
                                                                                positionFond.y--;
                                                                           break;
                                                                           case SDLK_DOWN:
                                                                                positionFond.y++;
                                                                           break;
                                                                           case SDLK_RIGHT:
                                                                                positionFond.x--;
                                                                           break;
                                                                           case SDLK_LEFT:
                                                                                positionFond.x++;
                                                                           break;
                                               }
                                          break;
                        }
       
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
        SDL_BlitSurface(fond,NULL,ecran,&positionFond);
        SDL_BlitSurface(perso,NULL,ecran,&positionPerso);
       
        SDL_Flip(ecran);
        }
       
    SDL_FreeSurface(fond);
    SDL_FreeSurface(perso);

    SDL_Quit();
    return EXIT_SUCCESS;
    }



    mon probleme est que lorque je fai les touche droite ou soi en bas le fond bouge et laisse place a un ecran blanc , mais lorque j'essay de faire linverse l'image se bloque,la sdl ne veut pa me faire montrer le reste de limage :D
    si vous trouver une erreur dan mon code ou bien si vous avez une ider de comment faire dites le moi !!!!!
    merci d'avance

    PS: mon image de fond fait 1200*900 pixel et mon ecran 800*600 je ne sais pas si j'ai utiliser la bonne solution aidez moi svp
    • Partager sur Facebook
    • Partager sur Twitter
      24 juin 2007 à 22:01:33

      Salut. :)

      Tu ne peux pas blitter une image avec des coordonnées négatives.

      Plutot que de deplacer l'image, deplace juste le cadre d'affichage :
      Utilise non pas
      SDL_BlitSurface(fond,NULL,ecran,&positionfond);
      mais
      SDL_BlitSurface(fond,&morceaufond,ecran,NULL);

      Tu fais au debut du code
      SDL_Rect morceaufond;
      morceaufond.w=800;
      morceaufond.h=600;
      et tu fais varier morceauFond.x et y dans tes "cases" du switch.

      Voila.
      :D
      • Partager sur Facebook
      • Partager sur Twitter
        24 juin 2007 à 22:15:25

        merci GNI j'ai reussi mais sauf que au debut , avant de faire sa , j'avais un tableau multidimensionnel avec des objet ke j'avais placer sur la carte comme de lerbe , des planche de boi (pour faire les maison :) ) mais sauf que maintenant ces objet la ne se blitte pas sur le fond ,pourquoi sa fait sa??? et comen pourai je resoudre ce probleme???

        je vous laisse mon code source entier de ma partie libre pour que vous y voyer plus clair:

        constantes.h
        #ifndef CONSTANTE
        #define CONSTANTE

            #define BLOC    32
            #define NB_L    19
            #define NB_H    19
            #define LARGEUR NB_L * BLOC
            #define HAUTEUR NB_H * BLOC
           
        enum{NOIR,MUR,HERBE,ROUTE};
        enum {HAUT, BAS, GAUCHE, DROITE};
        enum {VERT,PERSO};

        #endif


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



        int main(int argc, char *argv[])
        {
        //  Variables
            int continuer = 1, x = 0, y = 0;
            SDL_Surface *ecran = NULL, *sfNoir = NULL, *sfMur = NULL,*sfHerbe=NULL,*sfRoute=NULL;
            SDL_Surface *perso[4] = {NULL},*persoActuel = NULL,*vert=NULL,*fond=NULL;
            SDL_Event event;
            int carte[NB_L][NB_H] = {0}, i = 0, j = 0;
            SDL_Rect pos;
            SDL_Rect position,positionJoueur,positionVert,positionPerso,positionEau;
            SDL_Rect positionFond,positionSurface;
            SDL_Rect morceau;
            FILE *text = NULL;
            char ligne[NB_L * NB_H + 1] = {0};
           

        //  Initialisation
            if(SDL_Init(SDL_INIT_VIDEO) == -1)
            {
                fprintf(stderr, "Impossible de charger la SDL : %s\n");
                exit(EXIT_FAILURE);
            }
            ecran = SDL_SetVideoMode(LARGEUR, HAUTEUR, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
            SDL_WM_SetCaption("mafia mode libre", NULL);

        //  Chargement
            sfNoir = IMG_Load("noir.bmp");
           
            sfMur = IMG_Load("mur.bmp");
           
            sfHerbe = IMG_Load("vert.bmp");
           
            sfRoute = IMG_Load("route.bmp");
           
            positionVert.x=0;
            positionVert.y=0;
           
            positionPerso.x=420;
            positionPerso.y=200;
           


            vert = SDL_LoadBMP("vert.bmp");

           
            perso[BAS]=IMG_Load("persoBas.gif");
            perso[HAUT]=IMG_Load("persoHaut.gif");
            perso[GAUCHE]=IMG_Load("persoGauche.gif");
            perso[DROITE]=IMG_Load("persoDroite.gif");
           
           
           
            persoActuel = perso[BAS];
            position.x=100;
            position.y=100;
           
           
            fond = IMG_Load("niveaux2.jpg");
           
            positionFond.x=0;
            positionFond.y=0;
           
           
            morceau.w=fond->w;
            morceau.h=fond->h;
           
            morceau.x=100;
            morceau.y=100;
           
           
            for (i = 0 ; i < NB_H ; i++)
            {
                for (j = 0 ; j < NB_L ; j++)
                {   
                   
                             
                               
                              if(carte[i][j] == PERSO)
                              positionJoueur.x = i;
                              positionJoueur.y = j;
                              carte[i][j] == VERT;
                             
                }
            }

            text = fopen("text.txt", "r");
            if(text == NULL)
            {
                fprintf(stderr, "Impossible de charger le fichier text.txt");
                exit(EXIT_FAILURE);
            }

        //  Lis le fichier
            fgets(ligne, NB_L * NB_H + 1, text);
            for(y = 0; y < NB_L; y++)
            {
                for(x = 0; x < NB_H; x++)
                {
                    switch(ligne[(y * NB_L) + x])
                    {
                        fprintf(stderr, "1");
                       
                        case '0':
                            carte[x][y] = 0;
                            break;

                        case '1':
                            carte[x][y] = 1;
                            break;
                           
                        case '2':
                             carte[x][y] = 2;
                            break;
                       
                        case '3':
                             carte[x][y] = 3;
                             break;
                    }
                }
            }

            SDL_EnableKeyRepeat(10,10);
            while(continuer)
            {
                SDL_WaitEvent(&event);
                switch(event.type)
                {
                    case SDL_QUIT:
                        continuer = 0;
                        break;
                    case SDL_KEYDOWN:
                       switch(event.key.keysym.sym)
                       {
                       case SDLK_UP:
                            morceau.y--;
                            persoActuel = perso[HAUT];
                           
                       break;
                       case SDLK_DOWN:
                            morceau.y++;
                            persoActuel = perso[BAS];
                           
                       break;
                       case SDLK_LEFT:
                            morceau.x--;
                            persoActuel = perso[GAUCHE];
                       break;
                       case SDLK_RIGHT:
                            morceau.x++;
                            persoActuel = perso[DROITE];
                           
                       break;
                       }
                  break;     
                }
                SDL_FillRect(ecran,NULL, SDL_MapRGB(ecran->format,255,0,0));

                for(x = 0; x < NB_L; x++)
                {
                    for(y = 0;y < NB_H; y++)
                    {
                        pos.x = x * BLOC;
                        pos.y = y * BLOC;
                        switch(carte[x][y])
                        {
                            case NOIR://0
                                SDL_BlitSurface(sfNoir, NULL, ecran, &pos);
                                break;
                            case MUR://1
                                SDL_BlitSurface(sfMur, NULL, ecran, &pos);
                                break;
                            case HERBE ://2
                                 SDL_BlitSurface(sfHerbe,&morceau,ecran,&pos);
                                 break;
                            case ROUTE ://3
                                 SDL_BlitSurface(sfRoute,NULL,ecran,&pos);
                                 break;
                        }
                    }
                }
               
                for (i = 0 ; i < NB_L ; i++)
                {
                    for (j = 0 ; j < NB_H ; j++)
                    {
                        positionVert.x = i * BLOC;
                        positionVert.y = j * BLOC;

                        switch(carte[i][j])
                        {
                            case VERT:
                                SDL_BlitSurface(vert,NULL, ecran, &positionVert);
                                break;
                            case PERSO:
                                SDL_BlitSurface(persoActuel, NULL, ecran, &positionPerso);
                                break;
                         
                        }
                       
                    }
               }
               
               
               SDL_BlitSurface(fond,&morceau,ecran,&positionFond);
                   
               SDL_BlitSurface(persoActuel,NULL, ecran, &positionPerso);

                SDL_Flip(ecran);
            }
            SDL_FreeSurface(persoActuel);
            SDL_FreeSurface(fond);
            SDL_FreeSurface(ecran);
            SDL_FreeSurface(sfNoir);
            SDL_FreeSurface(sfMur);
            SDL_FreeSurface(sfHerbe);
            SDL_FreeSurface(sfRoute);
            SDL_Quit();

            return EXIT_SUCCESS;
        }



        merci d'avance ;)
        • Partager sur Facebook
        • Partager sur Twitter
          24 juin 2007 à 22:27:13

          :D

          Je ne lis pas tout mais je sais d'ou viens le probleme.

          Tu as deux moyens de le résoudre. :-°
          Soit le bourrin, au lieu de blitter ton herbe sur l'ecran, tu la blitte sur la Fond
          SDL_BlitSurface(vert,NULL, fond, &positionVert);

          Ou alors, tu blitte sur l'ecran en faisant ca à chaque fois:
          positionVert.x+=morceaufond.x;
          positionVert.y+=morceaufond.y;


          Et si tu veux optimiser , ne blitte que si la case est visible (et non cachée, cad pas dans la zone de l'ecran)
          • Partager sur Facebook
          • Partager sur Twitter
            24 juin 2007 à 22:33:47

            dsl je pense que tu n'a pas compris , moi je ne veux pas mettre de fond mais faire la carte en utilisant les tableaux a deux dimension(et en fesan la carte tout seul :D en ecrivant dan un fichier text 1201211011021212310 je sai je suis un malade :p )
            comen je fais alor pour ne pas bouger le fond en fonction du personnage mais plutot le tableaux 2 dimenson en fonction du personnage!!
            merci d'avance ^^
            • Partager sur Facebook
            • Partager sur Twitter
              25 juin 2007 à 10:09:47

              Bon.
              Tu fais un SDL_Rect position_coin. C'est les coordonnées sur ta carte du coin gauche de l'ecran. Avec ton swtich la, tu modifie la position du personnage; et apres tu calcule positioncoin pour que le perso soit au milieu de l'ecran.
              Pour l'affichage, tu sais quels sont les coordonnées de chaque case (tu sais ou tu dois placer tes 00112120120 non? position.casex=numeroCase.x*taillecase etc...), ben tu regarde si elle est dans la zone d'affichage. (comparer positioncase à positioncoin).
              Essaye, c'est juste une question de logique pour les calculs a effectuer.
              • Partager sur Facebook
              • Partager sur Twitter
                25 juin 2007 à 11:09:37

                Citation : nazmi007

                <...>ci dessous mon code:<...>


                Purée, mais c'est quoi cette présentation à la gomme... Je rappelle que Code::Blocks a un indenteur intégré... (Plugins > Astyle...)

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

                int main (int argc, char *argv[])
                {
                   SDL_Surface *ecran = NULL, *fond = NULL, *perso = NULL, *surface = NULL;;
                   SDL_Event event;
                   int continuer = 1;
                   SDL_Rect positionFond, positionPerso, positionSurface;

                   SDL_Init (SDL_INIT_VIDEO);
                   ecran = SDL_SetVideoMode (800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

                   perso = IMG_Load ("persoBas.gif");
                   positionPerso.x = 600;
                   positionPerso.y = 450;

                   fond = IMG_Load ("niveaux2.jpg");

                   positionFond.x = 0;
                   positionFond.y = 0;

                   positionSurface.w = 0;
                   positionSurface.h = 0;

                   SDL_EnableKeyRepeat (10, 10);
                   while (continuer)
                   {
                      SDL_WaitEvent (&event);
                      switch (event.type)
                      {
                      case SDL_QUIT:
                         continuer = 0;
                         break;

                      case SDL_KEYDOWN:
                         switch (event.key.keysym.sym)
                         {
                         case SDLK_UP:
                            positionFond.y--;
                            break;
                         case SDLK_DOWN:
                            positionFond.y++;
                            break;
                         case SDLK_RIGHT:
                            positionFond.x--;
                            break;
                         case SDLK_LEFT:
                            positionFond.x++;
                            break;
                         default:
                            ;
                         }
                         break;
                      default:
                         ;
                      }

                      SDL_FillRect (ecran, NULL, SDL_MapRGB (ecran->format, 255, 255, 255));
                      SDL_BlitSurface (fond, NULL, ecran, &positionFond);
                      SDL_BlitSurface (perso, NULL, ecran, &positionPerso);

                      SDL_Flip (ecran);
                   }

                   SDL_FreeSurface (fond);
                   SDL_FreeSurface (perso);

                   SDL_Quit ();
                   return EXIT_SUCCESS;
                }

                C'est pas plus clair comme ça ?


                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                Anonyme
                  25 juin 2007 à 11:16:12

                  Il veut pas de code blocks ! Hein nazmi :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 juin 2007 à 12:11:47

                    :D max la menace (maxime pour les intimes :p )t'inquiete pas je vais essayer ce midi de faire marcher code blocks

                    sinon GNI jai reussi a afficher mes element sur mon fond en utilisant une techniques barbare :

                    case ROUTE :
                        SDL_BlitSurface(sfRoute,NULL,fond,&pos);
                    break;


                    mais bon cer pour aprendre comment faire mais je me pose toujours une question qui me bloque car je n'ai pas compris pourquoi tu m'a parler de position_coin, ce n'est pas pluto la position du morceau a afficher???!!!???
                    merci d'avance
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      25 juin 2007 à 13:31:12

                      Je connais quelqu'un qui va se marrer :-°

                      Mais si vous pouviez m'expliquer le principe du scrolling, et comment ça marche ça serait super :D

                      M'ci
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 juin 2007 à 15:54:49

                        Le scrolling, c'est quand la carte n'est pas limitée a la taille de l'ecran, mais que "ca bouge". Comme dans Scroll (voir signature) par exemple.

                        Ne pas confondre position_coin et morceau_carte!

                        Soit ta carte est une grosse image, et dans ce cas tu utilise ce que je t'ai dit, morceau_carte (qui affiche en fait juste un bout de la carte).

                        Soit ta carte n'existe pas (réellement) mais elle est composé de "cases" dont tu connait la position. Dans ce cas il te faut position_coin. Ici, tu dois afficher uniquement les casess qui sont sencées etre vues, donc tu compare leur position à la position du coin de l'ecran, et tu verifie qu'elles n'en depassent pas.Je te montre un bout de code pour le x :
                        //calcul du coin
                        centre_ecran.x = position_perso.x+taille_perso.x/2;
                        position_coin.x = centre_ecran.x - taille_ecran.x/2 ;

                        //calcul de l'affichage
                        for(case_tableau.y=0;case_tableau.y<nombre_case.y;case_tableau.y++)
                        {
                        for(case_tableau.x=0;case_tableau.x<nombre_case.x;case_tableau.x++)
                        {
                          //les cases affichées entierement (ou a moitié mais à droite de l'ecran)
                          if(case_tableau.x*taille_case.x > position_coin.x)
                          &&(case_tableau.x*taille_case.x < position_coin.x + taille_ecran.x)
                          {
                            position.x= case_tableau.x*taille_case.x - position_coin.x ;
                            BlitSurface(case,NULL,ecran,&position);
                          }

                          //les cases tout a gauche qui sont coupées (pour eviter les coordonnees négatives
                          else if(case_tableau.x*taille_case.x + taille_case.x > position_coin.x)
                          && (case_tableau.x*taille_case.x + taille_case.x < position_coin.x + taille_ecran.x)
                          {
                            position.x = 0;
                            morceau.x = position_coin.x - case_tableau.x*taille_case.x ;
                            morceau.w = taille_case.x - morceau.x;
                            BlitSurface(case,&morceau,ecran,&position);
                          }

                        }
                        }

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          26 juin 2007 à 16:35:29

                          Merci pour t'as réponse Gni :D

                          Et tu serais où on peut voir tout ça ? Un tuto ???
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 juin 2007 à 18:16:50

                            je n'est pas tros compris GNI exuse moi tu peux reepliker doucement lol
                            • Partager sur Facebook
                            • Partager sur Twitter

                            SCROLLING

                            × 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