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

Auteur Sujet: Problème d'intégration d'un thread dans une classe  (Lu 8069 fois)

0 Membres et 2 Invités sur ce sujet

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème d'intégration d'un thread dans une classe
« Réponse #15 le: Octobre 15, 2013, 11:14:02 pm »
Si tu arrivais à reproduire le problème dans un code complet minimal, ça nous aiderait à t'aider. Avec des morceaux, incomplets, de ton code original, ça va être compliqué.
Laurent Gomila - SFML developer

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : Problème d'intégration d'un thread dans une classe
« Réponse #16 le: Octobre 16, 2013, 09:12:24 pm »
Je n'ai pas fait ça dans un code minimal mais complet seulement ;)

#include "Scene.h"

sf::Clock horloge;
sf::Time tempsFrame;

Scene::Scene()
{
    sf::RenderWindow window(sf::VideoMode(), "Warrior Of Space", sf::Style::Fullscreen);
    window.setKeyRepeatEnabled(true);
    window.setFramerateLimit(60);

    sf::Texture image;
    if(!image.loadFromFile("Ressources/Background.png"))
       std::cout<<"Error"<<std::endl;
    sf::Sprite background(image);

    Spaceship spaceship;
    Gui gui(&spaceship);

    sf::View camera(sf::FloatRect(0, 0, 800, 600));
    ProjectileManager projectile;

    sf::RectangleShape rectangle;
    rectangle.setSize(100, 100);
    rectangle.setFillColor(sf::Color::Red);
    rectangle.setPosition(200, 300);

    float timer;


    while (window.isOpen())
        {
            timer += m_tempsFrame.asSeconds();
            sf::Event event;
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::Closed)
                window.close();

                if (event.type == sf::Event::Resized)
                {
                    sf::FloatRect visibleArea(0, 0, event.size.width, event.size.height);
                    window.setView(sf::View(visibleArea));
                }

                if ( (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape) )
                {
                    window.close();
                }

                if ( (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Right) )
                {
                    spaceship.Move(5, 0);
                }
                if ( (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Left) )
                {
                    spaceship.Move(-5, 0);
                }
                if ( (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Z) )
                {
                    spaceship.addHealth(+5);
                }
                if ( (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::A) )
                {
                    spaceship.addHealth(-5);
                }
                if ( (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space) )
                {
                    projectile.addProjectile();
                }

            }

            window.clear();
            window.draw(rectangle);
            window.draw(spaceship);
            projectile.displayProjectile(window);
            window.draw(gui);
            gui.Update(&spaceship);
            m_tempsFrame = m_horloge.restart();
            projectile.moveProjectile(timer);
            window.setView(camera);
            window.display();
        }
}
 

#ifndef SCENE_H
#define SCENE_H

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


#include "Spaceship.h"
#include "Projectile.h"
#include "Gui.h"
#include "ProjectileManager.h"

class Scene
{
    public:
        Scene();

    private:
        sf::Clock m_horloge;
                sf::Time m_tempsFrame;
};

#endif // SCENE_H
 


#include "Projectile.h"

Projectile::Projectile() : sf::Sprite()
{
    Projectile_Blue.setSize(sf::Vector2f(10, 10));
    Projectile_Blue.setPosition(300, 400);
    Projectile_Blue.setFillColor(sf::Color::Blue);
}

 


#ifndef PROJECTILE_H
#define PROJECTILE_H

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

class Projectile : public sf::Sprite
{
    public:
        Projectile();

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

        sf::RectangleShape Projectile_Blue;
};

#endif // PROJECTILE_H
 



#include "ProjectileManager.h"

ProjectileManager::ProjectileManager()
{
    //ctor
}

ProjectileManager::~ProjectileManager()
{
    //dtor
}

void ProjectileManager::addProjectile()
{
    m_projectiles.push_back(Projectile());
}

void ProjectileManager::deleteProjectile()
{
    for (unsigned int i = 0; i < m_projectiles.size(); i++)
    if (m_projectiles[i].getPosition().y > 500)
        m_projectiles.erase(m_projectiles.begin() + i);
}

void ProjectileManager::moveProjectile(float &timer)
{
    for (unsigned int i = 0; i < m_projectiles.size(); ++i)
    {
        m_projectiles[i].move(10, 5 *timer);
        int y = m_projectiles[i].getPosition().y;
        int x = m_projectiles[i].getPosition().x;
        std::cout << x << " | " << y << std::endl;
    }
}

void ProjectileManager::displayProjectile(sf::RenderWindow& window)
{
    for (unsigned int i = 0; i < m_projectiles.size(); ++i)
        window.draw(m_projectiles[i]);
}
 


#ifndef PROJECTILEMANAGER_H
#define PROJECTILEMANAGER_H

#include <SFML/Graphics.hpp>
#include <iostream>
#include "Projectile.h"

class ProjectileManager
{
    public:
        ProjectileManager();
        ~ProjectileManager();

        void addProjectile();
        void deleteProjectile();
        void moveProjectile(float &timer);
        void displayProjectile(sf::RenderWindow& window);
    private:
        std::vector<Projectile> m_projectiles;
};

#endif // PROJECTILEMANAGER_H
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème d'intégration d'un thread dans une classe
« Réponse #17 le: Octobre 16, 2013, 10:16:07 pm »
Bien, mais c'est à toi de perdre du temps à éliminer les morceaux de code inutiles, pas à nous. Il faut que lorsque tu arrives sur le forum tu aies déjà déblayé le terrain, c'est pas à nous d'en chier sur tes problèmes ;)
Laurent Gomila - SFML developer

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : Problème d'intégration d'un thread dans une classe
« Réponse #18 le: Octobre 17, 2013, 09:29:42 pm »
Oui pardon, je manque de temps donc je cherchais pas trop à régler mon problème mais plus à me le faire régler ^^
Les vacances arrivent donc je vais me remettre dedans et revenir avec un code épuré ;)
Je suis encore désolé

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : Problème d'intégration d'un thread dans une classe
« Réponse #19 le: Octobre 20, 2013, 01:00:47 am »
Bonsoir,

Après analyse je viens de voir où j'ai un soucis ...
Mon projectile avance bien enfin sur ça il n'y a pas de soucis. Il s'affiche bien aussi.
Mais il ne s'actualise pas, c'est à dire qu'il bouge virtuellement car sur l'écran il reste au même endroit

Voici le code :

void ProjectileManager::moveProjectile(sf::RenderWindow& window)
{
    for (unsigned int i = 0; i < m_projectiles.size(); ++i)
    {
        m_projectiles[i].move(0, 1);
        int y = m_projectiles[i].getPosition().y;
        int x = m_projectiles[i].getPosition().x;
        std::cout << x << " | " << y << std::endl; // Me permet de récupérer la position du projectile et ça évolue normalement mais rien ne se passe à l'écran ...

        window.draw(m_projectiles[i]);
    }
}
 

Et voici ce que la console affiche :


cdcl

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
Re : Problème d'intégration d'un thread dans une classe
« Réponse #20 le: Janvier 03, 2014, 01:14:49 pm »
Le problème, ben c'est que tu fait avancer ton objet sf::Sprite et non ton Objet Rectangle...  ;)
Bonjour,

Et puis je pense que tu te trompe au niveau implémentation... pourquoi pas simplement hériter de sf::RectangleShape  ?

class Projectile : public sf::RectangleShape
{
    public:
        Projectile();

};