#include "Disper.h" #define DISPER_LIFE 25 Disper::Disper() :Shot ( DISPER_DEGAT ), m_vx( -DISPER_SPEED ), m_vy( 0 ), m_life( DISPER_LIFE ) { //ctor } Disper::Disper( Sint16 x, Sint16 y, Sint16 vy, bool ally ) :Shot( DISPER_DEGAT, x, y, ally ), m_vx( DISPER_SPEED ), m_vy( vy ), m_life( DISPER_LIFE ) { m_vx -= abs( vy ); if ( ally ) m_vx = -m_vx; } Disper::~Disper() { //dtor } void Disper::update() { m_x += m_vx; m_y += m_vy; m_life -= 1; if ( m_life == 0 ) m_exist = false; } void Disper::draw( SDL_Surface* screen ) { if ( !m_exist ) return; stringRGBA(screen, m_x - 4, m_y - 4, "*", 255, m_life * 255 / DISPER_LIFE, m_life * 128 / DISPER_LIFE, 255); } bool Disper::damageSolid( Uint8** solid, const Uint16 dimH, const Uint16 dimW, const SDL_Rect& hitbox ) { // Déterminer l'ordonnée d'impact Uint16 yImpct( ( m_y - hitbox.y ) / 8 ); // Détermination de l'abscisse d'impact Sint16 xImpct(0); if ( m_ally ) xImpct = dimW - 1; while ( solid[yImpct][xImpct] == 0 ) { if ( m_ally ) xImpct --; else xImpct ++; if ( xImpct == -1 || xImpct == dimW ) return false; } // Déstruction du centre damageBloc( solid, dimH, dimW, yImpct, xImpct, 255 ); damageBloc( solid, dimH, dimW, yImpct - 1, xImpct, 255 ); damageBloc( solid, dimH, dimW, yImpct + 1, xImpct, 255 ); damageBloc( solid, dimH, dimW, yImpct, xImpct - 1, 255 ); damageBloc( solid, dimH, dimW, yImpct, xImpct + 1, 255 ); // Dégats sur l'immédiat Uint16 nearBam( m_life * 50 + 5 ); damageBloc( solid, dimH, dimW, yImpct - 1, xImpct - 1, nearBam ); damageBloc( solid, dimH, dimW, yImpct + 1, xImpct - 1, nearBam ); damageBloc( solid, dimH, dimW, yImpct - 1, xImpct + 1, nearBam ); damageBloc( solid, dimH, dimW, yImpct + 1, xImpct + 1, nearBam ); damageBloc( solid, dimH, dimW, yImpct - 2, xImpct, nearBam ); damageBloc( solid, dimH, dimW, yImpct + 2, xImpct, nearBam ); damageBloc( solid, dimH, dimW, yImpct, xImpct - 2, nearBam ); damageBloc( solid, dimH, dimW, yImpct, xImpct + 2, nearBam ); // Déstruction du projectile m_exist = false; return true; }