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

Pages: [1]
1
A moins que ton CPU ne se tourne déjà les pouces sans optimisation, très certainement oui.

C'est le cas pour le moment, mais ça ne durera peut-être pas et je préfère améliorer tout de suite ce que je peux.

Merci pour ta réponse super rapide Laurent, comme d'habitude !

2
Système / [Résolu]Optimisation de recherche de chemin et sf::Clock
« le: Avril 18, 2013, 11:46:06 am »
Bonjour !

J'ai réalisé une recherche de chemin convenable en A* qui permet de prendre en compte des obstacles dynamiques pendant le déplacement. Je cherche à améliorer cette gestion des obstacles dynamiques en réduisant la fréquence de détection (actuellement réalisée à chaque frame).
Je me demande donc s'il serait intéressant d'utiliser un timer afin de limiter la detection des obstacles dynamiques à 2 ou 3 fois par secondes. Je ne me rend pas compte de ce que représente un timer en terme de calcul et si cette modification serait intéressante à réaliser ou non.

Ma boucle de détection en pseudo code :

pour chaque entité dans le jeu
    si cette entité est du type "creep"
        calculer la norme du vecteur distance (hero, entité)
        si norme < rayon de détection
            lancer une nouvelle recherche de chemin en prenant en compte l'obstacle
        fin si
    fin si
fin pour
 

On peut estimer à plusieurs dizaines le nombre d'entités en jeu, 80 à 90% étant du type "creep".

Serait-il intéressant d'utiliser un objet de type sf::Clock afin de limiter l'utilisation de cette boucle à deux ou trois fois par seconde ?

3
Graphique / Re : Re : freeze & app.Draw()
« le: Septembre 30, 2012, 11:21:50 am »
Comment est écrit ta classe d'animation ?
J'ai mis dans mon premier poste un lien vers les classes que j'utilise pour mes animations. Je n'ai pas écris ces classes moi même.

Comment l'invoque tu dans ton main() ?

Ce n'est pas directement dans le main, c'est un petit peu plus compliqué que ça...

Ma classe Enemy hérite de Unit. La création de l'animation d'explosion se fait dans le constructeur de Unit. de la manière suivante :

//Création de l'animation de l'animation et chargement de l'image
m_animatedExplosion = new Animated();
    imageExplosion = new Image();
   *imageExplosion = m_imageManager.getImage("images/explosion1.png");

//Je découpe l'image en frame que j'ajoute à l'objet Anim
    m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(0, 0, EXPLOS_WIDTH, EXPLOS_HEIGHT) ));
    m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH, 0, EXPLOS_WIDTH*2, EXPLOS_HEIGHT) ));
    m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*2, 0, EXPLOS_WIDTH*3, EXPLOS_HEIGHT) ));
    m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*3, 0, EXPLOS_WIDTH*4, EXPLOS_HEIGHT) ));
    m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*4, 0, EXPLOS_WIDTH*5, EXPLOS_HEIGHT) ));
    m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*5, 0, EXPLOS_WIDTH*6, EXPLOS_HEIGHT) ));
    m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*6, 0, EXPLOS_WIDTH*7, EXPLOS_HEIGHT) ));

//J'associe les frame à l'animation avec quelques détails en plus.
    m_animatedExplosion->SetAnim(&m_animExplosion);
    m_animatedExplosion->SetLoop(false);
    m_animatedExplosion->SetFrameTime(0.07f);
    m_animatedExplosion->SetPosition(m_position.x, m_position.y);

Ma liste d'ennemis est géré par une classe population qui els fait apparaître / bouger / tirer / mourir. Quand un ennemi n'a plus de points de vie, il est copié dans une liste d'ennemis morts : le sprite de l'ennemis n'est plus dessiné et laisse place à l'animation d'explosion. Voilà comment c'est appelé :

