Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon scrolling ne marche pas :'(

Le perso se bloque au milieu

Sujet résolu
    4 août 2007 à 16:33:00

    Salut, dans l'optique d'un jeu 2D en C/C++, j'essaie de réaliser un scrolling (seulement horizontal pour l'instant). Mais j'ai un problème : mon personnage se bloque au milieu de l'écran :

    Image utilisateur

    Si j'essaie d'avancer vers la droite, le personnage piétine sur place, et si après ça j'essaie de revenir à gauche, il piétine un peu sur place, puis avance vers la gauche, donc je crois que c'est le décor qui ne bouge pas correctement.

    Voici les codes sources :

    - Le code pour afficher la carte :
    void Carte::afficher(SDL_Surface *ecran)
    {
        for (int y = 0; y < HAUTEUR_NIVEAU / TAILLE_BLOC; y++)
        {
            for (int x = 0; x < LARGEUR_NIVEAU / TAILLE_BLOC; x++)
            {
                SDL_Rect tile = {x * TAILLE_BLOC, y * TAILLE_BLOC, TAILLE_BLOC, TAILLE_BLOC};
                if(check_collision(camera, tile))
                    appliquer_surface (tile.x - camera.x, tile.y, m_sprite, ecran, &m_clip[m_carte[x][y]]);
            }
        }
    }
     


    - Le code pour afficher le héros :
    void Heros::afficher(SDL_Surface* ecran)
    {
        if (m_vitesse < 0)
        {
            m_sens = GAUCHE;
            if (m_sol)
                changeStance(RUN);
        }

        else if (m_vitesse > 0)
        {
            m_sens = DROITE;
            if (m_sol)
                changeStance(RUN);
        }

        if (m_vitesse == 0 && getStance() == RUN)
            changeStance(WAIT);

        m_position.x += m_vitesse;

        if (m_position.x < 0)
            m_position.x = 0;

        else if (m_position.x > LARGEUR_ECRAN - m_largeur)
            m_position.x = LARGEUR_ECRAN - m_largeur;

        if (m_position.y > HAUTEUR_ECRAN - m_hauteur)
        {
            m_position.y = HAUTEUR_ECRAN - m_hauteur;
            m_sol = true;
            changeStance(WAIT);
            saut.stop();
        }

        else if (m_position.y < 0)
            m_position.y = 0;

        set_camera();

        appliquer_surface(m_position.x - camera.x, m_position.y, m_sprite, ecran, &m_clip[m_sens][m_stance][m_frame]);

     
    }


    - La fonction set_camera() :
    void Heros::set_camera()
    {
        //Center the camera over the dot
        camera.x = ( m_position.x + (m_largeur / 2) ) - (LARGEUR_ECRAN / 2);

        //Keep the camera in bounds.
        if( camera.x < 0 )
            camera.x = 0;

        if( camera.y < 0 )
            camera.y = 0;

        if( camera.x > LARGEUR_NIVEAU - camera.w )
            camera.x = LARGEUR_NIVEAU - camera.w;

        if( camera.y > HAUTEUR_NIVEAU - camera.h )
            camera.y = HAUTEUR_NIVEAU - camera.h;
    }

     


    - Et la fonction check_collision() :
    bool check_collision( SDL_Rect &A, SDL_Rect &B )
    {
        //The sides of the rectangles
        int leftA, leftB;
        int rightA, rightB;
        int topA, topB;
        int bottomA, bottomB;

        //Calculate the sides of rect A
        leftA = A.x;
        rightA = A.x + A.w;
        topA = A.y;
        bottomA = A.y + A.h;

        //Calculate the sides of rect B
        leftB = B.x;
        rightB = B.x + B.w;
        topB = B.y;
        bottomB = B.y + B.h;

        //If any of the sides from A are outside of B
        if( bottomA <= topB )
            return false;

        if( topA >= bottomB )
            return false;

        if( rightA <= leftB )
            return false;

        if( leftA >= rightB )
            return false;

        //If none of the sides from A are outside B
        return true;
    }
     



    Merci de m'aider à trouver le problème &#58;&#41;

    PS : Je précise que je me suis inspiré de ça pour mon scrolling (notament pour ce qui touche à la camera et à la collision).

    EDIT : Après moultes essais, c'est bien le décor qui refuse de bouger, et je ne comprends pas pourquoi.

    EDIT 2 : Après d'autres essais, je suis presque sur que c'est parce que camera.x vaut 0 dans le fichier graphisme.cpp, alros qu'il à sa valeur normale dans personnage.cpp. C'est étrange, car je définie la caméra comme :
    static SDL_Rect camera = {0, 0, LARGEUR_ECRAN, HAUTEUR_ECRAN};
    dans graphisme.h</span>
    • Partager sur Facebook
    • Partager sur Twitter
      5 août 2007 à 3:35:14

      Et si tu nous montrais comment tu gère les déplacements? Ainsi que quelques classes? parce qu'avec que des fonction pour afficher ça nous aides pas fort fort.
      • Partager sur Facebook
      • Partager sur Twitter
        5 août 2007 à 9:45:27

        Ben J'ai deux classes pour l'instant, la classe "Heros" qui gère le héros, et la classe "Carte" qui gère la carte.

        Pour le déplacement du héros, je mets ça dans un while(SDL_PollEvent...){...} :

        void Heros::recupEvent(SDL_Event event)
        {
            if(event.type == SDL_KEYDOWN)
            {
                switch(event.key.keysym.sym)
                {
                    case SDLK_RIGHT: m_vitesse += (VITESSE_PERSO / FPS); break;
                    case SDLK_LEFT: m_vitesse -= (VITESSE_PERSO / FPS); break;
                    case SDLK_KP2:
                    if (m_sol)
                    {
                        changeStance(JUMP);
                        saut.start();
                        m_sol = false;
                    }
                        break;
                    case SDLK_KP1: changeStance(ATTACK); break;
                    case SDLK_KP3: m_arme = (m_arme == RANGEE)?(SORTIE):(RANGEE); changeStance(getStance()); break;
                    default: break;
                }
            }

            else if(event.type == SDL_KEYUP)
            {
                switch(event.key.keysym.sym)
                {
                    case SDLK_RIGHT: m_vitesse -= (VITESSE_PERSO / FPS); break;
                    case SDLK_LEFT: m_vitesse += (VITESSE_PERSO/ FPS); break;
                    default: break;
                }
            }
        }


        Ensuite dans la fonction afficher() de la classe héros, je mets à jour la position du héros avec : m_position.x += m_vitesse;


        Ensuite pour la carte, elle est stockée dans un fichier, sous la forme d'une suite de chiffre (00 01...) que je lis avec ça :

        bool Carte::setMap()
        {
            //The tile offsets
            int x = 0, y = 0;

            //Open the map
            std::ifstream map( "carte.map" );

            //If the map couldn't be loaded
            if( map == NULL )
                return false;

            //Initialize the tiles
            for( int t = 0; t < (LARGEUR_NIVEAU / TAILLE_BLOC) * (HAUTEUR_NIVEAU / TAILLE_BLOC); t++ )
            {
                //Determines what kind of tile will be made
                int tuileType = -1;

                //Read tile from map file
                map >> tuileType;

                //If the was a problem in reading the map
                if( map.fail() == true )
                {
                    //Stop loading map
                    map.close();
                    return false;
                }

                //If the number is a valid tile number
                if( ( tuileType >= 0 ) && ( tuileType < TOTAL_CARTE ) )
                    m_carte[x][y] = tuileType;

                //If we don't recognize the tile type
                else
                {
                    //Stop loading map
                    map.close();
                    return false;
                }

                //Move to next tile spot
                x += 1;

                //If we've gone too far
                if( x >= LARGEUR_NIVEAU / TAILLE_BLOC)
                {
                    //Move back
                    x = 0;

                    //Move to the next row
                    y += 1;
                }
            }

            //Close the file
            map.close();

            //If the map was loaded fine
            return true;
        }


        • Partager sur Facebook
        • Partager sur Twitter
          6 août 2007 à 19:19:14

          Citation : bogoss

          EDIT 2 : Après d'autres essais, je suis presque sur que c'est parce que camera.x vaut 0 dans le fichier graphisme.cpp, alros qu'il à sa valeur normale dans personnage.cpp. C'est étrange, car je définie la caméra comme :

          static SDL_Rect camera = {0, 0, LARGEUR_ECRAN, HAUTEUR_ECRAN};

          dans graphisme.h</span>



          Tu peux toujours essayer de débugger et de voir ou ton code, qui devrait fonctionner, ne fonctionne pas.
          • Partager sur Facebook
          • Partager sur Twitter
            7 août 2007 à 10:55:21

            C'est bon, j'ai réussis à contourner le problème.
            • Partager sur Facebook
            • Partager sur Twitter

            Mon scrolling ne marche pas :'(

            × 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