#include "Perso.h" Perso::Perso(SDL_Surface* srcImg, SDL_Surface* deathImg, Controler* ctrl, Tirs_Gest* tirsGest, bool allie, Armes_Gest* armGest) :Affichable(rotozoomSurface(srcImg, 90.0, 1.0, 0)), /** Vie*/ m_vieMax(100), m_vie(m_vieMax), m_disHP( m_vieMax ), /** Etat*/ m_vitesse(4.0f), m_vivant(true), m_allie(allie), /** Interactions*/ m_srcImg(srcImg), m_deathImg(deathImg), m_fullImg(0x0), m_visee(1.0f, 0.0f), m_ortho(0.0f, 17.0f), m_ctrl(ctrl), m_tirsGest(tirsGest), /** Arme*/ m_armGest( armGest ), m_arme() { // Création de l'image stockant l'apparence m_fullImg = SDL_CreateRGBSurface( SDL_HWSURFACE, m_srcImg->w, m_srcImg->h, 32, 0, 0, 0, 0); // On récupère une arme de départ m_arme[ L_HAND ] = m_armGest->startWeapon( tirsGest ); m_arme[ R_HAND ] = 0x0; majFullImg(); } Perso::Perso(SDL_Surface* srcImg, SDL_Surface* deathImg, Controler* ctrl, Tirs_Gest* tirsGest, bool allie, Armes_Gest* armGest, float x, float y) :Affichable(rotozoomSurface(srcImg, 90.0, 1.0, 0)), /** Vie*/ m_vieMax(100), m_vie(m_vieMax), m_disHP( m_vieMax ), /** Etat*/ m_vitesse(4.0f), m_vivant(true), m_allie(allie), /** Interactions*/ m_srcImg(srcImg), m_deathImg(deathImg), m_visee(0.0f, 0.0f), m_ctrl(ctrl), m_tirsGest(tirsGest), /** Arme*/ m_armGest( armGest ), m_arme() { // Création de l'image stockant l'apparence m_fullImg = SDL_CreateRGBSurface( SDL_HWSURFACE, m_srcImg->w, m_srcImg->h, 32, 0, 0, 0, 0); // Attribution des coordonnées du spawn m_pos.setVecteur(x, y); // On récupère une arme de départ m_arme[ L_HAND ] = m_armGest->startWeapon( tirsGest ); m_arme[ R_HAND ] = 0x0; majFullImg(); } Perso::~Perso() { SDL_FreeSurface(m_img); SDL_FreeSurface(m_fullImg); delete m_ctrl; if ( m_arme[ L_HAND ] != 0x0 ) delete m_arme[ L_HAND ]; if ( m_arme[ R_HAND ] != 0x0 ) delete m_arme[ R_HAND ]; } void Perso::bouger() { if ( !m_vivant ) return; m_ctrl->update(); bool change( false ); ///Deplacement // Mouvement Vec dir = m_ctrl->getMvt(); m_pos += dir * m_vitesse; // Collision if ( m_pos.getX() > 4500.0f ) m_pos.setX( 4500.0f ); else if ( m_pos.getX() < -1500.0f ) m_pos.setX( -1500.0f ); if ( m_pos.getY() > 1500.0f ) m_pos.setY( 1500.0f ); else if ( m_pos.getY() < -1500.0f ) m_pos.setY( -1500.0f ); // Placement m_disHP.IAmHere( m_pos ); ///Craft if ( m_ctrl->getCraft() && m_arme[0] && m_arme[1] ) { Arme* prod = m_armGest->crafting( m_arme, m_tirsGest ); if ( prod != 0x0 ) { m_arme[0] = prod; m_arme[1] = 0x0; change = true; } } ///Recherche for ( short i(0); i<2; i++ ) { if ( m_ctrl->getSearch(i) ) { if ( m_arme[ i ] == 0x0 ) { // On saisit une arme m_arme[ i ] = m_armGest->saisir( m_pos ); } else { // On lache l'arme m_armGest->drop( m_pos, m_arme[ i ] ); m_arme[ i ] = 0x0; } // On modifie l'apparence change = true; } } // Et on réinitialise l'apparence if ( change && m_vivant ) majFullImg(); ///Collision avec les tirs int aie( m_tirsGest->encaisser(m_pos, m_allie) ); if ( aie > 0 ) { m_vie -= aie; if (m_vie < 0) { // Le perso est mort m_vie = 0; m_vivant = false; SDL_BlitSurface( m_deathImg, 0, m_fullImg, 0 ); m_visee.normaliser(); // Pour orienter l'image de mort : force le test // Et lache ses armes for ( short i(0); i<2; i++ ) { if ( m_arme[ i ] != 0x0 ) { m_armGest->drop( (i==0)? m_pos + m_ortho*2.0f : m_pos - m_ortho*2.0f, m_arme[ i ] ); m_arme[ i ] = 0x0; } } } m_disHP.updateImg( m_vie ); } ///Orientation // On récupère Vec visee( m_ctrl->getVisee() ); // Si entre deux on a tourné ... if ( m_visee != visee ) { // ... on tourne m_visee = visee; m_ortho.setVecteur( visee.getY(), -visee.getX() ); // Vecteur normal m_ortho.normaliser(); m_ortho *= 17.0f; // Calcul de l'angle en radians float angle; if (m_visee.getX() != 0.0f) angle = atan((double)( m_visee.getY()) / m_visee.getX() ); // Angle en radians else if (m_visee.getY() < 0.0f) angle = -M_PI_2; else angle = M_PI_2; // Conversion angle = angle * 180.0f / M_PI; // Angle en ° if ( m_visee.getX() < 0 ) angle += 180.0f; // Rotation de l'image SDL_FreeSurface(m_img); m_img = rotozoomSurface(m_fullImg, angle, 1.0f, SMOOTHING_OFF ); } ///Fine gachette for ( short i(0); i<2; i++ ) { if ( m_ctrl->getTir( i ) && m_arme[ i ] != 0x0 ) { m_arme[ i ]->gachette( (i==0)? m_pos - m_ortho : m_pos + m_ortho, m_visee, m_allie ); } } } bool Perso::estVivant() const { return m_vivant; } Vec Perso::getPos() const { return m_pos; } Vec Perso::getVisee() const { return m_visee; } void Perso::regen() { if ( !m_vivant ) { m_vivant = true; majFullImg(); } m_vieMax += 6; m_vie = m_vieMax; m_disHP.setMax( m_vieMax ); m_disHP.updateImg( m_vie ); } void Perso::afficher( const Vec &lookAt, SDL_Surface* screen ) { /// Afficher perso Affichable::afficher( lookAt, screen ); /// Afficher barre de vie m_disHP.afficher( lookAt, screen ); } void Perso::majFullImg() { // Réinitialise l'apparance SDL_BlitSurface( m_srcImg, 0, m_fullImg, 0); // Rajoute l'arme SDL_Rect cadrage = { 24, 0, 0, 0 }; for ( short i(0); i<2; i++ ) { if ( m_arme[ i ] != 0x0 ) { SDL_Surface* weapon( m_armGest->getImg( m_arme[i]->getModel() ) ); SDL_BlitSurface( weapon, 0, m_fullImg, &cadrage ); } cadrage.y += 30; } // Force le rafraichissement de l'image m_visee.normaliser(); } ///FICHIER END