home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / xenon / source / homingmissile.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-11  |  2.1 KB  |  106 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CHomingMissile
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    06/05/00
  8. //
  9. // Base:    CBullet
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "game.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. CHomingMissile::CHomingMissile()
  20. {
  21.     m_target = gsCVector(0.f,0.f);
  22.     m_has_target = false;
  23. }
  24.  
  25. //-------------------------------------------------------------
  26.  
  27. CHomingMissile::~CHomingMissile()
  28. {
  29. }
  30.  
  31. //-------------------------------------------------------------
  32.  
  33. bool CHomingMissile::activate()
  34. {
  35.     if (!isActive()) {
  36.         if (m_velocity.getY() < 0.f)
  37.             m_angle = 0.f;
  38.         else
  39.             m_angle = 180.f;
  40.         m_timer.start();
  41.         }
  42.  
  43.     return CActor::activate();
  44. }
  45.  
  46. //-------------------------------------------------------------
  47.  
  48. bool CHomingMissile::update(Controls *controls)
  49. {
  50.     int direction = 0;
  51.  
  52.     m_position += m_velocity;
  53.  
  54.     if (m_has_target && m_timer.getTime() >= HOMING_MISSILE_STARTUP) {
  55.     
  56.         gsCVector relpos = m_target - m_position;
  57.  
  58.         if (relpos.length() > HOMING_MISSILE_THRESHOLD) {
  59.  
  60.             float a = relpos.direction();
  61.  
  62.             float da = a - m_angle;
  63.  
  64.             if (gsAbs(da) < HOMING_MISSILE_TURNRATE)
  65.                 m_angle = a;
  66.             else {
  67.                 while (da < 0.f)
  68.                     da += 360.f;
  69.                 while (da >= 360.f)
  70.                     da -= 360.f;
  71.  
  72.                 if (da < 180.f)
  73.                     m_angle += HOMING_MISSILE_TURNRATE;
  74.                 else
  75.                     m_angle -= HOMING_MISSILE_TURNRATE;
  76.                 }
  77.  
  78.             while (m_angle < 0.f)
  79.                 m_angle += 360.f;
  80.             while (m_angle >= 360.f)
  81.                 m_angle -= 360.f;
  82.             
  83.             setVelocity(gsCVector::polar(getActorInfo().m_speed[m_grade],m_angle));
  84.             }
  85.         else
  86.             m_has_target = false;
  87.         }
  88.  
  89.     direction = ((int) ((m_angle + 22.5f) / 45.f)) & 7;
  90.  
  91.     m_sprite.setFrame(/*(int) m_grade + */ direction);        //TEMP
  92.  
  93.     return true;
  94. }
  95.  
  96. //-------------------------------------------------------------
  97.  
  98. void CHomingMissile::setTarget(const gsCVector& target)
  99. {
  100.     m_target = target;
  101.  
  102.     m_has_target = true;
  103. }
  104.  
  105. //-------------------------------------------------------------
  106.