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

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CLaser
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    07/05/00
  8. //
  9. // Base:    CBullet
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "game.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. CLaser::CLaser()
  20. {
  21.     m_hit_map = 0;
  22. }
  23.  
  24. //-------------------------------------------------------------
  25.  
  26. CLaser::~CLaser()
  27. {
  28. //    CBullet::~CBullet();
  29. }
  30.  
  31. //-------------------------------------------------------------
  32.  
  33. bool CLaser::activate()
  34. {
  35.     if (!isActive()) {
  36.         m_length = LASER_MAX_LENGTH;
  37.         m_dying = false;
  38.         }
  39.  
  40.     return CActor::activate();
  41. }
  42.  
  43. //-------------------------------------------------------------
  44.  
  45. void CLaser::onCollisionWithActor(CActor *actor)
  46. {
  47.     if (m_dying)
  48.         return;
  49.     
  50.     // save colliders for later
  51.  
  52.     m_actor_collider_list.addItem(actor);
  53. }
  54.  
  55. //-------------------------------------------------------------
  56.  
  57. void CLaser::onCollisionWithMap(gsCMap *map,int hits)
  58. {
  59.     if (m_dying)
  60.         return;
  61.  
  62.     // save colliders for later
  63.  
  64.     m_hit_map = map;
  65.  
  66.     m_map_collider_list.setSize(hits);
  67.  
  68.     for (int i = 0; i < hits; i++)
  69.         m_map_collider_list.setItem(i,map->getHitPosition(i));
  70. }
  71.  
  72. //-------------------------------------------------------------
  73.  
  74. void CLaser::postProcessCollision()
  75. {
  76.     // only hit NEAREST actor or map tile
  77.  
  78.     if (m_actor_collider_list.isEmpty() &&
  79.         m_map_collider_list.isEmpty())
  80.         return;
  81.  
  82.     int actor_i = -1;
  83.     float actor_d = 99999.f;
  84.  
  85.     gsCVector pos = getPosition();
  86.  
  87.     for (int i = 0; i < m_actor_collider_list.getSize(); i++) {
  88.         gsCVector cpos = m_actor_collider_list[i]->getPosition();
  89.         float d = (cpos - pos).length();
  90.         if (actor_i == -1 || d < actor_d) {
  91.             actor_i = i;
  92.             actor_d = d;
  93.             }
  94.         }
  95.  
  96.     int map_i = -1;
  97.     float map_d = 99999.f;
  98.  
  99.     if (m_hit_map) {
  100.         gsCPoint tile_size = m_hit_map->getImage()->getTileSize();
  101.         gsCPoint tile_centre = tile_size / gsCPoint(2,2);
  102.  
  103.         for (int i = 0; i < m_map_collider_list.getSize(); i++) {
  104.             // convert map tile coords to world coords
  105.  
  106.             gsCPoint p = m_map_collider_list[i] * tile_size + tile_centre;
  107.             gsCVector mpos((float) p.getX(),(float) p.getY());
  108.  
  109.             float d = (mpos - pos).length();
  110.             if (map_i == -1 || d < map_d) {
  111.                 map_i = i;
  112.                 map_d = d;
  113.                 }
  114.             }
  115.         }
  116.  
  117.     if (actor_d < map_d) {
  118.         CActor *actor = m_actor_collider_list[actor_i];
  119.         actor->registerHit(getActorInfo().m_energy[m_grade],this);
  120.         m_length = (int) actor_d;
  121.         }
  122.     else {
  123.         gsCPoint pos = m_map_collider_list[map_i];
  124.  
  125.         gsCMapTile *mt = m_hit_map->getMapTile(pos);
  126.         if (mt && mt->getUserData(0) == ID_DESTROYABLE_TILE) {
  127.             mt->setHidden(true);
  128.             m_scene->createMapExplosion(m_hit_map,pos);
  129.  
  130.             CPlayGameState::getPlayer()->scoreBonus(5);
  131.             }
  132.  
  133.         m_length = (int) map_d;
  134.         }
  135.         
  136.     m_actor_collider_list.clear();
  137.     m_map_collider_list.clear();
  138.     m_hit_map = 0;
  139.  
  140.     m_dying = true;
  141. }
  142.  
  143. //-------------------------------------------------------------
  144.  
  145. bool CLaser::update(Controls *controls)
  146. {
  147.     m_position += m_velocity;
  148.  
  149.     if (m_dying) {
  150.         m_length += (int) m_velocity.getY();
  151.         if (m_length <= 0) {
  152.             kill();
  153.             return true;
  154.             }
  155.         }
  156.     
  157.     m_sprite.setFrame((int) m_grade);
  158.  
  159.     return true;
  160. }
  161.  
  162. //-------------------------------------------------------------
  163.  
  164. bool CLaser::draw()
  165. {
  166.     gsCScreen *screen = gsCApplication::getScreen();
  167.  
  168.     if (!screen)
  169.         return false;
  170.  
  171.     gsCColour colour;
  172.  
  173.     int flash = m_random.getInt(256);
  174.  
  175.     switch (m_grade) {
  176.         case BULLET_STANDARD:
  177.             colour = gsCColour(0,flash,255);
  178.             break;
  179.         case BULLET_MEDIUM:
  180.             colour = gsCColour(flash,255,0);
  181.             break;
  182.         case BULLET_BEST:
  183.             colour = gsCColour(255,0,flash);
  184.             break;
  185.         }
  186.  
  187.     gsCRect rect = getCollisionRect();
  188.  
  189.     bool on_screen = screen->drawSolidRect(rect,colour);
  190.  
  191.     if (m_is_on_screen && !on_screen)
  192.         onLeavingScreen();
  193.  
  194.     m_is_on_screen = on_screen;
  195.  
  196.     if (m_is_on_screen && !m_dying)
  197.         m_scene->addToCollisionList(this,rect);
  198.  
  199.     return true;
  200. }
  201.  
  202. //-------------------------------------------------------------
  203.  
  204. gsCRect CLaser::getCollisionRect()
  205. {
  206.     gsCPoint pos(getPosition() + m_scene->getMap()->getPosition());
  207.  
  208.     return gsCRect(pos.getX(),
  209.                    pos.getY() - m_length,
  210.                    pos.getX() + 2,
  211.                    pos.getY() + 1);
  212. }
  213.  
  214. //-------------------------------------------------------------
  215.