Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML] Déplacement sur une carte

Comme Sokoban, mais un peu différent....

    6 mai 2008 à 21:23:29

    Bonjour à tous et à toutes,
    J'aimerais savoir quelle est la meilleur manière de se déplacer sur une carte, comme Sokoban.
    Cependant, pour un affichage "fluide" je pense qu'il vaut mieux que le personnage se déplace de 0.1 case à 0.1 case au lieu de 1 à 1 !
    Je ne sais pas si c'est le meilleur moyen :( ...

    De plus, j'ai une map du genre Sokoban, mais un différent : il s'agit d'un vector multi-dimensionnel qui contient par exemple 20 données avec l'emplacement des objets sur la map (mur, caisse, ...).

    J'ai essayé de faire tout seul ^^ , mais cela ne me fait pas un bon résultat :( ...
    Le personnage, en plus de sortir un peu de l'écran droite ou de ne pas pouvoir se rapprocher de l'écran gauche, peut traverser les murs et tout ca....
    Je ne dois certainement pas bien gérer les floats et compagnie...
    Je vais donner seulement les parties de code qui sont concernés.

    En gros, le personnage possède des coordonnées (des floats) et avant d'autoriser le personnage à se déplacer de 0.1 cases q'une direction quelconque, on vérifie s'il le peut...

    Personnage.cpp
    void Personnage::moveDirection(int direction)
    {
    
        App *app = App::getApp();
        int place;
        
        // on teste la direction
        switch(direction)
        {
            case HAUT:
                place = app->getPlace(m_coords.x, Maths::Round(m_coords.y-0.1, 0.1));
                if(place == -1 || place != VIDE)
                    return;
                break;
    
            case BAS:
                place = app->getPlace(m_coords.x, Maths::Round(m_coords.y+0.1, 0.1));
                if(place == -1 || place != VIDE)
                    return;
                break;
    
            case GAUCHE:
                place = app->getPlace(Maths::Round(m_coords.x-0.1, 0.1), m_coords.y);
                if(place == -1 || place != VIDE)
                    return;
                break;
    
            case DROITE:
                place = app->getPlace(Maths::Round(m_coords.x+0.1, 0.1), m_coords.y);
                if(place == -1 || place != VIDE)
                    return;
                break;
        }
    
        m_movement = direction;
        moveDirection();
    }
    

    (cette méthode est appelée quand l'utilisateur utilise les touches du clavier)

    App.cpp (classe singleton) :
    int App::getPlace(float x, float y) const
    {
        cout << m_width_blocks << endl;
        // vérification des paramètres
        if(x >= (float)(m_map.size()) || x < (float)-0.1)
            return -1;
        else if(y >= (float)(m_map[x].size()) || y < (float)-0.1)
            return -1;
        else
            return m_map[x][y];
    }
    


    Merci d'avance pour toutes les réponses qui me seront données :D !
    (je trouve que la SFML est bien !!! ;) )
    • Partager sur Facebook
    • Partager sur Twitter

    [SFML] Déplacement sur une carte

    × 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