#include "Photo.h" Photo::Photo() :Shot( PHOTO_DEGAT ), m_vx( -PHOTO_SPEED ), m_vy( 0 ) { //ctor 1 } Photo::Photo( Sint16 xMe, Sint16 yMe, bool ally ) :Shot( PHOTO_DEGAT, xMe, yMe, ally ), m_vx( PHOTO_SPEED ), m_vy( 0 ) { if ( ally ) m_vx = -m_vx; } Photo::Photo( Sint16 xMe, Sint16 yMe, Sint16 xHim, Sint16 yHim, bool ally ) :Shot( PHOTO_DEGAT, xMe, yMe, ally ) { m_vx = xHim - xMe ; m_vy = yHim - yMe ; Sint16 norme( std::sqrt( m_vx * m_vx + m_vy * m_vy ) ) ; xHim += norme / PHOTO_SPEED ; // Anticipe le mouvement de l'ennemi ! m_vx = xHim - xMe ; m_vy = yHim - yMe ; norme = std::sqrt(m_vx * m_vx + m_vy * m_vy ) ; m_vx = m_vx * PHOTO_SPEED / norme ; m_vy = m_vy * PHOTO_SPEED / norme ; } Photo::~Photo() { //dtor } void Photo::update() { m_x += m_vx; m_y += m_vy; } void Photo::draw( SDL_Surface* screen ) { if ( m_exist ) stringRGBA(screen, m_x - 4, m_y - 4, "o", 0, 100, 255, 255); } bool Photo::damageSolid( Uint8** solid, const Uint16 dimH, const Uint16 dimW, const SDL_Rect& hitbox ) { // Coordonnées impact Uint16 yImpct, xImpct; if ( m_vy == 0 ) { // Pénétration axe horizontal yImpct = ( m_y - hitbox.y ) / 8; if ( m_ally ) xImpct = dimW - 1; else xImpct = 0; while ( solid[yImpct][xImpct] == 0 ) { if ( m_ally ) xImpct --; else xImpct ++; if ( xImpct >= dimW ) return false; } } else { // Pénétration verticale xImpct = ( m_x - hitbox.x ) / 8; Sint8 adder( 0 ); if ( m_vy < 0 ) { yImpct = dimH - 1; adder = -1; } else { yImpct = 0; adder = 1; } while ( solid[yImpct][xImpct] == 0 ) { yImpct += adder; if ( yImpct >= dimH ) return false; } } // Déstruction du centre damageBloc( solid, dimH, dimW, yImpct, xImpct, 123 ); // Déstruction du projectile m_exist = false; return true; }