home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 July & August / PCWorld_2006-07-08_cd.bin / temacd / planearcade / planearcade.exe / Tank3.bmp / bullets.cpp < prev    next >
C/C++ Source or Header  |  2004-10-08  |  8KB  |  327 lines

  1.  
  2. #include "main.h"
  3.  
  4. //Inicializacia zasobnika
  5. //------------------------------------------------------------------
  6. void BULLETSYSTEM::Initialize()
  7. {
  8.  
  9.     //log
  10.     LogPrint("Vytvaram zasobnik striel");
  11.  
  12.     //vynulovanie
  13.     VertexBuffer = NULL;
  14.     ActBullet = 0;
  15.     Friendly = false;
  16.     UnFriendly = false;
  17.  
  18.     //Vertex Buffer
  19.     if( FAILED( g_pd3dDevice->CreateVertexBuffer( Bullet_MaxBullets*3*sizeof(CUSTOMVERTEXBULLET),
  20.                                                   D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, 
  21.                                                   D3DFVF_CUSTOMVERTEXBULLET,
  22.                                                   D3DPOOL_DEFAULT, &VertexBuffer, NULL ) ) )
  23.     {
  24.         LogPrint(" chyba pri vytvarani Vertex Bufferu");
  25.     }
  26.     else
  27.     {
  28.         LogPrint(" Vertex Buffer vytvoreny");
  29.     }
  30.  
  31. }
  32.  
  33. //destruktor
  34. //------------------------------------------------------------------
  35. BULLETSYSTEM::~BULLETSYSTEM()
  36. {
  37.  
  38.     if (VertexBuffer)
  39.         VertexBuffer->Release();
  40.     VertexBuffer = NULL;
  41.  
  42. }
  43.  
  44. //resetuje hodnoty
  45. //-----------------------------------------------------------------
  46. void BULLETSYSTEM::Reset()
  47. {
  48.  
  49.     ActBullet = 0;
  50.  
  51.     for (int i=0;i<Bullet_MaxBullets;i++)
  52.     {
  53.         Bullet[i].Active = false;
  54.     }
  55. }
  56.  
  57. //refresh - vyrenderovanie a posunutie
  58. //-----------------------------------------------------------------
  59. void BULLETSYSTEM::Refresh()
  60. {
  61.  
  62.     int i;
  63.  
  64.     ///////////
  65.     //Process//
  66.     ///////////
  67.     //posunie jednotlive gulky
  68.     
  69.     VECTOR3D PomPos;
  70.  
  71.     for (i = 0;i<Bullet_MaxBullets;i++)
  72.     {
  73.  
  74.         if (Bullet[i].Active == false)
  75.             continue;
  76.  
  77.         //ak je mimo hracej plochy tak deaktivuj
  78.         if ((Bullet[i].Pos.X > F_MapSize || Bullet[i].Pos.X < -F_MapSize) ||
  79.             (Bullet[i].Pos.Z > F_MapSize || Bullet[i].Pos.Z < -F_MapSize) ||
  80.             (Bullet[i].Pos.Y > F_MapSize || Bullet[i].Pos.Y < -F_MapSize))
  81.             Bullet[i].Active = false;
  82.             
  83.  
  84.         PomPos.X = Bullet[i].Pos.X + Power(Bullet_Speed)*(Bullet[i].Sme.X);
  85.         PomPos.Y = Bullet[i].Pos.Y + Power(Bullet_Speed)*(Bullet[i].Sme.Y);
  86.         PomPos.Z = Bullet[i].Pos.Z + Power(Bullet_Speed)*(Bullet[i].Sme.Z);
  87.  
  88.         //kolizia
  89.         if (Collision(Bullet[i].Pos, PomPos) == true)
  90.         {
  91.             Bullet[i].Active = false;
  92.         }
  93.         
  94.         //inak posun
  95.         Bullet[i].Pos = PomPos;
  96.     }
  97.  
  98.     //////////
  99.     //Render//
  100.     //////////
  101.     int NumVertices = 0;
  102.     CUSTOMVERTEXBULLET *Vertices;
  103.  
  104.     //zisti kolko bulletov
  105.     for (i = 0;i<Bullet_MaxBullets;i++)
  106.     {
  107.         if (Bullet[i].Active == false)
  108.             continue;
  109.  
  110.         NumVertices++;
  111.     }
  112.  
  113.     //ak ani jeden nerenderuj ak ano zresetuj pocitadlo chod dalej
  114.     if (NumVertices == 0)
  115.         return;
  116.     else
  117.         NumVertices = 0;
  118.  
  119.     //Otvor VB
  120.     VertexBuffer->Lock(0, 0, (void**)&Vertices, D3DLOCK_DISCARD | 
  121.                                                 D3DLOCK_NOOVERWRITE ) ;
  122.  
  123.     //zobrazi model do pola vertexov
  124.     for (i = 0;i<Bullet_MaxBullets;i++)
  125.     {
  126.  
  127.         //ak nieje aktivovany preskoc
  128.         if (Bullet[i].Active == false)
  129.             continue;
  130.  
  131.         //pridaj vertex
  132.         Vertices[NumVertices].pos.x = Bullet[i].Pos.X;
  133.         Vertices[NumVertices].pos.y = Bullet[i].Pos.Y;
  134.         Vertices[NumVertices].pos.z = Bullet[i].Pos.Z;
  135.         Vertices[NumVertices].color = 0xffff0000;
  136.         NumVertices++;
  137.  
  138.         //pridaj vertex
  139.         Vertices[NumVertices].pos.x = (Bullet[i].Pos.X + Bullet_Size*Bullet[i].Sme.X) + (1.0f*(-Bullet[i].Sme.Z));
  140.         Vertices[NumVertices].pos.y = (Bullet[i].Pos.Y + Bullet_Size*Bullet[i].Sme.Y) +  1.0f ;
  141.         Vertices[NumVertices].pos.z = (Bullet[i].Pos.Z + Bullet_Size*Bullet[i].Sme.Z) + (1.0f*(Bullet[i].Sme.X)) ;
  142.         Vertices[NumVertices].color = 0xffffff00;
  143.         NumVertices++;
  144.  
  145.         //pridaj vertex
  146.         Vertices[NumVertices].pos.x = (Bullet[i].Pos.X + Bullet_Size*Bullet[i].Sme.X) + (1.0f*(Bullet[i].Sme.Z));
  147.         Vertices[NumVertices].pos.y = (Bullet[i].Pos.Y + Bullet_Size*Bullet[i].Sme.Y) -  1.0f;
  148.         Vertices[NumVertices].pos.z = (Bullet[i].Pos.Z + Bullet_Size*Bullet[i].Sme.Z) + (1.0f*(-Bullet[i].Sme.X));
  149.         Vertices[NumVertices].color = 0xffffff00;
  150.         NumVertices++;
  151.             
  152.     }
  153.  
  154.     //uzavri VB
  155.     VertexBuffer->Unlock() ;
  156.  
  157.     //vynuluj maticu
  158.     D3DXMATRIXA16 NullMatrix;        
  159.     D3DXMatrixIdentity(&NullMatrix);
  160.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &NullMatrix);
  161.  
  162.     //vypni texturu
  163.     g_pd3dDevice->SetTexture(0,NULL);
  164.     
  165.     //vyrenderuj
  166.     g_pd3dDevice->SetStreamSource( 0, VertexBuffer, 0, sizeof(CUSTOMVERTEXBULLET));
  167.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXBULLET);
  168.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0 , NumVertices/3 );
  169.  
  170.     //reset
  171.     Engine.ResetToDefault();
  172. }
  173.  
  174. //Vypusti bullet
  175. //--------------------------------------------------------------
  176. void BULLETSYSTEM::SpawnBullet(VECTOR3D Pos,VECTOR3D Rot)
  177. {
  178.  
  179.     Bullet[ActBullet].Pos = Pos;
  180.  
  181.     //vypocita smerovy vektor
  182.     Bullet[ActBullet].Sme.X =  cosf(Rot.X) * sinf(Rot.Y);
  183.     Bullet[ActBullet].Sme.Z =  cosf(Rot.X) * cosf(Rot.Y);
  184.     Bullet[ActBullet].Sme.Y = -sinf(Rot.X);
  185.  
  186.     //nepresnost
  187.     Bullet[ActBullet].Sme.X += RandomMinMax(-0.01f,0.01f);
  188.     Bullet[ActBullet].Sme.Y += RandomMinMax(-0.01f,0.01f);
  189.     Bullet[ActBullet].Sme.Z += RandomMinMax(-0.01f,0.01f);
  190.  
  191.     Bullet[ActBullet].Active = true;
  192.  
  193.     ActBullet++;
  194.  
  195.     if (ActBullet == Bullet_MaxBullets)
  196.         ActBullet = 0;
  197. }
  198.  
  199. //kolizia zo vsetkymi objektami
  200. //----------------------------------------------------------------
  201. bool BULLETSYSTEM::Collision(VECTOR3D P1, VECTOR3D P2)
  202. {
  203.     int i;
  204.  
  205.     //ZEM
  206.     //--------------
  207.     if (Level.Krajina.Collise(P1,P2) == true)
  208.     {
  209.         Explo.SpawnHit(Level.Krajina.IntPos);
  210.         return true;
  211.     }
  212.  
  213.  
  214.     ///////////////////////
  215.     //NEPRIATELSKE STRELY//
  216.     ///////////////////////
  217.     if (UnFriendly == true)
  218.     {
  219.  
  220.         //kolizia so spitfirom
  221.         if (SpitFire.CollisionDetail(P1,P2) == true)
  222.         {
  223.             SpitFire.Life -= Bullet_Power;
  224.  
  225.             Explo.SpawnHit(SpitFire.Pos);
  226.             return true;
  227.         }
  228.  
  229.     }
  230.  
  231.     //////////////////
  232.     //PLAYERS STRELY//
  233.     //////////////////
  234.     if (Friendly == true)
  235.     {
  236.  
  237.         //
  238.         //MesserSchmitt
  239.         for (i=0;i<Max_MesserSchmitt;i++)
  240.         {
  241.             if (Level.MesserSchmitt[i].Active == false)
  242.                 continue;
  243.  
  244.             if (Level.MesserSchmitt[i].CollisionBox(P1,P2) == true)
  245.             {
  246.                 Level.MesserSchmitt[i].Life -= Bullet_Power;
  247.                 Explo.SpawnHit(Level.MesserSchmitt[i].Pos);
  248.  
  249.                 //prepni do uhybacieho modu
  250.                 Level.MesserSchmitt[i].Uhybanie = true;
  251.                 Level.MesserSchmitt[i].Sledovanie = false;
  252.                 Level.MesserSchmitt[i].Vyhybanie = false;
  253.  
  254.                 return true;
  255.             }
  256.         }
  257.  
  258.         //
  259.         //Volker
  260.         for (i=0;i<Max_Volkers;i++)
  261.         {
  262.             if (Level.Volker[i].Active == false)
  263.                 continue;
  264.  
  265.             if (Level.Volker[i].CollisionBox(P1,P2) == true)
  266.             {
  267.                 Level.Volker[i].Life -= Bullet_Power;
  268.                 Explo.SpawnHit(Level.Volker[i].Pos);
  269.  
  270.                 //prepni do uhybacieho modu
  271.                 Level.Volker[i].Uhybanie = true;
  272.                 Level.Volker[i].Sledovanie = false;
  273.                 Level.Volker[i].Vyhybanie = false;
  274.  
  275.                 return true;
  276.             }
  277.         }
  278.  
  279.         //
  280.         //Bombarder
  281.         for (i=0;i<Max_Bombarders;i++)
  282.         {
  283.             if (Level.Bombarder[i].Active == false)
  284.                 continue;
  285.  
  286.             if (Level.Bombarder[i].CollisionDetail(P1,P2) == true)
  287.             {
  288.                 Level.Bombarder[i].Life -= Bullet_Power;
  289.                 Explo.SpawnHit(ModelLib.Bombarder_ModelNormal.ColPosition);
  290.  
  291.                 return true;
  292.             }
  293.         }
  294.  
  295.         //
  296.         //Strucure
  297.         for (i=0;i<Max_Structures;i++)
  298.         {
  299.             if (Level.Structure[i].CollisionDetail(P1,P2) == true)
  300.             {
  301.                 Level.Structure[i].Life -= Bullet_Power;
  302.                 Explo.SpawnHit(ModelLib.GetStructure(Level.Structure[i].ModelIndex)->ColPosition);
  303.  
  304.                 return true;
  305.             }
  306.         }
  307.  
  308.         //
  309.         //Truck
  310.         for (i=0;i<Max_Trucks;i++)
  311.         {
  312.             if (Level.Truck[i].CollisionDetail(P1,P2) == true)
  313.             {
  314.                 Level.Truck[i].Life -= Bullet_Power;
  315.                 Explo.SpawnHit(ModelLib.Truck_ModelDestroyed.ColPosition);
  316.  
  317.                 return true;
  318.             }
  319.         }
  320.  
  321.     }
  322.  
  323.  
  324.     return false;
  325.  
  326. }
  327.