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

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    Ship
  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 "demo2.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. CShip::CShip()
  20. {
  21.     m_weapon = 0;
  22.     m_weapon_type = NO_WEAPON;
  23.  
  24.     m_left_engine = 0;
  25.     m_right_engine = 0;
  26.     m_retro_nw = 0;
  27.     m_retro_ne = 0;
  28.     m_retro_sw = 0;
  29.     m_retro_se = 0;
  30.  
  31.     m_max_speed = 200.f;
  32.     m_acceleration = 1000.f;
  33.     m_damping = 1500.f;
  34. }
  35.  
  36. //-------------------------------------------------------------
  37.  
  38. CShip::~CShip()
  39. {
  40. }
  41.  
  42. //-------------------------------------------------------------
  43.  
  44. bool CShip::activate()
  45. {
  46.     if (!isActive()) {
  47.         m_roll = 0;
  48.         setWeapon(NO_WEAPON);
  49.         setVelocity(gsCVector(0.f,0.f));
  50.  
  51.         m_left_engine = new CShipEngine;
  52.         m_scene->addActor(m_left_engine);
  53.         m_left_engine->activate();
  54.         m_left_engine->setOwner(this);
  55.         m_left_engine->setOffset(gsCVector(-7.f,29.f));
  56.         m_left_engine->setParams(gsCVector(0.f,-16.f),gsCVector(0.f,0.f),0.05f);
  57.  
  58.         m_right_engine = new CShipEngine;
  59.         m_scene->addActor(m_right_engine);
  60.         m_right_engine->activate();
  61.         m_right_engine->setOwner(this);
  62.         m_right_engine->setOffset(gsCVector(7.f,29.f));
  63.         m_right_engine->setParams(gsCVector(0.f,-16.f),gsCVector(0.f,0.f),0.05f);
  64.  
  65.         m_retro_nw = new CRetroEngine;
  66.         m_scene->addActor(m_retro_nw);
  67.         m_retro_nw->activate();
  68.         m_retro_nw->setOwner(this);
  69.         m_retro_nw->setOffset(gsCVector(-30.f,-20.f));
  70.         m_retro_nw->setDirection(RETRO_NW);
  71.         m_retro_nw->setParams(gsCVector(12.f,12.f),gsCVector(0.f,0.f),0.05f);
  72.  
  73.         m_retro_ne = new CRetroEngine;
  74.         m_scene->addActor(m_retro_ne);
  75.         m_retro_ne->activate();
  76.         m_retro_ne->setOwner(this);
  77.         m_retro_ne->setOffset(gsCVector(30.f,-20.f));
  78.         m_retro_ne->setDirection(RETRO_NE);
  79.         m_retro_ne->setParams(gsCVector(-12.f,12.f),gsCVector(0.f,0.f),0.05f);
  80.  
  81.         m_retro_sw = new CRetroEngine;
  82.         m_scene->addActor(m_retro_sw);
  83.         m_retro_sw->activate();
  84.         m_retro_sw->setOwner(this);
  85.         m_retro_sw->setOffset(gsCVector(-30.f,30.f));
  86.         m_retro_sw->setDirection(RETRO_SW);
  87.         m_retro_sw->setParams(gsCVector(12.f,-12.f),gsCVector(0.f,0.f),0.05f);
  88.  
  89.         m_retro_se = new CRetroEngine;
  90.         m_scene->addActor(m_retro_se);
  91.         m_retro_se->activate();
  92.         m_retro_se->setOwner(this);
  93.         m_retro_se->setOffset(gsCVector(30.f,30.f));
  94.         m_retro_se->setDirection(RETRO_SE);
  95.         m_retro_se->setParams(gsCVector(-12.f,-12.f),gsCVector(0.f,0.f),0.05f);
  96.         
  97.         m_timer.reset();
  98.         }
  99.  
  100.     return CActor::activate();
  101. }
  102.  
  103. //-------------------------------------------------------------
  104.  
  105. void CShip::explode()
  106. {
  107.     CActor::explode();
  108. }
  109.  
  110. //-------------------------------------------------------------
  111.  
  112. void CShip::kill()
  113. {
  114.     if (m_left_engine) {
  115.         m_left_engine->kill();
  116.         m_left_engine = 0;
  117.         }
  118.     if (m_right_engine) {
  119.         m_right_engine->kill();
  120.         m_right_engine = 0;
  121.         }
  122.     if (m_retro_nw) {
  123.         m_retro_nw->kill();
  124.         m_retro_nw = 0;
  125.         }
  126.     if (m_retro_ne) {
  127.         m_retro_ne->kill();
  128.         m_retro_ne = 0;
  129.         }
  130.     if (m_retro_sw) {
  131.         m_retro_sw->kill();
  132.         m_retro_sw = 0;
  133.         }
  134.     if (m_retro_se) {
  135.         m_retro_se->kill();
  136.         m_retro_se = 0;
  137.         }
  138. if (m_weapon) {
  139.         m_weapon->kill();
  140.         m_weapon = 0;
  141.         }
  142.     
  143.     CActor::kill();
  144. }
  145.  
  146. //-------------------------------------------------------------
  147.  
  148. bool CShip::update(Controls *controls)
  149. {
  150.     if (m_shield == 0)
  151.         return true;
  152.  
  153.     gsCVector thrust(0.f,0.f);
  154.  
  155.     int required_roll = 0;
  156.  
  157.     float t = gsCTimer::getDeltaTime();
  158.  
  159.     if (controls) {
  160.  
  161.         if (controls->left) {
  162.             thrust.setX(-m_acceleration);
  163.             required_roll = -SHIP_ROLL_FRAMES;
  164.             }
  165.         if (controls->right) {
  166.             thrust.setX(m_acceleration);
  167.             required_roll = SHIP_ROLL_FRAMES;
  168.             }
  169.         if (controls->up) {
  170.             thrust.setY(-m_acceleration);
  171.             }
  172.         if (controls->down) {
  173.             thrust.setY(m_acceleration);
  174.             }
  175.  
  176.         float x = m_velocity.getX();
  177.         
  178.         if (thrust.getX() != 0.f) {
  179.             x += thrust.getX() * t;
  180.             if (x < -m_max_speed)
  181.                 x = -m_max_speed;
  182.             if (x > m_max_speed)
  183.                 x = m_max_speed;
  184.             }
  185.         else {
  186.             if (x > 0.f) {
  187.                 x -= m_damping * t;
  188.                 if (x < 0.f)
  189.                     x = 0.f;
  190.                 }
  191.             else {
  192.                 x += m_damping * t;
  193.                 if (x > 0.f)
  194.                     x = 0.f;
  195.                 }
  196.             }
  197.  
  198.         float y = m_velocity.getY();
  199.         
  200.         if (thrust.getY() != 0.f) {
  201.             y += thrust.getY() * t;
  202.             if (y < -m_max_speed)
  203.                 y = -m_max_speed;
  204.             if (y > m_max_speed)
  205.                 y = m_max_speed;
  206.             }
  207.         else {
  208.             if (y > 0.f) {
  209.                 y -= m_damping * t;
  210.                 if (y < 0.f)
  211.                     y = 0.f;
  212.                 }
  213.             else {
  214.                 y += m_damping * t;
  215.                 if (y > 0.f)
  216.                     y = 0.f;
  217.                 }
  218.             }
  219.  
  220.         m_velocity = gsCVector(x,y);
  221.         }
  222.  
  223.     m_position += m_velocity * gsCVector(t,t);
  224.  
  225.     m_position += gsCVector(0.f,(float) -CPlayGameState::getYScroll());
  226.  
  227.     gsCScreen *screen = gsCApplication::getScreen();
  228.  
  229.     float minx = 0.f;
  230.     float maxx = (float) screen->getSize().getX();
  231.     float miny = (float) 0.f;
  232.     float maxy = (float) screen->getSize().getY();
  233.  
  234.     m_position.clamp(minx + 32.f,maxx - 32.f,miny + 32.f,maxy - 32.f);
  235.  
  236.     if (m_roll == required_roll)
  237.         m_timer.reset();
  238.     else {
  239.         if (m_timer.getState() == gsTIMER_RESET)
  240.             m_timer.start();
  241.         else {
  242.             if (m_timer.getTime() >= 1.f / SHIP_ROLL_RATE) {
  243.                 if (required_roll < m_roll)
  244.                     m_roll--;
  245.                 else
  246.                     m_roll++;
  247.                 if (m_roll != required_roll)
  248.                     m_timer.start();
  249.                 }
  250.             }
  251.         }
  252.  
  253.     m_sprite.setFrame(SHIP_CENTRE_FRAME + m_roll);
  254.  
  255.     if (CPlayGameState::getYScroll() == 1) {
  256.         if (m_left_engine)
  257.             m_left_engine->applyThrust(thrust.getY() <= 0.f);
  258.         if (m_right_engine)
  259.             m_right_engine->applyThrust(thrust.getY() <= 0.f);
  260.         }
  261.     else {
  262.         if (m_left_engine)
  263.             m_left_engine->applyThrust(thrust.getY() < 0.f);
  264.         if (m_right_engine)
  265.             m_right_engine->applyThrust(thrust.getY() < 0.f);
  266.         }
  267.  
  268.     if (m_retro_nw)
  269.         m_retro_nw->applyThrust(thrust.getY() > 0.f && thrust.getX() >= 0);
  270.     if (m_retro_ne)
  271.         m_retro_ne->applyThrust(thrust.getY() > 0.f && thrust.getX() <= 0);
  272.  
  273.     if (m_retro_sw)
  274.         m_retro_sw->applyThrust((thrust.getX() > 0.f && thrust.getY() <= 0) ||
  275.                                 (thrust.getX() == 0.f && thrust.getY() < 0.f));
  276.     if (m_retro_se)
  277.         m_retro_se->applyThrust((thrust.getX() < 0.f && thrust.getY() <= 0) ||
  278.                                 (thrust.getX() == 0.f && thrust.getY() < 0.f));
  279.  
  280.     return true;
  281. }
  282.  
  283. //-------------------------------------------------------------
  284.  
  285. gsCRect CShip::getCollisionRect()
  286. {
  287.     gsCRect r = m_sprite.getRect();
  288.  
  289.     r.expand(-8);
  290.  
  291.     return r;
  292. }
  293.  
  294. //-------------------------------------------------------------
  295.  
  296. void CShip::registerHit(int energy,CActor *hitter)
  297. {
  298.     CActor::registerHit(energy,hitter);
  299. }
  300.  
  301. //-------------------------------------------------------------
  302.  
  303. void CShip::onCollisionWithActor(CActor *actor)
  304. {
  305.     switch (actor->getActorInfo().m_type) {
  306.         case ACTOR_TYPE_ALIEN:
  307.             registerHit(1,this);
  308.             break;
  309.         }
  310. }
  311.  
  312. //-------------------------------------------------------------
  313.  
  314. void CShip::setWeapon(WeaponType type,WeaponGrade grade)
  315. {
  316.     if (m_weapon) {
  317.         m_weapon->kill();
  318.         m_weapon = 0;
  319.         }
  320.  
  321.     m_weapon_type = type;
  322.  
  323.     switch (m_weapon_type) {
  324.         case MISSILE_WEAPON:
  325.             m_weapon = new CMissileWeapon;
  326.             break;
  327.         }
  328.  
  329.     if (m_weapon) {
  330.         m_scene->addActor(m_weapon);
  331.         m_weapon->activate();
  332.         m_weapon->setOwner(this);
  333.         m_weapon->setGrade(grade);
  334.         }
  335. }
  336.  
  337. //-------------------------------------------------------------
  338.  
  339. WeaponType CShip::getWeaponType()
  340. {
  341.     return m_weapon_type;
  342. }
  343.  
  344. //-------------------------------------------------------------
  345.