Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Artexflow

Pages: [1]
1
@ Hypnéos :

Ola, non, t'en as pas fait trop, au contraire, plus, j'en veux plus toujours plus !
Grand merci pour tes excellentes explications. J'ai d'ores et déjà implémenté ta suggestion dans mon code, et dès que je comprendrai mieux ce qu'il se passe, j'essaierai d'implémenter la même technique pour l'animation des sprites (qui ne vont évidemment pas à la même "vitesse" que mon personnage).

@ christophedlr

Tes conseils sont retenus. Envoie ton exemple, comme dit plus haut, plus j'apprends mieux c'est (et plus ça me fait plaisir) !

Merci à vous deux, bonne journée ;)

2
Bien le bonjour à tous !

Voilà, bon je culpabilise un peu de poster encore une question idiote, mais sincèrement je ne sais pas ce qu'il se passe !

J'ai un sprite que j'anime et déplace en utilisant les touches du clavier. Pour garantir la vitesse de ce sprite, j'ai suivi tout bêtement une méthode trouvée sur le net, simplement il arrive que mon personnage ralentisse (très fortement) pendant quelques secondes, avant de reprendre sa vitesse normale.
Je me demande donc ce que j'ai fait de mal !

Comme du code vaut mieux qu'un long discours, je vous recopie les parties en question.

Moteur.cpp où la classe Personnage est instanciée et où les touches du clavier sont récupérées :

#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");
}

void Moteur::boucleJeu()
{
    Personnage Personnage;
   
    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;
                default:
                    break;
            }
        }
       
        clavierDetect(Personnage);
       
        m_fenetre->draw(Personnage.getSprite()); // On affiche le sprite à l'écran
        m_fenetre->display();
        m_fenetre->clear();
    }
}


void Moteur::clavierDetect(Personnage & PersonnageADeplacer) {
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    {
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
            PersonnageADeplacer.animPerso(1, -1, Droite);
        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
            PersonnageADeplacer.animPerso(-1, -1, Gauche);
        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
            PersonnageADeplacer.animPerso(0, 1, Bas);
        else
            PersonnageADeplacer.animPerso(0, -1, Haut);
    }
   
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    {
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
            PersonnageADeplacer.animPerso(1, 1, Droite);
        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
            PersonnageADeplacer.animPerso(-1, 1, Gauche);
        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            PersonnageADeplacer.animPerso(0, -1, Haut);  
        else
            PersonnageADeplacer.animPerso(0, 1, Bas);
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
            PersonnageADeplacer.animPerso(1, 0, Droite);
        else
            PersonnageADeplacer.animPerso(-1, 0, Gauche);
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
            PersonnageADeplacer.animPerso(-1, 0, Gauche);
        else
            PersonnageADeplacer.animPerso(1, 0, Droite);
    }
}

Et enfin Personnage.cpp (qui contient donc la fameuse méthode "animPerso()"

#include "Personnage.h"

Personnage::Personnage() : m_nom("John Malkovitch"), m_spritePersonnage(), m_frameCounter(0), m_frameSpeed(500), m_frameSwitch(100), m_frameClock(), m_frameUpdate(true), m_mvtClock(), m_mvtCounter(0), m_mvtSpeed(10000), m_mvtSwitch(10), m_mvtUpdate(true)
{
    if (!m_texturePersonnage.loadFromFile("texturePersonnage.png")) {
        std::cout << "Erreur : texturePersonnage ne s'est pas chargé." << std::endl;
    }
    /* On charge du fichier, l'instruction sf::IntRect permet de découper à la volée dans notre texture celle qui nous intéresse */
    m_spritePersonnage.setTexture(m_texturePersonnage); // On charge la texture dans le sprite
   
    m_source.x = 1;
    m_source.y = Bas;
}



void Personnage::animPerso(short x, short y, short dir) {
   
    m_source.y = dir;
   
    m_mvtCounter = (m_mvtUpdate) ? m_mvtCounter + m_mvtSpeed * m_mvtClock.restart().asSeconds() : 0;
    if (m_mvtCounter >= m_mvtSwitch) {
        m_mvtCounter = 0;
        m_spritePersonnage.move(x, y);
    }
   
    m_frameCounter = (m_frameUpdate) ? m_frameCounter + m_frameSpeed * m_frameClock.restart().asSeconds() : 0;
    if (m_frameCounter >= m_frameSwitch) {
        m_frameCounter = 0;
        m_source.x++;
        if (m_source.x * 32 >= m_texturePersonnage.getSize().x) {
            m_source.x = 0;
        }
    }
   
}

sf::Sprite Personnage::getSprite()
{
    m_spritePersonnage.setTextureRect(sf::IntRect(m_source.x * 32, m_source.y * 32, 32, 32));
    return m_spritePersonnage;
}

En me relisant j'ai l'impression que ce que je raconte est incompréhensible. N'hésitez pas à me le dire ! Je préciserai !

Bon et une fois de plus désolé pour la question pas intelligent, promis, promis avec le temps j'en poserai moins.

Et merci d'avance !

3
Graphique / Re : Problème de cropping [SFML 2.0]
« 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 !


4
Graphique / [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

Pages: [1]