123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- #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
|