home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / demo2 / actor.cpp next >
Encoding:
C/C++ Source or Header  |  2000-09-13  |  3.9 KB  |  194 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CActor
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    06/05/00
  8. //
  9. // Base:    None
  10. //
  11. // Derived:    CShip
  12. //            CAlien
  13. //            CBullet
  14. //            CPickup
  15. //
  16. //-------------------------------------------------------------
  17.  
  18. #include "demo2.h"
  19.  
  20. //-------------------------------------------------------------
  21.  
  22. CActor::CActor()
  23. {
  24.     m_scene = 0;
  25.     m_owner = 0;
  26.     m_is_active = false;
  27.     m_is_on_screen = false;
  28.     m_is_hit = false;
  29.     m_score_multiplier = 1.f;
  30. }
  31.  
  32. //-------------------------------------------------------------
  33.  
  34. CActor::~CActor()
  35. {
  36. }
  37.  
  38. //-------------------------------------------------------------
  39.  
  40. bool CActor::activate()
  41. {
  42.     if (!m_is_active) {
  43.     
  44.         const ActorInfo& info = getActorInfo();
  45.  
  46.         if (info.m_filename)
  47.             m_image = m_scene->getImage(info.m_filename);
  48.         else
  49.             m_image = 0;
  50.  
  51.         m_sprite.setImage(m_image);
  52.         m_sprite.setHotspot(gsCPoint(info.m_hotspot_x,
  53.                                      info.m_hotspot_y));
  54.         m_sprite.setActive(m_image != 0);
  55.  
  56.         m_shield = info.m_initial_shield;
  57.  
  58.         m_is_active = true;
  59.         m_is_on_screen = false;
  60.         m_is_hit = false;
  61.         }
  62.  
  63.     return true;
  64. }
  65.  
  66. //-------------------------------------------------------------
  67.  
  68. void CActor::kill()
  69. {
  70.     m_is_active = false;
  71. }
  72.  
  73. //-------------------------------------------------------------
  74.  
  75. void CActor::explode()
  76. {
  77. }
  78.         
  79. //-------------------------------------------------------------
  80.  
  81. void CActor::registerHit(int energy,CActor *hitter)
  82. {
  83.     if (m_shield != INFINITE_SHIELD) {
  84.         if (m_shield > 0) {
  85.             m_shield -= energy;
  86.             if (m_shield <= 0) {
  87.                 m_shield = 0;
  88.                 onKilled();
  89.                 }
  90.             }
  91.  
  92.         m_is_hit = true;
  93.         m_hit_timer.start();
  94.         }
  95. }
  96.  
  97. //-------------------------------------------------------------
  98.  
  99. void CActor::onKilled()
  100. {
  101. }
  102.  
  103. //-------------------------------------------------------------
  104.  
  105. bool CActor::draw()
  106. {
  107.     if (isActive() && m_image) {
  108.         m_sprite.setPosition(gsCPoint(m_position));
  109.  
  110.         if (m_is_hit) {
  111.             if (m_hit_timer.getTime() > ACTOR_HIT_TIME) {
  112.                 m_hit_timer.reset();
  113.                 m_is_hit = false;
  114.                 }
  115.             }
  116.  
  117.         if (m_is_hit) {
  118.             int level = (int) (255.f * (1.f - m_hit_timer.getTime() / ACTOR_HIT_TIME));
  119.             m_sprite.enableFillColour(gsCColour(level,level,level));
  120.             }
  121.         else
  122.             m_sprite.disableFillColour();
  123.  
  124.         bool was_on_screen = m_is_on_screen;
  125.  
  126.         m_is_on_screen = m_sprite.draw();
  127.  
  128.         if (was_on_screen && !m_is_on_screen)
  129.             onLeavingScreen();
  130.  
  131. //        if (m_is_on_screen)
  132. //            m_scene->addToCollisionList(this,getCollisionRect());
  133.         }
  134.  
  135.     return true;
  136. }
  137.  
  138. //-------------------------------------------------------------
  139. // animate over range of frames
  140.  
  141. bool CActor::animate(AnimationMode mode,int first_frame,int num_frames)
  142. {
  143.     bool finished = false;
  144.  
  145.     int frame;
  146.  
  147.     if (num_frames <= 1)
  148.         frame = 0;
  149.     else {
  150.         frame = (int) (m_timer.getTime() * getActorInfo().m_anim_rate);
  151.  
  152.         switch (mode) {
  153.             case ANIMATE_LOOP:
  154.                 frame = frame % (num_frames - 1);    // cycle repeatedly
  155.                 break;
  156.             case ANIMATE_ONESHOT:
  157.                 if (frame >= num_frames) {
  158.                     frame = num_frames - 1;            // stay on last frame
  159.                     finished = true;                // flag that we've finished
  160.                     }
  161.                 break;
  162.             }
  163.         }
  164.  
  165.     m_sprite.setFrame(first_frame + frame);
  166.  
  167.     return finished;
  168. }
  169.  
  170. //-------------------------------------------------------------
  171. // animate over entire range
  172.  
  173. bool CActor::animate(AnimationMode mode)
  174. {
  175.     return animate(mode,0,m_image->getNumTiles());
  176. }
  177.  
  178. //-------------------------------------------------------------
  179. // Convert velocity into a direction (0..num_dir-1)
  180.  
  181. int CActor::getDirection(int num_dir)
  182. {
  183.     if (m_velocity.length() == 0.f)
  184.         return 0;
  185.  
  186.     float angle = m_velocity.direction();
  187.  
  188.     float step = 360.f / (float) num_dir;
  189.     
  190.     return ((int) ((angle - step / 2.f + 360.f) / step)) & (num_dir - 1);
  191. }
  192.  
  193. //-------------------------------------------------------------
  194.