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

Auteur Sujet: [RESOLU] Problème de cropping [SFML 2.0]  (Lu 2573 fois)

0 Membres et 1 Invité sur ce sujet

Artexflow

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
[RESOLU] Problème de cropping [SFML 2.0]
« le: Mars 21, 2013, 10:51:33 am »
Bien le bonjour à tous !

Très nouveau à SFML, je dois vous avouer que je suis déjà très satisfait :)

Bon, je suis en pleine phase d'apprentissage, donc j'espère que vous ne me trouverez pas trop idiot, mais j'ai un sacré souci. Je suis un tutoriel assez bien foutu sur Youtube d'un anglophone, et j'en suis actuellement à cette partie :

En gros il s'agit d'animer très basiquement une image en fonction des touches tapées au clavier. On a une texture en .png qu'on ajoute à un sprite. Sur cette texture figurent sur quatre lignes trois dessins d'un personnage au format 32x32 pixels.

Mon problème est simple : alors que je reproduis (enfin, je crois) scrupuleusement l'exemple donné sur le net, le résultat n'est pas le même. Je devrais, lorsque je tape la flèche de gauche, voir mon personnage "marcher" (il n'est pas encore question de le déplacer à l'écran) de profil, mais non, je reste bloqué sur un crop qui ne s'actualise pas...

Voilà le code en question :

void Moteur::boucleJeu()
{
    while (m_fenetre->isOpen()) // Boucle de jeu
    {
        enum persoDirection { Bas, Gauche, Droite, Haut }; // Bas vaut 1, Gauche vaut 2, ...
        sf::Vector2i source(1, Bas);
       
       
        sf::Texture texturePersonnage; // Charge une texture
        sf::Sprite spritePersonnage; // Charge un sprite
       
        if (!texturePersonnage.loadFromFile("texturePersonnage.png")) {
            std::cout << "Erreur : texturePersonnage ne s'est pas chargé." << std::endl;
        }
        /* On charge à partir du fichier */
       
       
        spritePersonnage.setTexture(texturePersonnage); // On charge la texture dans le sprite
       
       
        sf::Event event;
        while (m_fenetre->pollEvent(event)) {
            switch (event.type) {
                case sf::Event::Closed:
                    m_fenetre->close();
                    break;
                   
                case sf::Event::KeyPressed:
                    if (event.key.code == sf::Keyboard::Up)
                    {
                        source.y = Haut;
                    std::cout << "Haut" << std::endl;
                    }
                    else if (event.key.code == sf::Keyboard::Down)
                    {
                        source.y = Bas;
                        std::cout << "Bas" << std::endl;
                    }
                    else if (event.key.code == sf::Keyboard::Left)
                    {
                        source.y = Gauche;
                        std::cout << "Gauche" << std::endl;
                    }
                    else if (event.key.code == sf::Keyboard::Right)
                    {
                        source.y = Droite;
                        std::cout << "Droite" << std::endl;
                    }
                    break;

                default:
                    break;
            }
           

        }

        source.x++;
        if (source.x * 32 >= texturePersonnage.getSize().x) {
            source.x = 0;
        }
       
        spritePersonnage.setTextureRect(sf::IntRect(source.x * 32, source.y * 32, 32, 32));
       
       
        m_fenetre->draw(spritePersonnage); // On affiche le sprite à l'écran
        m_fenetre->display();
        m_fenetre->clear();
    }
 

Peut-être cela est-il dû au fait que j'effectue toutes les opérations dans une classe ? J'ai sûrement mal conçu quelque chose.
Le main.cpp consiste à instancier une classe "Moteur" et à appeler les différentes fonctions, ici "boucleJeu()".

Que se passe-t-il ?

Merci à tous d'avance, et bravo pour le taff dingo !

PS : A titre d'information, je suis sur Xcode 4.5.2
« Modifié: Mars 23, 2013, 08:50:09 pm par Artexflow »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème de cropping [SFML 2.0]
« Réponse #1 le: Mars 21, 2013, 11:22:08 am »
Son sf::Vector2i source n'est pas créé dans la boucle de jeu, contrairement à toi qui le recrée (et qui recharge la texture (pas bien)) à chaque frame !
Ta source est sûrement modifiée, mais uniquement pour une seule frame parmi les (minimum) 60 qui sont affichées chaque seconde, donc t'as pas le temps de le voir sans doute.
Simple logique non ? ;)

