Partage
  • Partager sur Facebook
  • Partager sur Twitter

avoir mon personnage au centre et le terrain qui bouge

je ne sais pas comment faire bouger le terrain:'(

Sujet résolu
    29 juin 2007 à 15:21:17

    Bonjour,
    je souhaiterais que mon personnage reste au centre de la fenêtre et que le terrain bouge, de façon à ne pas avoir une fenêtre trop grosse, parce qu'une fenêtre 10000*8000 (c'est un exemple), ça ne le fait pas du tout sur un écran 1280/1024 ^^'.
    Un peu dans le genre jeux gba, quand on sort de la zone centrale de l'écran, le terrain ou la caméra se déplace, on a l'impression que le personnage se déplace mais non, c'est le terrain ( à ce que j'ai pu constater).
    voici mon code:
    mainc:
    #include <SDL.h>
    #include <SDL_image.h>



    int jouer();

    int main ( int argc, char** argv )
    {
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Surface *ecran = SDL_SetVideoMode(1024,768,32, SDL_HWSURFACE);
    SDL_WM_SetCaption("Pokemon",NULL);
    SDL_Surface *menu = IMG_Load("sprites/menu/menu.jpg");
    SDL_Surface *curseur = IMG_Load("sprites/menu/curseur.jpg");

    SDL_SetColorKey(curseur, SDL_SRCCOLORKEY, SDL_MapRGB(curseur->format, 255, 255, 255)); // pour la transparence

    SDL_Rect posmenu;
    posmenu.x = 0;
    posmenu.y = 0;
    SDL_Rect poscurseur;
    poscurseur.x = 80;
    poscurseur.y = 308;


    SDL_BlitSurface(menu,NULL, ecran, &posmenu);
    SDL_BlitSurface(curseur,NULL, ecran, &poscurseur);
    SDL_Flip(ecran);

    bool continuer = true;
    SDL_Event event;

    while(continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = false;
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:  // touche eschap ou esc
                        continuer = false;
                        break;
                    case SDLK_UP:
                    if(poscurseur.y == 308)
                    {
                        poscurseur.y = 440;
                        SDL_Delay(100);
                        break;
                    }
                    if(poscurseur.y == 440)
                    {
                        poscurseur.y = 308;
                        SDL_Delay(100);
                    }
                        break;
                    case SDLK_DOWN:
                    if(poscurseur.y == 308)
                    {
                        poscurseur.y = 440;
                        SDL_Delay(100);
                        break;
                    }
                    if(poscurseur.y == 440)
                    {
                        poscurseur.y = 308;
                        SDL_Delay(100);
                    }

                        break;
                    case SDLK_RETURN: // touche entrée
                    if(poscurseur.y == 308)
                    {
                        jouer();
                        SDL_Delay(100);
                    }
                    if(poscurseur.y == 440)
                    {
                        continuer = false;
                    }
                        break;
                }
                break;
        }
    SDL_BlitSurface(menu,NULL, ecran, &posmenu);
    SDL_BlitSurface(curseur,NULL, ecran, &poscurseur);
    SDL_Flip(ecran);
    }

    SDL_FreeSurface(menu);
    SDL_FreeSurface(curseur);
    SDL_Quit();
    return EXIT_SUCCESS;
    }


    jeu.c:
    #include <SDL.h>
    #include <SDL_image.h>

    #define TAILLE_BLOC 35
    #define BLOCS_LARGEUR 20
    #define BLOCS_HAUTEUR 20
    #define LARGEUR_FENETRE 630
    #define HAUTEUR_FENETRE 420

    int chargerNiveau(int carte[][BLOCS_HAUTEUR]);

    enum {TERRE,HERBE,CENTREPOKEMON1,CENTREPOKEMON2,CENTREPOKEMON3,CENTREPOKEMON4};


    int jouer()
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_Surface *ecran = SDL_SetVideoMode( LARGEUR_FENETRE , HAUTEUR_FENETRE,32,SDL_HWSURFACE);
        SDL_Surface *heros = IMG_Load("sprites/personnages/heros/herosbas.bmp");
        SDL_Surface *terre = IMG_Load("sprites/decors/sol.bmp");
        SDL_Surface *herbe = IMG_Load("sprites/decors/herbes/herbe1.bmp");
        SDL_Surface *centrepokemon1 = IMG_Load("sprites/decors/bâtiments/centrepcpart1.bmp");
        SDL_Surface *centrepokemon2 = IMG_Load("sprites/decors/bâtiments/centrepcpart2.bmp");
        SDL_Surface *centrepokemon3 = IMG_Load("sprites/decors/bâtiments/centrepcpart3.bmp");
        SDL_Surface *centrepokemon4 = IMG_Load("sprites/decors/bâtiments/centrepcpart4.bmp");

        SDL_Rect posheros;
        posheros.x = 0;
        posheros.y=0;

        int i = 0, j = 0;


        SDL_Rect posherbe;
        posherbe.x = 0;
        posherbe.x = 0;

        int carte[BLOCS_LARGEUR][BLOCS_HAUTEUR] = {0};

        SDL_Rect position;

        SDL_Event event;

        bool continuer = true;

       chargerNiveau(carte);

       SDL_WarpMouse(ecran->w / 2, ecran->h / 2);
      SDL_EnableKeyRepeat(100, 100);
        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 = false;
                        break;

                        case SDLK_UP:
                        heros = IMG_Load("sprites/personnages/heros/heroshaut.bmp");

                        if(posheros.y < 0 + TAILLE_BLOC)
                        {break;}
                        posheros.y -= TAILLE_BLOC;
                        break;

                        case SDLK_DOWN:
                        heros = IMG_Load("sprites/personnages/heros/herosbas.bmp");
                        if(posheros.y > HAUTEUR_FENETRE - 2*TAILLE_BLOC)
                        {

                        break;}
                        posheros.y += TAILLE_BLOC;
                        break;

                        case SDLK_LEFT:
                        heros = IMG_Load("sprites/personnages/heros/herosgauche.bmp");
                        if(posheros.x < 0  + TAILLE_BLOC)
                        {
                        break;}

                        posheros.x -= TAILLE_BLOC;
                        break;

                        case SDLK_RIGHT:
                        heros = IMG_Load("sprites/personnages/heros/herosdroite.bmp");
                        if(posheros.x > LARGEUR_FENETRE - 2*TAILLE_BLOC)
                        {
                        break;}
                        posheros.x += TAILLE_BLOC;
                        break;
                    }
                    break;



            }
            // Effacement de l'écran
    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

    // Placement des objets à l'écran
    for (i = 0 ; i < BLOCS_LARGEUR ; i++)
    {
        for (j = 0 ; j < BLOCS_HAUTEUR ; j++)
        {
            position.x = i * TAILLE_BLOC ;
            position.y = j * TAILLE_BLOC ;

            switch(carte[i][j])
            {
                case HERBE:
                    SDL_BlitSurface(herbe, NULL, ecran, &position);
                    break;
                case TERRE:
                    SDL_BlitSurface(terre, NULL, ecran, &position);
                    break;
                case CENTREPOKEMON1:
                    SDL_BlitSurface(centrepokemon1,NULL,ecran,&position);
                    break;
                case CENTREPOKEMON2:
                    SDL_BlitSurface(centrepokemon2,NULL,ecran,&position);
                    break;
                case CENTREPOKEMON3:
                    SDL_BlitSurface(centrepokemon3,NULL,ecran,&position);
                    break;
                case CENTREPOKEMON4:
                    SDL_BlitSurface(centrepokemon4,NULL,ecran,&position);
                    break;
            }
        }
    }

    SDL_BlitSurface(heros,NULL,ecran,&posheros);
    // Mise à jour de l'écran
    SDL_Flip(ecran);
        }
    SDL_EnableKeyRepeat(0, 0);

        SDL_FreeSurface(terre);
        SDL_FreeSurface(herbe);
        SDL_FreeSurface(centrepokemon1);
        SDL_FreeSurface(centrepokemon2);
        SDL_FreeSurface(centrepokemon3);
        SDL_FreeSurface(centrepokemon4);
        SDL_Quit();
        return EXIT_SUCCESS;
    }


    int chargerNiveau(int carte[][BLOCS_HAUTEUR])
    {FILE* fichier = NULL;
        char ligneFichier[BLOCS_LARGEUR * BLOCS_HAUTEUR + 1] = {0};
        int i = 0, j = 0;

        fichier = fopen("terrain.lvl", "r");


        fgets(ligneFichier, BLOCS_LARGEUR * BLOCS_HAUTEUR + 1, fichier);

        for (i = 0 ; i < BLOCS_HAUTEUR ; i++)
        {
            for (j = 0 ; j < BLOCS_LARGEUR ; j++)
            {
                switch (ligneFichier[(i * BLOCS_LARGEUR) + j])
                {
                    case '0':
                        carte[j][i] = 0;
                        break;
                    case '1':
                        carte[j][i] = 1;
                        break;
                    case '2':
                        carte[j][i] = 2;
                        break;
                    case '3':
                        carte[j][i] = 3;
                        break;
                    case '4':
                        carte[j][i] = 4;
                        break;
                    case '5':
                        carte[j][i] = 5;
                        break;
                    case '6':
                        carte[j][i] = 6;
                        break;
                    case '7':
                        carte[j][i] = 7;
                        break;
                }
            }
        }

        fclose(fichier);
        return 0;
        }
    • Partager sur Facebook
    • Partager sur Twitter
      29 juin 2007 à 16:29:35

      Regarde du coté du deuxième argument de SDL_BlitSurface.
      Tu dois y envoyer un SDL_Rect qui determine la partie de l'image à blitter.
      Quand ton personnage arrive au bout de l'écran tu fait comme si il faisat du sur place et tu décale vers la droite la partie a blitter ;)
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        29 juin 2007 à 17:56:25

        J'ai une remarque : tu utilises les balises pour C++, donc je suppose que tu fais du C++, mais tu utilises fopen et compagnie; ne serait-il pas plus judicieux d'utiliser les flux? (Il y a un tuto sur ce site.)

        Sinon par rapport au sujet, je pratiquerais la même méthode que atoboldom.
        • Partager sur Facebook
        • Partager sur Twitter
          29 juin 2007 à 17:58:59

          Citation : hiura

          J'ai une remarque : tu utilises les balises pour C++, donc je suppose que tu fais du C++, mais tu utilises fopen et compagnie; ne serait-il pas plus judicieux d'utiliser les flux? (Il y a un tuto sur ce site.)

          Sinon par rapport au sujet, je pratiquerais la même méthode que atoboldom.



          Il utilise les balises C++, mais il suffit de regarder le code pour comprendre que c'est du C...
          • Partager sur Facebook
          • Partager sur Twitter
            29 juin 2007 à 20:30:34

            en fait , je suis programmeur (amateur) C , et je me sers du C++ pour ses avantages comme les déclarations de variables lorsque que je le souhaite, la variable bool et queques petites autres choses. Je vais me mettre au C++ plus tard, quand je serais bien programmer en C. Je ne comprends pas trop "Tu dois y envoyer un SDL_Rect qui determine la partie de l'image à blitter.", mais bon, je vais essayer.
            • Partager sur Facebook
            • Partager sur Twitter
              29 juin 2007 à 22:40:35

              Si tu cherche la simplicité, alors le C tout comme le C++ ne sont pas faits pour toi. Tu devrais regarder du côté de Python à mon avis, tu y trouveras ton bonheur. Et si tu veux te mettre ensuite à l'objet, alors essaies le Ruby ou le JAVA. Ce n'est pas une critique, mais je pense que tu y gagneras. Personellement je vois l'apprentissage du C(++) comme une base pour manipuler le plus de langages possibles, sans chercher à simplifier les choses.
              • Partager sur Facebook
              • Partager sur Twitter
                30 juin 2007 à 1:47:05

                Je vais partir du principe qu'il va continuer le C(++) et lui donner une réponse au cas où :p

                En gros il faut s'imaginer que quand tu affiche une image il y une sorte de rectangle de selection sur ton image.
                Par défaut le rectangle couvre toute l'image, elle est donc entièrement affichée.
                Mais maintenant si tu déplace ou si tu redimensionne le rectangle tu n'afficheras qu'un partie de l'image !

                Concrètement le rectangle se défini par SDL_Rect, pour l'initialiser ou le modifier tu fais comme sa :

                SDL_Rect rectangle;

                rectangle.x = 0; // Position X du rectangle sur l'image
                rectangle.y = 0; // Position Y du rectangle sur l'image
                rectangle.w = 10; // Largeur du rectangle
                rectangle.h = 10; // Hauteur du rectangle
                 


                Si tu veut déplacer ton image vers la gauche(pour aller a droite) tu va simplement décrémenter le x de rectangle ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  30 juin 2007 à 8:36:23

                  J'ai réussi, en fait j'ai créé un rectangle , je lui blitte par dessus les images et quand on est au rebord de la fenêtre et qu'on avance, le terrain se déplace. ^^
                  Au fait, je n'ai pas l'intention d'arrêter le C++
                  • Partager sur Facebook
                  • Partager sur Twitter

                  avoir mon personnage au centre et le terrain qui bouge

                  × 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