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
):
Je pensais que le pb venait au départ du RenderTexture que j'utilise (je suis malheureusement victime de la malédiction des amd
) 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