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 - Mysterystem

Pages: [1]
1
Graphique / Re : 2 threads dans une classe
« le: Octobre 31, 2013, 04:26:20 pm »
Hello ! J'ai réussi au final, j'ai trouvé un moyen d'avoir un code qui fonctionne et tout, c'est parfait maintenant ^^
Merci de m'avoir mené sur le droit chemin ;)

Le code pour ceux que ça intéresse :
void Character::update(sf::Time elapsed){
    m_currentTime += elapsed;

    sf::IntRect downBreath(sf::Vector2i(32, 0), sf::Vector2i(32, 64));

    sf::IntRect frame1(sf::Vector2i(0, 0), sf::Vector2i(32, 64));
    sf::IntRect frame2(sf::Vector2i(64, 0), sf::Vector2i(48, 64));
    sf::IntRect frame3(sf::Vector2i(128, 0), sf::Vector2i(48, 64));

    if (m_currentTime >= sf::milliseconds(500)){
        m_currentTime = sf::Time::Zero;

        if (m_isWalking == false){
            //std::cout << "BREATH" << std::endl;
            m_idFrame[0]++;

            if(m_idFrame[0] == 2)
            m_idFrame[0] = 0;

            if (m_idFrame[0] == 0)
                m_currentFrame = frame1;
            else if (m_idFrame[0] == 1)
                m_currentFrame = downBreath;
        }

        if (m_isWalking){
            //std::cout << "WALKING" << std::endl;

            if(m_idFrame[1] == 3)
                m_idFrame[1] = 0;

            if (m_idFrame[1] == 0)
                m_currentFrame = frame2;
            else if (m_idFrame[1] == 1)
                m_currentFrame = frame3;
            else
                m_currentFrame = frame1;

            m_idFrame[1]++;
        }
    }

    std::cout << "ID : " << m_idFrame[0] << std::endl;

    m_sprite.setTextureRect(m_currentFrame);
}

2
Graphique / Re : 2 threads dans une classe
« le: Octobre 07, 2013, 07:48:01 pm »
Je savais que t'allais me répondre ça ^^

Nan je veux comprendre mais je pige rien car je sais pas pourquoi on utilise pas les threads et pourquoi ma solution marche pas, enfin j'ai pas l'impression que j'aboutirais quelque part avec ce que je code et j'ai pas très envie de copier-coller les codes qu'il y a dans le tuto...