Artexflow

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : Problème de cropping [SFML 2.0]
« Réponse #2 le: Mars 21, 2013, 12:05:12 pm »
Ahaha !
Eh bien, j'avais dit que ce serait sûrement idiot... Ça l'était encore plus que ce que j'imaginais !

Bon, on va dire que petit à petit l'oiseau fait son nid... Je suis en plein apprentissage, et ce genre d'erreurs, j'en fais, j'en fais des tas ! Je me décourage pas, mais peu à peu je me demande si je suis pas un peu débile.

Bref ! Comme tu me le suggérais j'ai passé texture, sprite et vecteur en attributs de la classe, et viré le chargement de la texture de la boucle while pour le mettre dans ma méthode init(). J'ai aussi passé la phase d'incrémentation qui gère l'animation dans une fonction animPerso() pour l'ajouter aisément dans mes switch case.

Voilà à quoi ressemble Moteur.cpp maintenant :

#include "Moteur.h"

Moteur::Moteur() {
    m_fenetre = new sf::RenderWindow;
}

Moteur::~Moteur() {
    delete m_fenetre; // m_fenetre est alloué dynamiquement, on le détruit ici.
}

void Moteur::init()
{
    m_fenetre->create(sf::VideoMode(800, 600), "La fenetre");
   
    if (!m_texturePersonnage.loadFromFile("texturePersonnage.png")) {
        std::cout << "Erreur : texturePersonnage ne s'est pas chargé." << std::endl;
    }
    /* On charge du fichier */
    m_spritePersonnage.setTexture(m_texturePersonnage); // On charge la texture dans le sprite
   
    m_source.x = 1;
    m_source.y = Bas;
   
}

void Moteur::boucleJeu()
{
    while (m_fenetre->isOpen()) // Boucle de jeu
    {
        sf::Event event; // La variable event reçoit tous les événements utilisateur
        while (m_fenetre->pollEvent(event)) { // Tous les événements sont traités à la suite
            switch (event.type) {
                case sf::Event::Closed:
                    m_fenetre->close();
                    break;
                   
                case sf::Event::KeyPressed:
                    if (event.key.code == sf::Keyboard::Up)
                    {
                        m_source.y = Haut;
                        animPerso();
                    std::cout << "Haut" << std::endl;
                    }
                    else if (event.key.code == sf::Keyboard::Down)
                    {
                        m_source.y = Bas;
                        animPerso();
                        std::cout << "Bas" << std::endl;
                    }
                    else if (event.key.code == sf::Keyboard::Left)
                    {
                        m_source.y = Gauche;
                        animPerso();
                        std::cout << "Gauche" << std::endl;
                    }
                    else if (event.key.code == sf::Keyboard::Right)
                    {
                        m_source.y = Droite;
                        animPerso();
                        std::cout << "Droite" << std::endl;
                    }
                    break;

                default:
                    break;
            }
           

        }

        m_spritePersonnage.setTextureRect(sf::IntRect(m_source.x * 32, m_source.y * 32, 32, 32));
        m_fenetre->draw(m_spritePersonnage); // On affiche le sprite à l'écran
        m_fenetre->display();
        m_fenetre->clear();
    }
}

void Moteur::animPerso() {

    m_source.x++;
    if (m_source.x * 32 >= m_texturePersonnage.getSize().x) {
        m_source.x = 0;
    }
}

Par contre tu disais que je chargeais mal la texture ? Tu peux m'en dire plus ?

Vous entendrez reparler de moi et de mes questions nulles, je pense. A moins que je réfléchisse un peu mieux à partir de maintenant ?

Merci beaucoup !

« Modifié: Mars 21, 2013, 12:11:00 pm par Artexflow »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème de cropping [SFML 2.0]
« Réponse #3 le: Mars 21, 2013, 08:13:44 pm »
Non tu la charges correctement, je voulais juste dire que c'était pas bien (= inutile et lourd) de charger la même texture à chaque frame mais ma formulation n'était pas terrible en effet. :p

 

anything