void Population::manageExplosion()
{
    if(!m_deadEnemies.empty())
    {
        short currentFrame;
        list<Enemy*>::iterator lit(m_deadEnemies.begin());
        for(; lit!=m_deadEnemies.end();lit++)
        {
            //Si l'animation est en pause
            if((*lit)->getAnimationExplosion()->IsPaused())
                (*lit)->getAnimationExplosion()->Play();//On relance l'animation
            //On récupère le numéro de l'image qui est affichée
            currentFrame = (*lit)->getAnimationExplosion()->GetCurrentFrame();

            //On positionne l'animation sur l'ennemi qui a explose
            (*lit)->getAnimationExplosion()->SetPosition((*lit)->getPositionAxis(0)-((*lit)->getExploWidth()/2), (*lit)->getPositionAxis(2)-((*lit)->getExploHeight()/2)+30);
             //On dessine l'explosion
            (*lit)->drawExplosion();
            //Si l'image actuelle correspond à la dernière image de l'animation
            if(currentFrame == (*lit)->getAnimationExplosion()->GetAnim()->Size()-1)
            {
                lit = m_deadEnemies.erase(lit);//On détruit l'objet ennemi
            }
        }
    }
}
 
Je viens de réaliser que j'utilise une liste ici alors qu'un Vector correspondrait mieux, je vais modifier ça.

Voilà voilà, si tu as besoin de plus d'information sur une partie du code n'hésite pas à demander.

4
Graphique / Re : freeze & app.Draw()
« le: Septembre 28, 2012, 09:35:49 pm »
Bon je confirme que le problème n’apparaît pas sur mon pc fixe... Question de performance ou question de carte graphique ?

5
Graphique / Re : freeze & app.Draw()
« le: Septembre 28, 2012, 07:44:12 pm »
Me concernant ça le fait à chaque explosion, ce qui est très gênant dans un shooter vertical...

J'ai pas pensé à le tester sur un autre pc pour voir si le hardware posait problème. Je vais faire ça !

6
Graphique / freeze & app.Draw()
« le: Septembre 28, 2012, 05:35:44 pm »
Voilà un petit moment que je bosse sur un projet et j'ai remarqué un problème avec l'affichage de mon animation d'explosion. Le chargement de l'image et la gestion de l'animation ne pose pas de problème mais à partir du moment où l'animation est affichée à l'écran, l'ensemble de l'application freeze pendant une fraction de seconde.

J'utilise les classes Animated, Anime et Frame trouvées ici http://www.sfml-dev.org/wiki/fr/sources/animation

Ca fonctionne évidemment correctement quand je fait un projet avec seulement cette animation mais je ne vois pas bien d'où vient le problème ici puisque tout le traitement sur l'animation et autour ne pose pas de problème  et seul la ligne app.Draw(*animation) fait freeze le jeu quand je la dé-commente.

Je ne vois pas trop quel code poster du coup, si jamais vous voulez des infos supplémentaire n'hésitez pas.

7
Système / Re : [SFML 1.6] Thread et fluidité
« 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);
}

