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

Auteur Sujet: [SFML 1.6] Thread et fluidité  (Lu 3303 fois)

0 Membres et 1 Invité sur ce sujet

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
[SFML 1.6] Thread et fluidité
« le: Juillet 03, 2012, 01:19:49 pm »
Bonjour !

Je me suis décidé à utiliser les threads pour faire le level design de mon projet dans mon projet. Ce n'est certes pas indispensable, mais c'est une bonne occasion pour apprendre et une bonne méthode pour avoir des arrivées d'unité ennemies complètement indépendant du reste.

Bref, je voudrais donc utiliser un thread qui ne fait que créer mes ennemis et leur gestion est déléguée au code principal, c'est plutôt simple et ça limite les conflits à une liste d'ennemis.

Un problème apparaît néanmoins : quand mes ennemis sont créés dans la gameloop (sans thread donc), tout est fluide et fonctionne sans problème. A partir du moment où je créé un ennemi à partir du thread, le jeu perds en fluidité. Il n'y a néanmoins pas de chute de fps !

Je ne comprends pas en quoi le thread qui est censé ne plus rien faire après avoir créé un ennemi peut perturber le reste du code... Il y a quelque chose qui m'échappe ?

Voilà ma classe de thread :

#include "script.h"

using namespace std;
using namespace sf;

Script::Script(int id, std::string msg, image_manager &imageManager, Player &player,
 Projectile_manager &projectile_manager, Population &population):id(id),msg(msg),
m_imageManager(imageManager), m_player(player), m_projectileManager(projectile_manager), m_population(population)
{
    timer.start();
}

void Script::Run()
{
    Vector2f positionEnemy(50, 200);
    m_population.createShip(positionEnemy, m_player, m_imageManager);
}

#ifndef SCRIPT_H_INCLUDED
#define SCRIPT_H_INCLUDED
#include <SFML/Graphics.hpp>
#include "population.h"
#include "timer.h"
#include "enemy.h"
#include "image_manager.h"
#include "player.h"
#include "population.h"
#include "projectile_manager.h"

class Script:public sf::Thread
{
    public:
        Script( int id, std::string msg, image_manager &imageManager, Player &player, Projectile_manager &projectile_manager, Population &m_population);

    private:
        // Run() est une fonctione virtuelle de sf::Thread
        void Run();

        int id;
        std::string msg;
        image_manager &m_imageManager;
        Player &m_player;
        Projectile_manager &m_projectileManager;
        Population &m_population;
        Timer timer;
};

#endif // SCRIPT_H_INCLUDED
 

Merci d'avance !

Neckara

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
Re : [SFML 1.6] Thread et fluidité
« Réponse #1 le: Juillet 03, 2012, 02:15:00 pm »
Peux-tu nous montrer comment tu créé ton thread?

Est-ce tu ne créé pas de thread à chaque "tour" ?

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : [SFML 1.6] Thread et fluidité
« Réponse #2 le: Juillet 03, 2012, 02:58:53 pm »
J'ai parlé de gameloop ce qui n'est pas correct, les ennemis sont créés avant la gameloop (après toutes les instanciations et avant le début de la gameloop). De même, je créé mon thread une seule fois.
Voilà le code contenant la boucle de jeu :
void Jeu::start()
{
    bool invincible(false);
    int invincibleStart;
    Timer timer;

    //Gestionnaire d'images
    image_manager imageManager;
        imageManager.addResourceDirectory("images/" );
    Projectile_manager projectile_manager(m_app);

    //Variables :
    const int PANNEL_WIDTH(300), PLAYER_WIDTH(118), PLAYER_HEIGHT(93);
    const Input & input = m_app.GetInput();

    //Variables player :
    IntRect subRect(0, PLAYER_HEIGHT, PLAYER_WIDTH, 0);
    double playerXSpeed = 10, playerYSpeed = 10;
    const string filepath = "images/player.png";
    Vector2f positionPlayer(m_SCREEN_WIDTH/2 -50, m_SCREEN_HEIGHT - 100);
    Player player(1, playerXSpeed, playerYSpeed, filepath, positionPlayer, m_app, imageManager, projectile_manager);

    //Variables enemy :
    Vector2f positionEnemy(50, 50);

//Variable population
    Population population(m_app, projectile_manager);

//**********************************************
//CREATION DU THREAD ICI
//**********************************************
    Script s1( 1, "test s1", imageManager, player, projectile_manager, population);
    s1.Launch();
/*
    population.createShip(positionEnemy, player, imageManager);
    positionEnemy.x +=100;
    population.createShip(positionEnemy, player, imageManager);
    positionEnemy.x +=100;
    population.createShip(positionEnemy, player, imageManager);
    positionEnemy.x +=100;
    //population.createFlyingSaucer(positionEnemy, player, imageManager);
    positionEnemy.x +=100;
    population.createShip(positionEnemy, player, imageManager);
    positionEnemy.x +=100;
    population.createShip(positionEnemy, player, imageManager);
    positionEnemy.x +=100;

    //population.createFlyingSaucer(positionEnemy, player, imageManager);
    positionEnemy.x +=100;
    population.createShip(positionEnemy, player, imageManager);
    positionEnemy.x +=100;
    //population.createFlyingSaucer(positionEnemy, player, imageManager);*/


    //pannel
    const string filepathPanel = "images/pannel.png";
    Vector2f positionPannel(m_SCREEN_WIDTH-PANNEL_WIDTH, 0);
    Pannel pannel(m_app, filepathPanel, positionPannel, player, imageManager);

    //Collision
    Vector2f windowSize(m_SCREEN_WIDTH-PANNEL_WIDTH, m_SCREEN_HEIGHT);
    Collision collision(windowSize, player, population, projectile_manager);

    //Background
    Background background(m_app, 1, m_SCREEN_WIDTH, m_SCREEN_HEIGHT, imageManager);

    //Projectiles
    list<Projectile*> projectiles;

    while (m_app.IsOpened() )
    {
        //Boucle avec les évènements
     }
        player.draw();
        population.checkPopulation();
        population.manageExplosion();
        population.drawPopulation();
        pannel.checkPannel();
        m_app.Draw(*pannel.getSprite());
        m_app.Display();
        timer.sleep(1);
}
« Modifié: Juillet 03, 2012, 03:07:59 pm par Hindi »