3
Graphique / Re : 2 threads dans une classe
« le: Octobre 07, 2013, 04:44:16 am »
Bah pour être plus précis les frames n'apparaissent pas. Ils changent bien de texture dans Character mais on ne voit pas le changement. Et j'ai aucune idée de ce que je code, ne sachant pas vraiment où aller à partir de ce que j'ai car je l'aurais pas gérer comme ça le changement de frame (je l'aurais fait par thread personnellement) et donc du coup bah j'essaye de faire comme le code du tuto en le arrangeant à ma sauce, mais sinon voilà.

Sinon dit moi ce qui n'a pas de sens dans mon code.

Citer
Et tu remets m_currentTime à zéro à chaque update
Dans le tuto il le remettait tout le temps à zéro aussi.

Citer
dans ce code on ne voit pas où est calculé frameTime
J'avais commencé mais j'ai abandonné car au final je comprenais pas pourquoi utiliser un timer alors qu'une limite avec setFrameLimit(30) devrait faire afficher mes textures. Je comprends pas pourquoi tu disais
Citer
tu peux juste laisser le reste de ton programme tourner
alors que si rien ne l'arrête quelques millisecondes bah mes textures n'apparaissent pas... J'ai mal compris un truc quelque part ou bien ?

4
Graphique / Re : 2 threads dans une classe
« le: Octobre 06, 2013, 06:17:03 pm »
Hello !

Alors après de nombreux tests j'ai pas réussi à avoir ce que je voulais, les frames n'apparaissent pas.
Donc du coup j'ai essayé avec un timer mais pas vraiment réussi à le faire non plus.

Merci d'avance !

Character.cpp
#include "Character.h"

Character::Character(): m_health(100), m_mana(50), m_class(WARRIOR), m_XperiencePoints(0), m_score(0), m_healthMAX(100), m_manaMAX(50), m_XperiencePointsMAX(150), m_currentFrame(sf::Vector2i(0, 0), sf::Vector2i(32, 64)), m_isWalking(false){
    /* All is initialised */

    if(!m_texture_sprite.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load character texture !" << std::endl;

    m_sprite.setTexture(m_texture_sprite);
    m_sprite.setTextureRect(m_currentFrame);
}

Character::~Character(){ /* Nothing */ }

void Character::normalize(){
    m_health = m_healthMAX;
    m_mana = m_manaMAX;
    m_XperiencePoints = 0;
    m_score = 0;
}

//Animations
void Character::update(sf::Time elapsed){
    m_currentTime += elapsed;

    if (m_currentTime >= m_frameTime){


        sf::IntRect downBreath(sf::Vector2i(32, 0), sf::Vector2i(32, 64));

        sf::IntRect frame1(sf::Vector2i(0, 0), sf::Vector2i(32, 64));
        sf::IntRect frame2(sf::Vector2i(64, 0), sf::Vector2i(48, 64));
        sf::IntRect frame3(sf::Vector2i(128, 0), sf::Vector2i(48, 64));

        if (m_isWalking == false){
            std::cout << "BREATH" << std::endl;
            m_frameTime = sf::microseconds(500);

            if (m_currentFrame == frame1)
                m_currentFrame = downBreath;
            else
                m_currentFrame = frame1;
        }

        if (m_isWalking){
            std::cout << "WALKING" << std::endl;
            m_frameTime = sf::microseconds(50);

            if (m_currentFrame == frame1)
                m_currentFrame = frame2;
            else if (m_currentFrame == frame2)
                m_currentFrame = frame3;
            else if (m_currentFrame == frame3)
                m_currentFrame = frame1;
        }

        m_currentTime = sf::microseconds(m_currentTime.asMicroseconds() % m_frameTime.asMicroseconds());
    }

    m_sprite.setTextureRect(m_currentFrame);
    m_currentTime = sf::Time::Zero;
}


//Getters and Setters
void Character::setHealth(int health){
    if(health <= m_healthMAX)
        m_health = health;
}

void Character::setMana(int mana){
    if(mana <= m_manaMAX)
       m_mana  = mana;
}
void Character::setXP(int xp){
    if(xp <= m_XperiencePointsMAX)
            m_XperiencePoints = xp;
}

void Character::setClass(int Nclass){ m_class = Nclass; }
void Character::setScore(int score){ m_score = score; }

void Character::enableWalking_A(bool then){ m_isWalking = then; }

void Character::setPosition(int x, int y){
    m_sprite.setPosition(x, y);
//    m_weapon.setPosition(m_sprite.getPosition().x + 40, m_sprite.getPosition().y + 38);
//    m_armor2.setPosition(x, y);
}

void Character::move(int x, int y){
    m_isWalking = true;
    m_sprite.move(x, y);
//    m_weapon.setPosition(m_sprite.getPosition().x + 40, m_sprite.getPosition().y + 38);
//    m_armor2.amove(x, y);
}

int Character::getHealth(){ return m_health; }
int Character::getMana(){ return m_mana; }
int Character::getXP(){ return m_XperiencePoints; }
int Character::getClass(){ return m_class; }
int Character::getScore(){ return m_score; }

int Character::getPositionX(){ return m_sprite.getPosition().x; }
int Character::getPositionY(){ return m_sprite.getPosition().y; }

//Adders and Removers
void Character::addHealth(int add_health){
    int resultADD;

    resultADD = add_health + m_health;

    if(resultADD <= m_healthMAX || resultADD > 0)
        m_health += add_health;
}

void Character::addMana(int add_mana){
    int resultADD;

    resultADD = add_mana + m_mana;

    if(resultADD <= m_manaMAX || resultADD > 0)
        m_mana += add_mana;
}

void Character::addXP(int add_xp){
    int resultADD;

    resultADD = add_xp + m_XperiencePoints;

    if(resultADD <= m_XperiencePointsMAX || resultADD > 0) //We don't loose XP beacause you try and retry and you learn from your mistakes
        m_XperiencePoints += add_xp;
}

void Character::addScore(int add_score){
    int resultADD;

    resultADD = add_score + m_score;

    if(resultADD > 0)
        m_score += add_score;
}
 

Character.h
#ifndef CHARACTER_H_INCLUDED
#define CHARACTER_H_INCLUDED

#include <iostream>
#include <SFML/Graphics.hpp>

#include "Weapon.h"
#include "Armor.h"

class Character : public sf::Drawable{ //NAME : Dogwer :p
    public:
        Character();
        ~Character();

        void normalize();

        //Animations
        void update(sf::Time elapsed);

        //Enum for all
        enum p_class{WARRIOR, WIZARD, ARCHER};

        //Getters and Setters
        void setHealth(int health);
        void setMana(int mana);
        void setXP(int xp);
        void setClass(int Nclass);
        void setScore(int score);

        void enableWalking_A(bool then);

        void setPosition(int x, int y);
        void move(int x, int y);

        int getHealth();
        int getMana();
        int getXP();
        int getClass();
        int getScore();

        int getPositionX();
        int getPositionY();

        //Adders and Removers
        //-- To remove, add with the inverse
        void addHealth(int add_health);
        void addMana(int add_mana);
        void addXP(int add_xp);
        void addScore(int add_score);

    private:
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const{
            target.draw(m_sprite, states);
        }

        int m_health, m_mana, m_class, m_XperiencePoints, m_score;
        int m_healthMAX, m_manaMAX, m_XperiencePointsMAX;

        bool m_isWalking;

        sf::Texture m_texture_sprite;
        sf::Sprite m_sprite;

        sf::IntRect m_currentFrame;
        sf::Time m_currentTime, m_frameTime;

//        Weapon m_weapon;
//        Armor m_armor2;
};

#endif // CHARACTER_H_INCLUDED
 

scene.cpp
#include "Game.h"

Game::Game(sf::RenderWindow &screen){
    m_character.setPosition(20, screen.getSize().y - 200);

    if(!m_texture_tileset.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load tileset !" << std::endl;

    if(!m_texture_background.loadFromFile("resources\\2D\\background.png"))
        std::cout << "Can't load background image !" << std::endl;

    m_sprite_background.setTexture(m_texture_background);
    m_sprite_background.setScale(0.653, 0.6357);
}

Game::~Game(){ /* Nothing */ }

void Game::render(sf::RenderWindow &screen){
    bool isPaused;

    sf::View camera;
    sf::View playground, shop;

    PauseScreen pause_screen(screen);

    playground = screen.getDefaultView();

//    playground.setViewport(sf::FloatRect(0, -0.9f, 2.05f, 2.05f));
    playground.setCenter(m_character.getPositionX() + 230, m_character.getPositionY() - 120);
    playground.setSize(500, 500);

    int clampX = (playground.getSize().x / 2), clampXMax = screen.getSize().x - (playground.getSize().x / 2);
    sf::Event events;

//    sf::Time frameTime, elapsedTime, actualTime;
//    sf::Clock clock;

    while(screen.isOpen()){
        elapsedTime = clock.restart();

        while(screen.pollEvent(events)){
            if(events.type == sf::Event::Closed)
                screen.close();

            if (events.type == sf::Event::LostFocus)
                isPaused = true;

            if(events.type == sf::Event::KeyPressed){
                switch(events.key.code){
                    case sf::Keyboard::Escape:
                        screen.close();
                        break;

                    case sf::Keyboard::Up:
                        //NOTHING
                        break;

                    case sf::Keyboard::Down:
                        //INTERACTION
                        break;

                    case sf::Keyboard::X:
                        //ATTACK
                        break;
                }
            }
        }

        if (!isPaused){
            m_character.enableWalking_A(false);
            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
                m_character.move(-5, 0);

                if(m_character.getPositionX() < clampXMax)
                    playground.move(-5, 0);

            } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
                m_character.move(5, 0);

                if(m_character.getPositionX() > clampX)
                    playground.move(5, 0);
            }
        }

        screen.clear(sf::Color::Blue);
        m_character.update(frameTime);
        screen.draw(m_sprite_background);

//        std::cout << "X : " << playground.getCenter().x << std::endl << "Y : " << playground.getCenter().y << std::endl << std::endl;

        if(m_character.getPositionX() < 0)
            m_character.setPosition(0, screen.getSize().y - 200);
        else if(m_character.getPositionX() + 32 > screen.getSize().x)
            m_character.setPosition(screen.getSize().x - 32, screen.getSize().y - 200);

        if(playground.getCenter().x < clampX)
            playground.setCenter(clampX, playground.getCenter().y);
        if(playground.getCenter().x > clampXMax)
            playground.setCenter(clampXMax, playground.getCenter().y);

        screen.draw(m_character);

        screen.setView(playground);

        if (isPaused){
            screen.setView(screen.getDefaultView());
            screen.draw(pause_screen);

            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
                isPaused = false;
        }

        screen.display();

//        actualTime = clock.getElapsedTime();
//        if (actualTime - elapsedTime > 50)

    }
}
 

5
Graphique / Re : 2 threads dans une classe
« le: Septembre 28, 2013, 10:28:14 am »
J'ai vu le tuto pour animer des sprites ! Mais je comprends pas, comment faire afficher les sprites si il n'y a pas de sf::sleep() ? Les frames d'animation vont pas passer à grande vitesse sans qu'on ne remarque rien ?

6
Graphique / 2 threads dans une classe
« le: Septembre 27, 2013, 08:16:50 pm »
Bonjour à tous !

Alors voilà mon problème : je veux gérer l'animation de la marche de mon personnage ainsi que l'animation de respiration (au repos). Le problème c'est qu'en gérant 2 threads séparés ces animations, l'animation de déplacement est en retard par rapport au moment où l'on appuie sur la touche. Et quoi que ce soit la méthode par laquelle je passe, ça ne fonctionne pas !

Sur ce, merci d'avance pour vos réponses !

Les codes que je mets ci-dessous ne sont pas complet, je mets que la partie concernée

Character.cpp
#include "Character.h"

Character::Character(): m_thread_breath(&Character::a_breath, this), m_thread_walkAnimation(&Character::a_walkAnimation, this),
    m_health(100), m_mana(50), m_class(WARRIOR), m_XperiencePoints(0), m_score(0), m_healthMAX(100), m_manaMAX(50), m_XperiencePointsMAX(150), m_cutShape(sf::Vector2i(0, 0), sf::Vector2i(32, 64)), p_isWalking(false){
    /* All is initialised */

    if(!m_texture_sprite.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load character texture !" << std::endl;

    m_sprite.setTexture(m_texture_sprite);
    m_sprite.setTextureRect(m_cutShape);

    t_breath();
}

Character::~Character(){ /* Nothing */ }

//Animations
void Character::a_breath(){
    sf::IntRect upBreath(sf::Vector2i(0, 0), sf::Vector2i(32, 64));
    sf::IntRect downBreath(sf::Vector2i(32, 0), sf::Vector2i(32, 64));

    while(true){
        std::cout << "LOOP2" << std::endl;
        m_sprite.setTextureRect(upBreath);
        sf::sleep(sf::milliseconds(500));

        m_sprite.setTextureRect(downBreath);
        sf::sleep(sf::milliseconds(500));
    }
}

void Character::a_walkAnimation(){
    sf::IntRect frame2(sf::Vector2i(64, 0), sf::Vector2i(48, 64));
    sf::IntRect frame3(sf::Vector2i(128, 0), sf::Vector2i(48, 64));

    int speed = 50;

    if (p_isWalking){
        std::cout << "LOOP" << std::endl;

        m_sprite.setTextureRect(m_cutShape);
        sf::sleep(sf::milliseconds(speed));

        m_sprite.setTextureRect(frame2);
        sf::sleep(sf::milliseconds(speed));

        m_sprite.setTextureRect(frame3);
        sf::sleep(sf::milliseconds(speed));

        m_sprite.setTextureRect(m_cutShape);
        sf::sleep(sf::milliseconds(speed));
    }
}

void Character::t_breath(){ m_thread_breath.launch(); }
void Character::t_walkAnimation(){ m_thread_walkAnimation.launch(); }
 

Character.cpp
#ifndef CHARACTER_H_INCLUDED
#define CHARACTER_H_INCLUDED

#include <iostream>
#include <SFML/Graphics.hpp>

class Character : public sf::Drawable{
    public:
        Character();
        ~Character();

        //Animation launchers
        void t_breath();
        void t_walkAnimation();

        //Variables
        bool p_isWalking;

    private:
        //Animations
        void a_breath();
        void a_walkAnimation();

        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const{
            target.draw(m_sprite, states);
        }

        int m_health, m_mana, m_class, m_XperiencePoints, m_score;
        int m_healthMAX, m_manaMAX, m_XperiencePointsMAX;

        sf::Texture m_texture_sprite;
        sf::Sprite m_sprite;

        sf::IntRect m_cutShape;

        sf::Thread m_thread_breath, m_thread_walkAnimation;
};

#endif // CHARACTER_H_INCLUDED
 

Game.cpp (là où se déroule toute la scène)
#include "Game.h"

Game::Game(sf::RenderWindow &screen){
    m_character.setPosition(20, screen.getSize().y - 200);

    if(!m_texture_tileset.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load tileset !" << std::endl;

    if(!m_texture_background.loadFromFile("resources\\2D\\background.png"))
        std::cout << "Can't load background image !" << std::endl;

    m_sprite_background.setTexture(m_texture_background);
    m_sprite_background.setScale(0.653, 0.6357);
}

Game::~Game(){ /* Nothing */ }

void Game::render(sf::RenderWindow &screen){
    bool isPaused;

    sf::View camera;
    sf::View playground, shop;

    PauseScreen pause_screen(screen);

    playground = screen.getDefaultView();

//    playground.setViewport(sf::FloatRect(0, -0.9f, 2.05f, 2.05f));
    playground.setCenter(m_character.getPositionX() + 230, m_character.getPositionY() - 120);
    playground.setSize(500, 500);

    int clampX = (playground.getSize().x / 2), clampXMax = screen.getSize().x - (playground.getSize().x / 2);
    sf::Event events;

    while(screen.isOpen()){
        while(screen.pollEvent(events)){
            if(events.type == sf::Event::Closed)
                screen.close();

            if (events.type == sf::Event::LostFocus)
                isPaused = true;

            if(events.type == sf::Event::KeyPressed){
                switch(events.key.code){
                    case sf::Keyboard::Escape:
                        screen.close();
                        break;

                    case sf::Keyboard::Up:
                        //NOTHING
                        break;

                    case sf::Keyboard::Down:
                        //INTERACTION
                        break;

                    case sf::Keyboard::X:
                        //ATTACK
                        break;
                }
            }
        }

        screen.clear(sf::Color::Blue);

        if (!isPaused){
            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
                m_character.p_isWalking = true;
                m_character.move(-5, 0);

                if(m_character.getPositionX() < clampXMax)
                    playground.move(-5, 0);

            } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
                m_character.p_isWalking = true;
                m_character.move(5, 0);

                if(m_character.getPositionX() > clampX)
                    playground.move(5, 0);
            } //else
//                m_character.p_isWalking = false;
        }

        screen.draw(m_sprite_background);

//        std::cout << "X : " << playground.getCenter().x << std::endl << "Y : " << playground.getCenter().y << std::endl << std::endl;

        if(m_character.getPositionX() < 0)
            m_character.setPosition(0, screen.getSize().y - 200);
        else if(m_character.getPositionX() + 32 > screen.getSize().x)
            m_character.setPosition(screen.getSize().x - 32, screen.getSize().y - 200);

        if(playground.getCenter().x < clampX)
            playground.setCenter(clampX, playground.getCenter().y);
        if(playground.getCenter().x > clampXMax)
            playground.setCenter(clampXMax, playground.getCenter().y);

        screen.draw(m_character);

        screen.setView(playground);

        if (isPaused){
            screen.setView(screen.getDefaultView());
            screen.draw(pause_screen);

            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
                isPaused = false;
        }

        screen.display();
    }
}
 

7
Ah merci !

Je me demandais si il fallait passer par sf::Drawable et merci de m'avoir apporté la réponse :D

J'ai donc appliqué la solution et ça marche nickel !

8
Je me permet de up, s'il vous plaît, dîtes moi si c'est simplement impossible :(

9
Graphique / sf::Text dans une classe héritant de sf::RectangleShape
« le: Juin 22, 2013, 02:28:57 pm »
Bonjour à tous !

J'ai programmé une classe héritant de sf::RectangleShape et j'aimerais afficher un sf::Text dans ce sf::RectangleShape, malheureusement j'en ai aucune idée de comment faire.

Quelqu'un peut m'aider s'il vous plait ?

Ma classe héritant de sf::RectangleShape :
#include "NotifBarre.h"
 
NotifBarre::NotifBarre() : sf::RectangleShape(sf::Vector2f(400, 50)){
    sf::RectangleShape::setFillColor(sf::Color(255, 255, 255, 100));
    sf::RectangleShape::setOutlineThickness(1);
    sf::RectangleShape::setOutlineColor(sf::Color(200, 200, 200, 200));
 
    sf::RectangleShape::setPosition(sf::Vector2f(0, 0));
 
    m_text_notif.setString("TEST LOLOLOLO");
    m_text_notif.setColor(sf::Color::White);
    m_text_notif.setCharacterSize(16);
    m_text_notif.setPosition(sf::Vector2f(25, 57));
    m_text_notif.setStyle(sf::Text::Bold | sf::Text::Underlined);
 
}
NotifBarre::~NotifBarre(){}
 
void NotifBarre::setText(std::string text){
    m_text_notif.setString(text);
}

Merci d'avance pour ceux qui m'aideront !

P.S : j'affiche la classe en créant une instance et en faisant window.draw(monInstance);

Pages: [1]