8
Système / [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 !

9
Général / Re : list et destructeur
« le: Mai 08, 2012, 11:38:30 am »
Désolé pour le retard !
Les problèmes sont finalement résolus.
Pour le premier, c'était bêtement un cont iterator au lieu d'un iterator.
Pour le deuxième ça foirait à plusieurs endroits, principalement à cause de problèmes d'images static.

10
Général / list et destructeur
« le: Mai 05, 2012, 12:28:51 pm »
J'ai plusieurs erreurs liées aux destructeurs, que je ne comprends pas et qui font crasher mon jeu quand je le quitte.

Premièrement, quand je détruit mes ennemis dans le jeu (en tirant dessus donc), j'utilise cette fonction :
void Population::checkPopulation()
{
    if(this->haveEnnemyInProgress())
    {
        list<Enemy*>::iterator lit(m_enemies.begin());
        for(; lit!=m_enemies.end();)
        {
            if((*lit)->isDead())
            {
                this->explode(*lit);
                lit = m_enemies.erase(lit);
            }
            else
            {
                lit++;
            }
        }
    }
}

La méthode à l'air de bien fonctionner, les ennemis sont détruits au fur et à mesure.
Par contre dans le destructeur de ma classe, je ne peux pas implémenter cette solution (adaptée, sans le isDead()) car il me sort l'erreur :

Citer
G:\projets\cours\jeu\population.cpp|22|error: no matching function for call to 'std::list<Enemy*, std::allocator<Enemy*> >::erase(std::_List_const_iterator<Enemy*>&)'|
e:\utilitaires\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\list.tcc|107|note: candidates are: std::_List_iterator<_Tp> std::list<_Tp, _Alloc>::erase(std::_List_iterator<_Tp>) [with _Tp = Enemy*, _Alloc = std::allocator<Enemy*>]|


J'ai un autre problème lors de la fin de partie, le jeu crash lors de la suppression des images et des animations, voilà un exemple pour des images:

Dans le code ci-dessous, listStar est rempli de copies de spriteStar.

Background::Background(RenderWindow &app, int speed, int SCREEN_WIDTH, int SCREEN_HEIGHT): m_app(app), m_speed(speed), m_width(SCREEN_WIDTH), m_height(SCREEN_HEIGHT)
{
    static Image* imageStar = new Image;
    if(!(imageStar->LoadFromFile("images/projectile.png")))
    {
        cerr << "Impossible de charger : projectile.png" << endl;
    }
    else
    {
        spriteStar.SetImage(*imageStar);
    }
    static Image* imagePlanet = new Image;
    if(!(imagePlanet->LoadFromFile("images/projectile2.png")))
    {
        cerr << "Impossible de charger : projectile.png" << endl;
    }
    else
    {
        spritePlanet.SetImage(*imagePlanet);
    }

    this->init();
}

Background::~Background()
{
    listStar.clear();
    cout << "background1" << endl;
    if(imageStar!=NULL)
       delete imageStar;
    if(imagePlanet!=NULL)
        delete imagePlanet;
    cout << "background2" << endl;
}
 

EDIT : Je voudrais surtout savoir si je m'y prends mal avec les delete, si il faut utiliser une autre méthode, ou si ça vient juste de l'odre de supression qui est pas bon (essayer de suprimer un élément qui n'existe plus par exemple) ? La vérification avec le if(var!=NULL) est-elle correcte ?

11
Graphique / Re : [SFML 1.6] Affichage aléatoire
« le: Mai 02, 2012, 08:43:39 am »
Après beaucoup (trop) d'heures de debug et l'apparition de toujours plus de bugs étranges, je décide de changer de méthode et d'abandonner celle-ci.

12
Graphique / [Résolu][SFML 1.6] Affichage aléatoire
« le: Avril 30, 2012, 09:31:21 am »
A l'ai de d'un tuto vidéo, j'ai créé une classe animation qui permet de découper des images et afficher des animations. J'ai appliqué cette méthodes à une de mes classes déjà crée (Player) sans qu'il n'y ai aucun soucis. J'ai voulu ensuite "monter d'un cran" en l'appliquant à la classe mère (mère de Player et Enemy). Toujours aucun soucis pour l'affichage du joueur, mais j'ai bug plutôt étrange sur l'affichage des ennemis qui se font de manière aléatoire. En fait, tous les ennemis sont présent (les collisions sont conservées) mais l'affichage des ennemis est aléatoire (dans le nombre d'ennemis affiché et dans les ennemis affichés).

Je met le minimum de code, avec Player et Enemy pour pouvoir comparer, dites moi s'il vous en faut plus.

animation.h :
#ifndef ANIMATION_H_INCLUDED
#define ANIMATION_H_INCLUDED
#include <SFML/Graphics.hpp>
#include <iostream>

class Animation
{
    public:
        Animation();
        ~Animation();
        void initialize(float x, float y, int frameX, int frameY);
        void update(sf::RenderWindow &app);
        void draw(sf::RenderWindow &app);
        bool getActive();
        void setActive(bool value);
        int getCurrentFrame(int axis);
        void setCurrentFrame(int axis, int value);
        int getPosition(int axis);
        void setPosition(int axis, int value);
        void setImage(sf::Image &tempImage);
        int getFrameWidth();
        int getFrameHeight();

    protected:
        sf::Sprite sprite;
        float frameCounter, switchFrame, amountOfFrameX, amountOfFrameY;
        int currentFrameX, currentFrameY;
        float x,y;
        bool active;
        sf::Clock clock;

};
#endif // ANIMATION_H_INCLUDED

animation.cpp :
int Animation::getFrameWidth()
Animation::Animation()
{

}

Animation::~Animation()
{

}

int Animation::getFrameWidth()
{
    //Calcule la largeur des images à afficher
    return sprite.GetImage()->GetWidth() / amountOfFrameX;
}

int Animation::getFrameHeight()
{
    //Calcule la hauteur des images à afficher
    return sprite.GetImage()->GetHeight() / amountOfFrameY;
}

void Animation::initialize(float x, float y, int frameX, int frameY)
{
    //Fait office de constructeur
    frameCounter = 0;
    switchFrame = 3;
    this->x = x;
    this->y = y;
    amountOfFrameY = frameY;
    amountOfFrameX = frameX;
    active = false;
}

void Animation::update(RenderWindow &app)
{
    //Permet de faire défiler les images
    if(active)
        frameCounter += 10*(float)app.GetFrameTime();
    else
        frameCounter += clock.GetElapsedTime();

    if(frameCounter >= switchFrame)
    {
        frameCounter = 0;
        clock.Reset();
        currentFrameX += getFrameWidth();
    }
    if(currentFrameX >= sprite.GetImage()->GetWidth())
        currentFrameX = 0;
    sprite.SetSubRect(IntRect(currentFrameX, currentFrameY*getFrameHeight(), currentFrameX + getFrameWidth(),currentFrameY*getFrameHeight() + getFrameHeight()));
    sprite.SetPosition(x,y);
}

void Animation::draw(RenderWindow &app)
{
    app.Draw(sprite);
}

bool Animation::getActive()
{
    return active;
}

void Animation::setActive(bool value)
{
    active = value;
}

int Animation::getCurrentFrame(int axis)
{
    //Axe 1 : x, les autre : y
    //Permet de savoir à quelle image on en est
    if(axis == 1)
        return currentFrameX;
    else
        return currentFrameY;
}

void Animation::setCurrentFrame(int axis, int value)
{
    //Axe 1 : x, les autre : y
    //value : Les valeurs commencent à zéro et sont croissante en descendant l'image.
    if(axis == 1)
        currentFrameX = value;
    else
        currentFrameY = value;
}

int Animation::getPosition(int axis)
{
    if(axis == 1)
        return x;
    else
        return y;
}

void Animation::setPosition(int axis, int value)
{
    //Axe 1 : x, les autre : y
    if(axis == 1)
        x = value;
    else
        y = value;
}

void Animation::setImage(Image &tempImage)
{
    sprite.SetImage(tempImage);
}

enemy.h
#ifndef ENEMY_H_INCLUDED
#define ENEMY_H_INCLUDED
#include <list>
#include <SFML/Graphics.hpp>
#include "timer.h"
#include "unit.h"
#include "projectile.h"
#include "animation.h"

//Permet de créer le type enemy : ils sont ensuite créé et stocké dans population.

class Enemy : public Unit
{
    public:
        Enemy(int life, int score, int xSpeed, int ySpeed, const std::string &filepath, sf::Vector2f position, sf::RenderWindow &app);
        ~Enemy();
        sf::Sprite* getSprite();
        sf::IntRect getBoundingBox();
        std::list<Projectile*> fire();
        std::list<Projectile*> getProjectiles();
        void recieveDamages(int dmg);
        int getScore();
        bool isDead();
        void moveLeft();
        void moveUp();
        void moveDown();
        void moveRight();
        void dontMove();
        void draw();
        int getPosition(int axis);
        void setPosition(int axis, int value);

    protected:
        std::list<Projectile*> m_projectiles;
        static sf::Image image;
        float lastShot;
        Timer timer;
        int const m_score;
};

#endif // ENEMY_H_INCLUDED

enemy.cpp
Enemy::Enemy(int life, int score, int xSpeed, int ySpeed, const string &filepath, Vector2f position, RenderWindow &app):Unit(1, xSpeed, ySpeed, filepath, position, app), lastShot(0), m_score(score)
{
    timer.start();
    currentFrameX = currentFrameY = 0;
    animation->initialize(m_position.x, m_position.y, 1, 1);

}

void Enemy::moveUp()
{
    animation->setActive(true);
    m_position.y -= m_ySpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 0;
    animation->setPosition(2, m_position.y);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Enemy::moveDown()
{
    animation->setActive(true);
    m_position.y += m_ySpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 0;
    animation->setPosition(2, m_position.y);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Enemy::moveLeft()
{
    animation->setActive(true);
    m_position.x -= m_xSpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 1;
    animation->setPosition(1, m_position.x);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Enemy::moveRight()
{
    animation->setActive(true);
    m_position.x += m_xSpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 2;
    animation->setPosition(1, m_position.x);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Enemy::dontMove()
{
    animation->setActive(true);
    currentFrameY = 0;
    animation->setCurrentFrame(0, currentFrameY);
    animation->update(m_app);
}

void Enemy::draw()
{
    animation->setActive(true);
    animation->update(m_app);
    animation->draw(m_app);
}

player.h
#ifndef PLAYER_H_INCLUDED
#define PLAYER_H_INCLUDED
#include <iostream>
#include <SFML/Graphics.hpp>
#include <list>
#include "projectile.h"
#include "unit.h"
#include "timer.h"
#include "animation.h"


//Tout ce qui concerne le joueur

class Player : public Unit
{
    public:
        Player(int life, int xSpeed, int ySpeed, const std::string &filepath, sf::Vector2f position, sf::RenderWindow &app);
        ~Player();
        sf::Sprite* getSprite();
        int getLives();
        sf::IntRect GetBoundingBox();
        void fire();
        bool HaveProjectilesInProgress();
        std::list<Projectile*>* getProjectiles();
        void moveProjectile();
        void drawProjectile();
        void addScore(int score);
        double getScore();
        void loseLive();
        bool getLostlife();
        void resetLostLife();
        void loadContent();
        void moveUp();
        void moveDown();
        void moveLeft();
        void moveRight();
        void dontMove();
        void draw();
        int getPosition(int axis);
        void setPosition(int axis, int value);

    protected:
        std::list<Projectile*> m_projectiles;
        Projectile *projectile;
        int m_lives; //Vies restantes
        int const max_lives; //Nombre de vie non dépassable
        float const fireRate; //delta en secondes entre chaque tir
        float lastShot;
        Timer timer;
        double m_score;
        bool lostLife;
};

bool canFire(float lastShot, Timer &timer, float const fireRate);

#endif // PLAYER_H_INCLUDED

player.cpp
Player::Player(int life, int xSpeed, int ySpeed, const string &filepath, Vector2f position, RenderWindow &app):Unit(1, xSpeed, ySpeed, filepath, position, app), max_lives(3), lastShot(0), fireRate(0.1), m_lives(4), m_score(0), lostLife(false)
{
    timer.start();
    currentFrameX = currentFrameY = 0;
    animation->initialize(m_position.x, m_position.y, 5, 3);
}

void Player::moveUp()
{
    animation->setActive(true);
    m_position.y -= m_ySpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 0;
    animation->setPosition(2, m_position.y);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Player::moveDown()
{
    animation->setActive(true);
    m_position.y += m_ySpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 0;
    animation->setPosition(2, m_position.y);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Player::moveLeft()
{
    animation->setActive(true);
    m_position.x -= m_xSpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 1;
    animation->setPosition(1, m_position.x);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Player::moveRight()
{
    animation->setActive(true);
    m_position.x += m_xSpeed * m_app.GetFrameTime() * coefSpeed;
    currentFrameY = 2;
    animation->setPosition(1, m_position.x);
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Player::dontMove()
{
    animation->setActive(true);
    currentFrameY = 0;
    animation->setCurrentFrame(2, currentFrameY);
    animation->update(m_app);
}

void Player::draw()
{
    animation->draw(m_app);
}

Pages: [1]
anything