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

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CParticleEffect
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    06/05/00
  8. //
  9. // Base:    CActor
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "game.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. CParticleEffect::CParticleEffect()
  20. {
  21.     m_point_force = false;
  22.     m_force_position = gsCVector(0.f,0.f);
  23.     m_force_direction = gsCVector(0.f,0.f);
  24.     m_force_strength = 1.f;
  25.     m_lifetime = INFINITE_LIFETIME;
  26. }
  27.  
  28. //-------------------------------------------------------------
  29.  
  30. CParticleEffect::~CParticleEffect()
  31. {
  32.     destroy();
  33.  
  34. //    CActor::~CActor();
  35. }
  36.  
  37. //-------------------------------------------------------------
  38.  
  39. void CParticleEffect::destroy()
  40. {
  41.     for (int i = 0; i < m_particle_list.getSize(); i++)
  42.         delete m_particle_list[i];
  43.  
  44.     m_particle_list.clear();
  45. }
  46.  
  47. //-------------------------------------------------------------
  48.  
  49. bool CParticleEffect::activate()
  50. {
  51.     if (!isActive()) {
  52.         m_timer.start();
  53.         m_life_timer.start();
  54.         }
  55.  
  56.     return CActor::activate();
  57. }
  58.  
  59. //-------------------------------------------------------------
  60.  
  61. void CParticleEffect::kill()
  62. {
  63.     destroy();
  64.  
  65.     CActor::kill();
  66. }
  67.  
  68. //-------------------------------------------------------------
  69.  
  70. void CParticleEffect::onLeavingScreen()
  71. {
  72.     if (!getOwner())
  73.         kill();
  74. }
  75.  
  76. //-------------------------------------------------------------
  77.  
  78. bool CParticleEffect::update(Controls *controls)
  79. {
  80.     // update effect global position
  81.  
  82.     if (getOwner())
  83.         m_position = getOwner()->getPosition() + m_offset;
  84.     else
  85.         m_position += m_velocity;
  86.  
  87.     // create new particle
  88.  
  89.     if (m_lifetime == INFINITE_LIFETIME ||
  90.         m_life_timer.getTime() < m_lifetime) {
  91.         Particle *p = createParticle();
  92.         if (p)
  93.             m_particle_list.addItem(p);
  94.         }
  95.     else {
  96.         if (m_particle_list.isEmpty()) {
  97.             kill();
  98.             return true;
  99.             }
  100.         }
  101.  
  102.     // update all
  103.  
  104.     float delta_time = gsCTimer::getDeltaTime();
  105.  
  106.     for (int i = m_particle_list.getSize() - 1; i >= 0 ; i--) {
  107.         Particle *p = m_particle_list[i];
  108.  
  109.         p->m_age += delta_time;
  110.  
  111.         if (p->m_age >= p->m_lifetime) {
  112.  
  113.             // kill particle
  114.  
  115.             delete m_particle_list[i];
  116.             m_particle_list.removeIndex(i);
  117.             }
  118.         else {
  119.             p->m_position += p->m_velocity;
  120.  
  121.             if (m_point_force) {
  122.                 //NYI
  123.                 }
  124.             else {
  125.                 //NYI
  126.                 }
  127.             }
  128.         }
  129.  
  130.     return true;
  131. }
  132.  
  133. //-------------------------------------------------------------
  134.  
  135. bool CParticleEffect::draw()
  136. {
  137.     gsCRect screen_rect = gsCApplication::getScreen()->getRect();
  138.  
  139.     if (!screen_rect.contains(m_position + m_scene->getMap()->getPosition())) {
  140.         onLeavingScreen();
  141.         return true;
  142.         }
  143.  
  144.     for (int i = m_particle_list.getSize() - 1; i >= 0 ; i--) {
  145.         Particle *p = m_particle_list[i];
  146.         
  147.         int frame = (int) (m_image->getNumTiles() * p->m_age / p->m_lifetime);
  148.  
  149.         if (!m_image->draw(frame,p->m_position + m_scene->getMap()->getPosition())) {
  150.  
  151.             // kill particle
  152.  
  153.             delete m_particle_list[i];
  154.             m_particle_list.removeIndex(i);
  155.             }
  156.         }
  157.  
  158.     return true;
  159. }
  160.  
  161. //-------------------------------------------------------------
  162.