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

Auteur Sujet: Problème de position après rotation  (Lu 1949 fois)

0 Membres et 1 Invité sur ce sujet

Nanocryk

  • Invité
Problème de position après rotation
« le: Février 16, 2013, 07:58:31 pm »
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.cpp
int 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.cpp
void 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.

Nanocryk

  • Invité
Re : Problème de position après rotation
« Réponse #1 le: Février 20, 2013, 03:27:20 pm »
Personne à une idée ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de position après rotation
« Réponse #2 le: Février 20, 2013, 03:47:23 pm »
Si c'était du SFML 2, et que tu fournissais un code complet minimal, j'aurais bien testé. Mais là, ça va être difficile :-\
Laurent Gomila - SFML developer

Nanocryk

  • Invité
Re : Problème de position après rotation
« Réponse #3 le: Février 20, 2013, 03:49:44 pm »
Le problème c'est que j'ai pas encore trouvé le tuto sur l'affichage en SFML 2. Sinon je pourrais très bien faire mon jeu avec :D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de position après rotation
« Réponse #4 le: Février 20, 2013, 04:03:12 pm »
Oui je sais, pour l'instant il faut faire sans tutoriel. Mais ce n'est pas non plus impossible, il y a la doc de l'API, les exemples, le wiki, le forum.
Laurent Gomila - SFML developer

Nanocryk

  • Invité
Re : Problème de position après rotation
« Réponse #5 le: Février 20, 2013, 04:04:32 pm »
Je suis en train de regarder ça !

Vous voulez les sources complètes ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de position après rotation
« Réponse #6 le: Février 20, 2013, 04:17:43 pm »
Surtout pas.
Laurent Gomila - SFML developer