Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: nours59 le Octobre 10, 2012, 08:24:41 pm

Titre: [Résolu][SFML 2] sf::View : affichage décalé
Posté par: nours59 le Octobre 10, 2012, 08:24:41 pm
Bonjour,

Un nouveau problème avec les sf::View pour moi  :'(

j'avais jusqu'à présent déclaré le sf::View dans le Main, là où je déclarais également le RenderWindow et ma classe Layer qui contient ma carte à afficher.

J'ai décidé de passer par une classe Scene qui va s'occuper de charger ma carte, mon personnage et déplacer le tout à l'écran. Mais le problème suivant se pose:
Dès que j'applique ma sf::View au RenderWindow, j'ai un décalage de la carte, le haut gauche de celle-ci se retrouve exactement au centre de l'écran.
Si je retire l'application de la vue la carte s'affiche de nouveau correctement en haut à gauche de mon écran, le pb viendrait donc à priori de la vue mais je ne vois vraiment pas ce qui cloche...

Je vous mets un code minimal, qui reproduit le problème:

Scene.hpp:
#ifndef DEF_Scene
#define DEF_Scene

#include <SFML/Graphics.hpp>

namespace GE
{
    class Scene
    {
        public:
            Scene();
        //affichage complet de la scene
            void draw(sf::RenderWindow& screen);

        //gestion du mouvementdu personnage et de la map
            void move(int positionX, int positionY);

        private:
            sf::View m_camera;
            sf::Texture m_texture;

    };
}

#endif // DEF_Scene
 

Scene.cpp:
#include "Scene.hpp"

namespace GE
{
    Scene::Scene()
    {
        m_camera.reset(sf::FloatRect(0, 0, 800, 600));
        m_camera.setCenter(0, 0);

        m_texture.loadFromFile("persoTest.png");
    }


   void Scene::move(int positionX, int positionY)
    {
        m_camera.move(positionX, positionY);
    }

    void Scene::draw(sf::RenderWindow& screen)
    {
        sf::Sprite mySprite(m_texture);

        screen.draw(mySprite);
        screen.setView(m_camera);
    }
}
 

Main.cpp :
#include "Scene.hpp"
#include <cstdlib>

int main(int argc, char* argv[])
{
    sf::RenderWindow app(sf::VideoMode(800, 600, 32), "test");

    GE::Scene myScene;

    int posX = 0, posY = 0;

    while(app.isOpen())
    {
        sf::Event m_event;
        while(app.pollEvent(m_event))
        {
        //fermeture du programme
            if(m_event.type == sf::Event::Closed) app.close();
        //events du clavier
            if(m_event.type == sf::Event::KeyPressed)
            {
                posX = posY = 0;
                switch(m_event.key.code)
                {
                //touches directionnelles
                    case sf::Keyboard::Left:
                            posX --;
                        break;
                    case sf::Keyboard::Right:
                            posX ++;
                        break;
                    case sf::Keyboard::Up:
                        posY --;
                        break;
                    case sf::Keyboard::Down:
                        posY ++;
                        break;
                    default:
                        break;
                }
                myScene.move(posX, posY);
            }

            app.clear();
            myScene.draw(app);

            app.display();
        }
    }
    return EXIT_SUCCESS;
}
 

Voici l'image que j'utilise pour mes tests (faite à la main avec amour  ;D ):
(http://img11.hostingpics.net/thumbs/mini_716038persoTest.png) (http://www.hostingpics.net/viewer.php?id=716038persoTest.png)

Je pensais que le pb venait au départ du RenderTexture que j'utilise (je suis malheureusement victime de la malédiction des amd  ;D ) mais tout fonctionne correctement dès que je mets en commentaires le setView de la dernière méthode, ou que je gère la caméra directement dans le Main

Merci d'avance à qui pourra m'aider  ;)
Titre: Re : [SFML 2] sf::View : affichage décalé
Posté par: nours59 le Octobre 13, 2012, 05:38:18 pm
Up ^^

- Je viens de faire un test en changeant le RenderTexture par un affichage direct par un sf::Sprite, le décalage se fait toujours.
- J'ai également testé les coordonnées du sf::View, qui sont correctes; cela ne viendrait donc pas de là?
- Si je remplace le reset par setSize et setCenter j'obtiens le même décalage.

- J'ai remarqué aussi que si je ne force pas le setCenter dans le constructeur (je le mets en commentaires), l'affichage se fait correctement mais les coordonnées du centre sont faussées.

Si vous avez besoin du code complet demandez je créerai une archive zip ^^
Titre: Re : [SFML 2] sf::View : affichage décalé
Posté par: Laurent le Octobre 13, 2012, 05:46:31 pm
Si tu veux de l'aide rapide et efficace, il faut que tu extraies un code complet et minimal qui reproduit le problème. Donc surtout pas une archive de ton gros projet. Juste ce qu'il faut pour recréer le problème.
Titre: Re : [SFML 2] sf::View : affichage décalé
Posté par: nours59 le Octobre 13, 2012, 06:14:04 pm
Ok je viens de modifier mon 1e message, qui reproduit exactement le bug.
Je l'ai épuré au maximum, il ne dépend plus d'aucune classe non présentée ou n'appartenant pas à SFML ou la STL.

J'espère que cela vous aidera
Titre: Re : [SFML 2] sf::View : affichage décalé
Posté par: Laurent le Octobre 13, 2012, 11:08:48 pm
Citer
Dès que j'applique ma sf::View au RenderWindow, j'ai un décalage de la carte, le haut gauche de celle-ci se retrouve exactement au centre de l'écran.
C'est exactement ce qu'il y a écrit dans ton code. m_camera.setCenter(0, 0) met le centre de la vue en (0, 0), donc tout ce qui est placé en (0, 0) est... au centre de la vue, donc de la fenêtre. Au lieu d'être dans le coin haut-gauche, comme ça l'est par défaut.
Titre: Re : [SFML 2] sf::View : affichage décalé
Posté par: nours59 le Octobre 14, 2012, 04:03:20 pm
Ca y est, j'ai finalement réussi à comprendre le fonctionnement, et j'ai réglé ma caméra en conséquence: plus de décalage de mon image, enfin!

Elle m'aura bien fait souffrir cette caméra en SFML2  ;D