Bonjour à tous.
Je suis en train de coder un jeu et j'utilise une image qui contient tous les murs.
Je recadre ensuite avec la méthode SetSubRect() puis je change le centre pour pouvoir faire faire une rotation au sprite (je ne veux pas qu'il pivote dans un coin). Et la surprise, quand je le fais tourner, il y a un petit décalage.
Voici le code :
Extrait de Application.cppint Application::run() {
// Exécution de la boucle principale
sf::Image image1, image2;
if(!image1.LoadFromFile("wall_tileset_1.png"))
return EXIT_FAILURE;
if(!image2.LoadFromFile("wall_tileset_2.png"))
return EXIT_FAILURE;
GraphicObject sprite(128, 128, image1, image2);
sprite.setPos(sf::Vector2f(0, 0));
//sprite.setOrientation(RIGHT);
sprite.setColor1(sf::Color(255, 255, 255));
//sprite.setColor2(sf::Color(255, 255, 255));
sprite.setDrawedPart(sf::IntRect(0, 0, 32, 32));
while (mWindow->IsOpened())
{
// Traitement des évènements
sf::Event Event;
while (mWindow->GetEvent(Event))
{
// Fenêtre fermée : on quitte
if (Event.Type == sf::Event::Closed)
mWindow->Close();
}
if (mWindow->GetInput().IsKeyDown(sf::Key::Up)) {
sprite.setColor2(sf::Color(255, 0, 0));
sprite.setOrientation(TOP);
}
else if (mWindow->GetInput().IsKeyDown(sf::Key::Down)) {
sprite.setColor2(sf::Color(0, 0, 255));
sprite.setOrientation(BOTTOM);
}
else if (mWindow->GetInput().IsKeyDown(sf::Key::Left)) {
sprite.setColor2(sf::Color(0, 255, 0));
sprite.setOrientation(LEFT);
}
else if (mWindow->GetInput().IsKeyDown(sf::Key::Right)) {
sprite.setColor2(sf::Color(255, 255, 0));
sprite.setOrientation(RIGHT);
}
else sprite.setColor2(sf::Color(255, 255, 255, 0));
// Efface l'écran (remplissage avec du noir)
mWindow->Clear();
sprite.draw();
// Affichage du contenu de la fenêtre à l'écran
mWindow->Display();
}
return EXIT_SUCCESS;
}
Extrait de GraphicObject.cppvoid GraphicObject::draw() {
// On actualise les informations des sprites
mSpriteLayer1.Resize(mWidth, mHeight);
mSpriteLayer2.Resize(mWidth, mHeight);
mSpriteLayer1.SetCenter(sf::Vector2f((mDrawedPart.GetWidth() / 2.f), (mDrawedPart.GetHeight() / 2.f)));
mSpriteLayer2.SetCenter(sf::Vector2f((mDrawedPart.GetWidth() / 2.f), (mDrawedPart.GetHeight() / 2.f)));
mSpriteLayer1.SetSubRect(mDrawedPart);
mSpriteLayer2.SetSubRect(mDrawedPart);
if(mRotation == LEFT) {
mSpriteLayer1.SetRotation(90);
mSpriteLayer2.SetRotation(90);
}
else if(mRotation == RIGHT) {
mSpriteLayer1.SetRotation(-90);
mSpriteLayer2.SetRotation(-90);
}
else if(mRotation == BOTTOM) {
mSpriteLayer1.SetRotation(180);
mSpriteLayer2.SetRotation(180);
}
else {
mSpriteLayer1.SetRotation(0);
mSpriteLayer2.SetRotation(0);
}
mSpriteLayer1.SetPosition(sf::Vector2f(mPos.x + (mWidth / 2.f), mPos.y + (mHeight / 2.f)));
mSpriteLayer2.SetPosition(sf::Vector2f(mPos.x + (mWidth / 2.f), mPos.y + (mHeight / 2.f)));
mSpriteLayer1.SetColor(mColor1);
mSpriteLayer2.SetColor(mColor2);
// Affichage
Application::GetInstance()->getRenderWindow()->Draw(mSpriteLayer1);
Application::GetInstance()->getRenderWindow()->Draw(mSpriteLayer2);
}
Et voila le résultat :
Comme vous pouvez le voir, il y a un décalage d'1 à 2 pixels qui sera gênant quand il y aura plusieurs sprites ...
Merci d'avance si quelqu'un trouve la solution.