Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu][SFML 2] sf::View : affichage décalé  (Lu 3425 fois)

0 Membres et 2 Invités sur ce sujet

nours59

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
[Résolu][SFML 2] sf::View : affichage décalé
« 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 ):


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  ;)
« Modifié: Octobre 14, 2012, 04:03:41 pm par nours59 »

nours59

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
Re : [SFML 2] sf::View : affichage décalé
« Réponse #1 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 ^^
« Modifié: Octobre 13, 2012, 05:45:47 pm par nours59 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2] sf::View : affichage décalé
« Réponse #2 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.
Laurent Gomila - SFML developer

nours59

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
Re : [SFML 2] sf::View : affichage décalé
« Réponse #3 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

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2] sf::View : affichage décalé
« Réponse #4 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.
Laurent Gomila - SFML developer

nours59

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
Re : [SFML 2] sf::View : affichage décalé
« Réponse #5 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

 

anything