Advertisement
GaelVanhalst

Space Defender: Enemy Ship

Jan 25th, 2016
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.75 KB | None | 0 0
  1. //---------------------------
  2. // Includes
  3. //---------------------------
  4. #include "EnemyShip.h"
  5.  
  6. //---------------------------
  7. // Defines
  8. //---------------------------
  9. #define GAME_ENGINE (GameEngine::GetSingleton())
  10. Bitmap* EnemyShip::m_BmpShipPtr=nullptr;
  11. //---------------------------
  12. // Constructor & Destructor
  13. //---------------------------
  14. EnemyShip::EnemyShip(DOUBLE2 middlePoint, int radius, double angleCircle):m_MiddlePoint(middlePoint),m_Radius(radius),m_AngleCircle(angleCircle),m_PlayerIsSeen(false),m_BackToRightAngle(true),m_BulletTimer(0)
  15. {
  16.     if(m_BmpShipPtr==nullptr)
  17.     {
  18.         m_BmpShipPtr= new Bitmap("./Resources/EnemyShip.png");
  19.         if(m_BmpShipPtr->Exists())
  20.         {
  21.             m_BmpShipPtr->SetTransparencyColor(255,0,255);
  22.         }
  23.     }
  24.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  25.     {
  26.         m_BulletPtrArr[i]=new Bullet();
  27.     }
  28.  
  29.     // nothing to create
  30. }
  31.  
  32. EnemyShip::~EnemyShip()
  33. {
  34.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  35.     {
  36.         delete m_BulletPtrArr[i];
  37.     }
  38.     // nothing to destroy
  39. }
  40.  
  41. //---------------------------
  42. // Own methods
  43. //---------------------------
  44.  
  45. void EnemyShip::Tick(double deltaTime,DOUBLE2 playerCoordinates)
  46. {
  47.     //Explosion animation
  48.     if(m_IsExploding)
  49.     {
  50.         m_Angle+=0.03*deltaTime;
  51.         m_DoesBoem-=deltaTime;
  52.         if(m_DoesBoem<=0)
  53.         {
  54.             m_IsExploding=false;
  55.             m_Activated=false;
  56.         }
  57.     }
  58.     else if(m_Activated)
  59.     {
  60.         //Shoot if player is seen
  61.         if(m_PlayerIsSeen)
  62.         {
  63.             if(m_BulletTimer<=0&&rand()%RANDOMSHOOTCHANCE==0)
  64.             {
  65.                 FireBullet();
  66.             }
  67.             m_BulletTimer-=deltaTime;
  68.         }
  69.  
  70.         //Check if player is in range to shoot
  71.         PlayerInRadius(playerCoordinates);
  72.  
  73.  
  74.         //Rotating back
  75.         if(!m_BackToRightAngle&&!m_PlayerIsSeen)
  76.         {
  77.             double expectedAngle,givenAngle;
  78.             int expectedAngleInt,givenAngleInt;
  79.             expectedAngle=(m_AngleCircle+(1.000*(M_PI/2)));
  80.             givenAngle=m_Angle;
  81.  
  82.             expectedAngleInt=(int)(expectedAngle*180/(M_PI));
  83.             givenAngleInt=(int)(givenAngle*180/(M_PI));
  84.             expectedAngleInt=expectedAngleInt%360;
  85.             givenAngleInt=givenAngleInt%360;
  86.  
  87.             int deltaAngle=(expectedAngleInt-givenAngleInt);
  88.             if(abs(deltaAngle)<LOWANGLE||abs(deltaAngle)>HIGHANGLE)
  89.             {
  90.                 m_Angle=m_AngleCircle+(1.000*(M_PI/2));
  91.                 m_BackToRightAngle=true;
  92.             }
  93.             else
  94.             {
  95.                 m_Angle-=(2*M_PI*deltaTime);
  96.             }
  97.         }
  98.  
  99.         //Fly around
  100.         if(!m_PlayerIsSeen&&m_BackToRightAngle)
  101.         {
  102.             m_AngleCircle+=deltaTime*(1.000*DELTADISTANCE/m_Radius);
  103.             m_Coordinates.x=m_MiddlePoint.x+m_Radius*cos(m_AngleCircle);
  104.             m_Coordinates.y=m_MiddlePoint.y+m_Radius*sin(m_AngleCircle);
  105.  
  106.             m_Angle=m_AngleCircle+(1.000*(M_PI/2));
  107.         }
  108.     }
  109.  
  110.     //Tick for active bullets
  111.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  112.     {
  113.         m_BulletPtrArr[i]->Tick(deltaTime);
  114.     }
  115. }
  116.  
  117. void EnemyShip::Paint()
  118. {
  119.     RECT ANIMATION;
  120.     ANIMATION.left=0;
  121.     ANIMATION.top=0;
  122.     ANIMATION.right=ANIMATION.left+SIZE;
  123.     ANIMATION.bottom=ANIMATION.top+SIZE;
  124.     if(m_IsExploding)
  125.     {
  126.         double opacity=1;
  127.         opacity=1.000*m_DoesBoem/(EXPLOSIONDURATION*0.1);
  128.         if (opacity<0.1)opacity=0.1;
  129.  
  130.         ANIMATION.left=SIZE;
  131.         ANIMATION.top=0;
  132.         ANIMATION.right=ANIMATION.left+SIZE;
  133.         ANIMATION.bottom=ANIMATION.top+SIZE;
  134.  
  135.         m_BmpShipPtr->SetOpacity(opacity/4);
  136.         GAME_ENGINE->DrawBitmap(m_BmpShipPtr,-SIZE/2,-SIZE/2,ANIMATION);
  137.        
  138.         m_BmpShipPtr->SetOpacity(1);
  139.  
  140.         if(m_ShowExplosion)
  141.         {
  142.             ExplosionPaint(opacity);
  143.         }
  144.     }
  145.     else GAME_ENGINE->DrawBitmap(m_BmpShipPtr,-SIZE/2,-SIZE/2,ANIMATION);
  146. }
  147.  
  148. //Check if player is in range
  149. void EnemyShip::PlayerInRadius(DOUBLE2 playerCoordinates)
  150. {
  151.     DOUBLE2 distance=(playerCoordinates-m_Coordinates);
  152.     if(((distance).Length())<WATCHRADIUS)
  153.     {
  154.         DOUBLE2 basic(1,0);
  155.         m_PlayerIsSeen=true;
  156.  
  157.         m_Angle=basic.AngleWith(distance);
  158.  
  159.         m_BackToRightAngle=false;
  160.     }
  161.     else if(m_PlayerIsSeen)
  162.     {
  163.         if(((distance).Length())>WATCHRADIUS+EXTRAWATCH)
  164.         {
  165.             m_PlayerIsSeen=false;
  166.  
  167.         }
  168.     }
  169.     else m_PlayerIsSeen=false;
  170. }
  171.  
  172. void EnemyShip::Move(DOUBLE2 middleCoordinates,int radius)
  173. {
  174.     m_MiddlePoint=middleCoordinates;
  175.     m_Radius=radius;
  176. }
  177.  
  178. void EnemyShip::BulletPaint()
  179. {
  180.         m_BulletPtrArr[0]->Paint();
  181. }
  182.  
  183. bool EnemyShip::FireBullet()
  184. {
  185.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  186.     {
  187.         if(!m_BulletPtrArr[i]->IsActivated())
  188.         {
  189.             DOUBLE2 coordinates(m_Coordinates);
  190.             coordinates.x+=HITRADIUS*cos(m_Angle);
  191.             coordinates.y+=HITRADIUS*sin(m_Angle);
  192.             m_BulletPtrArr[i]->Fire(m_Angle,coordinates);
  193.             m_BulletTimer=1;
  194.             return true;
  195.         }
  196.     }
  197.     return false;
  198. }
  199.  
  200. void EnemyShip::HitDetectionBullet(HitRegion * level)
  201. {
  202.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  203.     {
  204.         if(m_BulletPtrArr[i]->IsActivated())
  205.         {
  206.             DOUBLE2 bulletCoordinate=m_BulletPtrArr[i]->GetCoordinates();
  207.             if(level->HitTest(bulletCoordinate))
  208.             {
  209.                 m_BulletPtrArr[i]->Hits();
  210.             }
  211.         }
  212.     }
  213. }
  214.  
  215. DOUBLE2 EnemyShip::GetHitMiddlePoints(int i)
  216. {
  217.     DOUBLE2 coordinates=m_Coordinates;
  218.     switch (i)
  219.     {
  220.         case 0:
  221.             coordinates.x+=HITXONE;
  222.             break;
  223.         case 1:
  224.             coordinates.x+=-HITXTWO;
  225.  
  226.             coordinates.y+=-HITYONE;
  227.             break;
  228.         case 2:
  229.             coordinates.x+=-HITXTWO;
  230.  
  231.             coordinates.y+=HITYONE;
  232.             break;
  233.     default:
  234.         break;
  235.  
  236.     }
  237.     return coordinates;
  238. }
  239.  
  240. int EnemyShip::GetHitRadius(bool sub)
  241. {
  242.     if(sub)
  243.     {
  244.         return HITRADIUS;
  245.     }
  246.     else return HITRADIUSSUB;
  247. }
  248.  
  249. void EnemyShip::BulletHits(int i)
  250. {
  251.     m_BulletPtrArr[i]->Hits();
  252. }
  253.  
  254. void EnemyShip::Reset()
  255. {
  256.     m_Activated=true;
  257.     m_IsExploding=false;
  258.     m_DoesBoem=0;
  259.  
  260.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  261.     {
  262.         m_BulletPtrArr[i]->Hits();
  263.     }
  264. }
  265.  
  266. bool EnemyShip::CheckHitAttackRocket(DOUBLE2 *pointArr, int AmountPoints)
  267. {
  268.     if(!CanHit())return false;
  269.    
  270.  
  271.     for (int i = 0; i < AmountPoints; i++)
  272.     {
  273.         if((HITRADIUS)>=(m_Coordinates-pointArr[i]).Length())
  274.         {
  275.             DOUBLE2 subPointsArr[AMOUNTSUBPOINTS];
  276.             for (int m = 0; m < AMOUNTSUBPOINTS; m++)
  277.             {
  278.                 subPointsArr[m].x=0;
  279.                 subPointsArr[m].y=0;
  280.             }
  281.             subPointsArr[0].x+=HITXONE;
  282.             subPointsArr[1].x+=-HITXTWO;
  283.             subPointsArr[1].y+=-HITYONE;
  284.             subPointsArr[2].x+=-HITXTWO;
  285.             subPointsArr[2].y+=HITYONE;
  286.             PointRelocator(subPointsArr,AMOUNTSUBPOINTS);
  287.  
  288.             for (int m = 0; m < AMOUNTSUBPOINTS; m++)
  289.             {
  290.                 if((HITRADIUSSUB)>=(subPointsArr[m]-pointArr[i]).Length())
  291.                 {
  292.                     return true;
  293.                 }
  294.             }
  295.         }
  296.     }
  297.     return false;
  298. }
  299.  
  300. //Transform points
  301. void EnemyShip::PointRelocator(DOUBLE2 *pointArr, int AmountPoints)
  302. {
  303.     MATRIX3X2 matTranslate, matRotate, matWorldTransform;
  304.     matTranslate.SetAsTranslate(m_Coordinates);
  305.     matRotate.SetAsRotate(m_Angle);
  306.     matWorldTransform=matRotate*matTranslate;
  307.     for (int i = 0; i < AmountPoints; i++)
  308.     {
  309.         pointArr[i]=matWorldTransform.TransformPoint(pointArr[i]);
  310.     }
  311. }
  312.  
  313. void EnemyShip::CheckHitExplosion(DOUBLE2 explosionCoordinate, double explosionRadius)
  314. {
  315.     if(CanHit())
  316.     {
  317.         if((HITRADIUS+explosionRadius)>=(m_Coordinates-explosionCoordinate).Length())
  318.         {
  319.             SetDestroyed();
  320.         }
  321.     }
  322.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  323.     {
  324.         if(m_BulletPtrArr[i]->IsActivated())
  325.         {
  326.             DOUBLE2 bulletCoordinate=m_BulletPtrArr[i]->GetCoordinates();
  327.             if((explosionRadius)>=(bulletCoordinate-explosionCoordinate).Length())
  328.             {
  329.                 m_BulletPtrArr[i]->Hits();
  330.             }
  331.         }
  332.     }
  333. }
  334.  
  335. void EnemyShip::BulletsHit(bool* booleanArr, int lengthArr)
  336. {
  337.     if(lengthArr<=AMOUNTOFBULLETS)
  338.     {
  339.         for (int i = 0; i < AMOUNTOFBULLETS; i++)
  340.         {
  341.             if(booleanArr[i])m_BulletPtrArr[i]->Hits();
  342.         }
  343.     }
  344. }
  345.  
  346. int EnemyShip::SendOutBullets(DOUBLE2* emptyArr,bool* booleanArr, int lengthArr,bool andAngle, double *angleArr)
  347. {
  348.     if(lengthArr<AMOUNTOFBULLETS)
  349.     {
  350.         return 0;
  351.     }
  352.     for (int i = 0; i < lengthArr; i++)
  353.     {
  354.         booleanArr[i]=false;
  355.     }
  356.     for (int i = 0; i < AMOUNTOFBULLETS; i++)
  357.     {
  358.         if(m_BulletPtrArr[i]->IsActivated())
  359.         {
  360.             emptyArr[i]=m_BulletPtrArr[i]->GetCoordinates();
  361.             booleanArr[i]=true;
  362.         }
  363.         if(andAngle)
  364.         {
  365.             angleArr[i]=m_BulletPtrArr[i]->GetAngle();
  366.         }
  367.     }
  368.     return AMOUNTOFBULLETS;
  369. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement