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

  1.  
  2. #include "main.h"
  3.  
  4. //------------------------------------------------------------------
  5. // Name: konstructor
  6. // Desc: 
  7. //------------------------------------------------------------------
  8. PANEL2D::PANEL2D()
  9. {
  10.  
  11.     g_pTexture = NULL; //textura
  12.     pVertices = NULL; //vertexi
  13.  
  14.     //default vlastnosti
  15.     Rot = 0.0f;
  16.     Pos = Get3D(0.0f,0.0f,0.0f);
  17.     Color = GetColor(1.0f,1.0f,1.0f,1.0f);
  18.     NumFrames = 0;
  19.     Frame = 0.0f;
  20.     RelativeMode = false;
  21.     Scale = 1.0f;
  22.  
  23. }
  24.  
  25.  
  26. //------------------------------------------------------------------
  27. // Name: destructor
  28. // Desc: 
  29. //------------------------------------------------------------------
  30. PANEL2D::~PANEL2D()
  31. {
  32.  
  33.     //znic textury
  34.     if (g_pTexture != NULL)
  35.     {
  36.         for (int i=0;i<NumFrames;i=i+1)
  37.         {
  38.             if (g_pTexture[i] !=NULL)
  39.                 g_pTexture[i]->Release();
  40.         }
  41.         delete [] g_pTexture;
  42.     }
  43.     g_pTexture = NULL;
  44.  
  45.     //znic vertexi
  46.     if (pVertices !=NULL)
  47.         delete [] pVertices;
  48.     pVertices = NULL;
  49.  
  50.     
  51.     
  52. }
  53.  
  54. //------------------------------------------------------------------
  55. // Name: Create()
  56. // Desc: Vytvori 2D Panel , PanelWidth - sirka v pixeloch,
  57. //                          PanelHeight - vyska v pixeloch
  58. //                          NumAnimFrames - pocet animacnych snimkov
  59. //------------------------------------------------------------------
  60. void PANEL2D::Create(float PanelWidth, float PanelHeight,int NumAnimFrames)
  61. {
  62.  
  63.     char cBuf[80];
  64.     sprintf(cBuf,"Vytvaram 2D Panel NumFrames: %d",NumAnimFrames);
  65.     LogPrint(cBuf);
  66.  
  67.     //vytvori textury
  68.     g_pTexture = new LPDIRECT3DTEXTURE9[NumAnimFrames];
  69.     for (int i=0;i<NumAnimFrames;i++)
  70.     {
  71.         g_pTexture [i] = NULL;
  72.     }
  73.  
  74.     //vertexi
  75.     pVertices = new CUSTOMVERTEX2DPANEL[6];
  76.  
  77.     //sirka vyska
  78.     Width = PanelWidth;
  79.     Height = PanelHeight;
  80.  
  81.     //zresetuje vertexi
  82.     ResetPoints();
  83.  
  84. }
  85.  
  86. //------------------------------------------------------------------
  87. // Name: AddFrame()
  88. // Desc: Prida snimok, je mozne pridat kolko snimkov 
  89. //------------------------------------------------------------------
  90. void PANEL2D::AddFrame(char *FileName,COLOR ColorKey)
  91. {
  92.  
  93.     char cBuf[80];
  94.     sprintf(cBuf,"  AddFrame: %d %s",NumFrames,FileName);
  95.     LogPrint(cBuf);
  96.     
  97.     //vytvor texturu
  98.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  99.                                   FileName,    
  100.                                   D3DX_DEFAULT, 
  101.                                   D3DX_DEFAULT, 
  102.                                   0,            //MipLevels
  103.                                   0,            
  104.                                   Engine.TextureFormat, 
  105.                                   Engine.TextureCreatingFlag,
  106.                                   D3DX_DEFAULT, //Filter
  107.                                   D3DX_DEFAULT, //MipFilter
  108.                                   D3DXCOLOR(ColorKey.R,
  109.                                             ColorKey.G,
  110.                                             ColorKey.B,
  111.                                             ColorKey.A),   //ColourKey
  112.                                   NULL,         
  113.                                   NULL,         
  114.                                   &g_pTexture[NumFrames])))  
  115.     {
  116.         sprintf(cBuf,"  chyba pri vytvarani textury: %s",FileName);
  117.         LogPrint(cBuf);
  118.     }
  119.     else
  120.     {
  121.         LogPrint("  Textura vytvorena");
  122.     }
  123.     
  124.     NumFrames = NumFrames + 1;
  125.  
  126. }
  127.  
  128. //------------------------------------------------------------------
  129. // Name: ClearAllFrames()
  130. // Desc: znici vsetky snφmky
  131. //------------------------------------------------------------------
  132. void PANEL2D::ClearAllFrames()
  133. {
  134.  
  135.     if (NumFrames == 0)
  136.         return;
  137.     
  138.     if (g_pTexture != NULL)
  139.     {
  140.         for (int i=0;i<NumFrames;i=i+1)
  141.         {
  142.             if (g_pTexture[i] !=NULL)
  143.                 g_pTexture[i]->Release();
  144.         }
  145.         delete [] g_pTexture;
  146.     }
  147.     g_pTexture = NULL;
  148.  
  149.     g_pTexture = new LPDIRECT3DTEXTURE9[NumFrames];
  150.     for (int i=0;i<NumFrames;i++)
  151.     {
  152.         g_pTexture [i] = NULL;
  153.     }
  154.  
  155.     NumFrames = 0;
  156.     
  157. }
  158.  
  159. //------------------------------------------------------------------
  160. // Name: ResetPoints()
  161. // Desc: reset vertexov (P1-P4) podla vysky a sirky
  162. //------------------------------------------------------------------
  163. void PANEL2D::ResetPoints()
  164. {
  165.     
  166.     float PW = Width/2.0f - 0.5f;
  167.     float PH = Height/2.0f - 0.5f;
  168.  
  169.     PW *= Scale;
  170.     PH *= Scale;
  171.  
  172.     //reset vertexov
  173.     P1.X = Pos.X - PW ;
  174.     P1.Y = Pos.Y - PH ;
  175.     P1.Z = 0.0f ;
  176.  
  177.     P2.X = Pos.X + PW ;
  178.     P2.Y = Pos.Y - PH ;
  179.     P2.Z = 0.0f ;
  180.  
  181.     P3.X = Pos.X + PW ;
  182.     P3.Y = Pos.Y + PH ;
  183.     P3.Z = 0.0f ;
  184.  
  185.     P4.X = Pos.X - PW ;
  186.     P4.Y = Pos.Y + PH ;
  187.     P4.Z = 0.0f ;
  188.  
  189. }
  190.  
  191. //------------------------------------------------------------------
  192. // Name: GetNewPos()
  193. // Desc: Vrati novu poziciu podla uhla
  194. //------------------------------------------------------------------
  195. VECTOR3D PANEL2D::GetNewPos(VECTOR3D Centre,VECTOR3D Point)
  196. {
  197.     //vysledok
  198.     VECTOR3D Vys;
  199.  
  200.     float Distance = CalcDistance(Centre,Point);
  201.  
  202.     float SubY = (Point.Y - Centre.Y) / Distance;
  203.     float SubX = (Point.X - Centre.X) / Distance;
  204.  
  205.  
  206.     float Angle = asinf(SubX);
  207.  
  208.     if (SubY < 0.0f)
  209.     {
  210.         if (SubX > 0.0f)
  211.             Angle = 3.141f - Angle;
  212.  
  213.         if (SubX < 0.0f)
  214.             Angle = 3.141f - Angle;
  215.     }
  216.  
  217.     Angle = Angle + Rot;
  218.  
  219.     Vys.X = Centre.X + (sinf(Angle) * Distance);
  220.     Vys.Y = Centre.Y + (cosf(Angle) * Distance);
  221.     Vys.Z = 0.0f;
  222.  
  223.     return Vys;
  224.  
  225. }
  226.  
  227. //------------------------------------------------------------------
  228. // Name: UpDateVertices()
  229. // Desc: Updatuje pole vertexov
  230. //------------------------------------------------------------------
  231. void PANEL2D::UpDateVertices()
  232. {
  233.  
  234.     //reset
  235.     ResetPoints();
  236.  
  237.     //vypocitaj pozicie vertexov podla uhla
  238.     P1 = GetNewPos(Pos,P1);
  239.     P2 = GetNewPos(Pos,P2);
  240.     P3 = GetNewPos(Pos,P3);
  241.     P4 = GetNewPos(Pos,P4);
  242.  
  243.     //relativne
  244.     if (RelativeMode == true)
  245.     {
  246.         P1.X = FTRX(P1.X);
  247.         P1.Y = FTRY(P1.Y);
  248.  
  249.         P2.X = FTRX(P2.X);
  250.         P2.Y = FTRY(P2.Y);
  251.  
  252.         P3.X = FTRX(P3.X);
  253.         P3.Y = FTRY(P3.Y);
  254.  
  255.         P4.X = FTRX(P4.X);
  256.         P4.Y = FTRY(P4.Y);
  257.     }
  258.  
  259.     //spolocne vlastnosti
  260.     for (int i = 0;i<4;i=i+1)
  261.     {
  262.         pVertices[i].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  263.         pVertices[i].rhw = 1.0f;
  264.         pVertices[i].z = 0.0f;
  265.     }
  266.  
  267.     //
  268.     //1
  269.     //
  270.     pVertices[0].x = P1.X;
  271.     pVertices[0].y = P1.Y;
  272.     pVertices[0].tu = 0.0f ;
  273.     pVertices[0].tv = 0.0f;
  274.  
  275.     pVertices[1].x = P2.X;
  276.     pVertices[1].y = P2.Y;
  277.     pVertices[1].tu = 1.0f ;
  278.     pVertices[1].tv = 0.0f;
  279.  
  280.     pVertices[2].x = P3.X;
  281.     pVertices[2].y = P3.Y;
  282.     pVertices[2].tu = 1.0f ;
  283.     pVertices[2].tv = 1.0f;
  284.  
  285.     pVertices[3].x = P4.X;
  286.     pVertices[3].y = P4.Y;
  287.     pVertices[3].tu = 0.0f ;
  288.     pVertices[3].tv = 1.0f;
  289.                                                 
  290.  
  291. }
  292.  
  293. //------------------------------------------------------------------
  294. // Name: Render()
  295. // Desc: Verenderuje
  296. //------------------------------------------------------------------
  297. void PANEL2D::Render()
  298. {
  299.  
  300.     //automaticky pretocit
  301.     if (Frame > NumFrames)
  302.         Frame = 0.0f;
  303.  
  304.  
  305.     //obnov vertexi
  306.     UpDateVertices();
  307.  
  308.     //oznac prislusnu texturu
  309.     g_pd3dDevice->SetTexture( 0, g_pTexture[(int)Frame]);
  310.  
  311.     //vykresli
  312.     g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX2DPANEL );
  313.     g_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN,2,(BYTE**)&pVertices[0], sizeof(CUSTOMVERTEX2DPANEL));
  314.  
  315. }
  316.  
  317.  
  318. //------------------------------------------------------------------
  319. // Name: MousePick()
  320. // Desc: kolizia s bodom na obrazovke
  321. //------------------------------------------------------------------
  322. bool PANEL2D::MousePick(VECTOR3D Point)
  323. {
  324.     
  325.     float U1 = CalcAngleCentre(Point,P1,P2);
  326.     float U2 = CalcAngleCentre(Point,P2,P3);
  327.     float U3 = CalcAngleCentre(Point,P3,P4);
  328.     float U4 = CalcAngleCentre(Point,P4,P1);
  329.  
  330.     float U = U1 + U2 + U3 + U4;
  331.  
  332.     if ((U > 6.24f) && (U < 6.30f))
  333.         return true;
  334.     else
  335.         return false;
  336. }
  337.  
  338. //------------------------------------------------------------------
  339. // Name: Center()
  340. // Desc: zarovanie podla sirky a vysky enginu
  341. //------------------------------------------------------------------
  342. void PANEL2D::Center(VECTOR3D CPos)
  343. {
  344.     Pos.X = Engine.Width * CPos.X;
  345.     Pos.Y = Engine.Height * CPos.Y;
  346.     Pos.Z = 0.0f;
  347. }
  348.  
  349. //------------------------------------------------------------------
  350. // Name: SetTexture
  351. // Desc: nastavi externu texturu
  352. //------------------------------------------------------------------
  353. void PANEL2D::SetTexture(int ToFrame,LPDIRECT3DTEXTURE9 Tex)
  354. {
  355.     g_pTexture[ToFrame] = Tex;
  356. }