Particle.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:57k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /******************************************************************************************************************
  2.                                                                                                                    
  3. 葛碘疙:
  4. 累己磊:
  5. 累己老:
  6. [老磊][荐沥磊] : 荐沥 郴侩
  7.                                                                                                                    
  8. *******************************************************************************************************************/
  9. #include "StdAfx.h"
  10. /******************************************************************************************************************
  11. CParticleSystem Class
  12. *******************************************************************************************************************/
  13. CParticleSystem::CParticleSystem()
  14. {
  15. InitSystem();
  16. }
  17. CParticleSystem::~CParticleSystem()
  18. {
  19. DestroySystem();
  20. }
  21. VOID CParticleSystem::InitSystem()
  22. {
  23. m_wNum  = 0;
  24. m_pxParticle  = NULL;
  25. m_fDeltaTime  = 0.02f;
  26. m_fAirFiction  = -0.05f;
  27. m_vecBounding[0] = D3DVECTOR(0, 0, 0);
  28. m_vecBounding[1] = D3DVECTOR(0, 0, 0);
  29. m_vecEnvironment = D3DVECTOR(0, 300, 0);
  30. D3DVECTOR vNorm(0, 0, -1);
  31. m_avShape[0] = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0.0f ), vNorm, 0.0f, 1.0f);
  32. m_avShape[1] = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0.0f ), vNorm, 0.0f, 0.0f);
  33. m_avShape[2] = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0.0f ), vNorm, 1.0f, 1.0f);
  34. m_avShape[3] = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0.0f ), vNorm, 1.0f, 0.0f);
  35. }
  36. VOID CParticleSystem::SetupSystem(WORD wCnt)
  37. {
  38. InitSystem();
  39. m_wNum = wCnt;
  40.     m_pxParticle = new CParticle[m_wNum];
  41. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  42. {
  43. m_pxParticle[nCnt].Init();
  44. }
  45. }
  46. VOID CParticleSystem::DestroySystem()
  47. {
  48. SAFE_DELETE(m_pxParticle);
  49. InitSystem();
  50. }
  51. VOID CParticleSystem::UpdateAirFiction(WORD wNum)
  52. {
  53. if ( !m_pxParticle[wNum].m_bIsDead )
  54. {
  55. m_pxParticle[wNum].m_vecLocalForce.x = -m_pxParticle[wNum].m_vecVel.x * m_fAirFiction;
  56. m_pxParticle[wNum].m_vecLocalForce.y = -m_pxParticle[wNum].m_vecVel.y * m_fAirFiction;
  57. m_pxParticle[wNum].m_vecLocalForce.z = m_pxParticle[wNum].m_vecVel.z * m_fAirFiction;
  58. }
  59. }
  60. VOID CParticleSystem::UpdateMove(WORD wNum)
  61. {
  62. if ( !m_pxParticle[wNum].m_bIsDead )
  63. {
  64. m_pxParticle[wNum].m_vecAccel.x += (m_vecEnvironment.x + m_pxParticle[wNum].m_vecLocalForce.x) / m_pxParticle[wNum].m_fMass;
  65. m_pxParticle[wNum].m_vecAccel.y += (m_vecEnvironment.y + m_pxParticle[wNum].m_vecLocalForce.y) / m_pxParticle[wNum].m_fMass;
  66. m_pxParticle[wNum].m_vecAccel.z += (m_vecEnvironment.z + m_pxParticle[wNum].m_vecLocalForce.z) / m_pxParticle[wNum].m_fMass;
  67. m_pxParticle[wNum].m_vecVel.x += m_pxParticle[wNum].m_vecAccel.x * m_fDeltaTime;//*0.01f;
  68. m_pxParticle[wNum].m_vecVel.y += m_pxParticle[wNum].m_vecAccel.y * m_fDeltaTime;//*0.01f;
  69. m_pxParticle[wNum].m_vecVel.z += m_pxParticle[wNum].m_vecAccel.z * m_fDeltaTime;//*0.01f;
  70. m_pxParticle[wNum].m_vecOldPos = m_pxParticle[wNum].m_vecPos;
  71. m_pxParticle[wNum].m_vecPos.x += m_pxParticle[wNum].m_vecVel.x * m_fDeltaTime;//*0.01f;
  72. m_pxParticle[wNum].m_vecPos.y += m_pxParticle[wNum].m_vecVel.y * m_fDeltaTime;//*0.01f;
  73. m_pxParticle[wNum].m_vecPos.z += m_pxParticle[wNum].m_vecVel.z * m_fDeltaTime;//*0.01f;
  74. }
  75. }
  76. VOID CParticleSystem::UpdateCrash(WORD wNum)
  77. {
  78. if ( !m_pxParticle[wNum].m_bIsDead )
  79. {
  80. if ( m_pxParticle[wNum].m_vecPos.x <= m_vecBounding[0].x || m_pxParticle[wNum].m_vecPos.x >= m_vecBounding[1].x )
  81. {
  82. m_pxParticle[wNum].m_vecVel.x = -m_pxParticle[wNum].m_vecVel.x * 0.7f;
  83. }
  84. if ( m_pxParticle[wNum].m_vecPos.y <= m_vecBounding[0].y || m_pxParticle[wNum].m_vecPos.y >= m_vecBounding[1].y )
  85. {
  86. FLOAT fOldX = m_pxParticle[wNum].m_vecPos.x - m_pxParticle[wNum].m_vecVel.x * m_pxParticle[wNum].m_wDelay;
  87. FLOAT fOldY = m_pxParticle[wNum].m_vecPos.y - m_pxParticle[wNum].m_vecVel.y * m_pxParticle[wNum].m_wDelay;
  88. FLOAT fBefore = m_pxParticle[wNum].m_wDelay * (m_vecBounding[1].y - fOldY)/(m_pxParticle[wNum].m_vecPos.y - fOldY); // 面倒傈.
  89. FLOAT fAfter  = m_pxParticle[wNum].m_wDelay * (m_pxParticle[wNum].m_vecPos.y - m_vecBounding[1].y)/(m_pxParticle[wNum].m_vecPos.y - fOldY); // 面倒饶.
  90. m_pxParticle[wNum].m_vecPos.x = fOldX + m_pxParticle[wNum].m_vecVel.x * fBefore;
  91. m_pxParticle[wNum].m_vecPos.y = fOldY + m_pxParticle[wNum].m_vecVel.y * fBefore;
  92. m_pxParticle[wNum].m_vecVel.y = -m_pxParticle[wNum].m_vecVel.y * 0.6f;
  93. m_pxParticle[wNum].m_vecPos.x += m_pxParticle[wNum].m_vecVel.x * fAfter;
  94. m_pxParticle[wNum].m_vecPos.y += m_pxParticle[wNum].m_vecVel.y * fAfter;
  95. }
  96. if ( m_pxParticle[wNum].m_vecPos.z <= m_vecBounding[0].z || m_pxParticle[wNum].m_vecPos.z >= m_vecBounding[1].y )
  97. {
  98. m_pxParticle[wNum].m_vecVel.z = -m_pxParticle[wNum].m_vecVel.z * 0.6f;
  99. }
  100. }
  101. }
  102. /******************************************************************************************************************
  103. CSnow Class
  104. *******************************************************************************************************************/
  105. CSnow::CSnow()
  106. {
  107. InitSystem();
  108. }
  109. CSnow::~CSnow()
  110. {
  111. DestroySystem();
  112. }
  113. VOID CSnow::LoadTextr()
  114. {
  115. CHAR* szFileList[] = 
  116. {
  117. "Snow0.bmp",
  118. /* "0000.bmp",
  119. "0001.bmp",
  120. "0002.bmp",
  121. "0003.bmp",
  122. */
  123. /* "shine0.bmp",
  124. "shine1.bmp",
  125. "shine2.bmp",
  126. "shine3.bmp",
  127. "shine4.bmp",
  128. "shine5.bmp",
  129. "shine6.bmp",
  130. "shine7.bmp",
  131. "shine8.bmp",
  132. "shine9.bmp",
  133. */ };
  134. for ( INT nCnt = 0; nCnt < _MAX_SNOWFRAME; nCnt++ )
  135. {
  136. strcpy(m_szSnowFile[nCnt], szFileList[nCnt]);
  137. D3DTextr_CreateTextureFromFile(m_szSnowFile[nCnt]);
  138. D3DTextr_Restore(m_szSnowFile[nCnt], g_xMainWnd.Get3DDevice());
  139. }
  140. }
  141. VOID CSnow::InitSystem()
  142. {
  143. CParticleSystem::InitSystem();
  144. m_fWidth = m_fGround = 0.0f;
  145. ZeroMemory(m_szSnowFile, _MAX_SNOWFRAME*MAX_PATH);
  146. }
  147. VOID CSnow::DestroySystem()
  148. {
  149. CParticleSystem::DestroySystem();
  150. for ( INT nCnt = 0; nCnt < _MAX_SNOWFRAME; nCnt++ )
  151. {
  152. D3DTextr_Invalidate(m_szSnowFile[nCnt]);
  153. D3DTextr_DestroyTexture(m_szSnowFile[nCnt]);
  154. }
  155. InitSystem();
  156. }
  157. VOID CSnow::SetupSystem(WORD wCnt, FLOAT fWidth, FLOAT fGround)
  158. {
  159. InitSystem();
  160. CParticleSystem::SetupSystem(wCnt);
  161. m_fWidth  = fWidth;
  162. m_fGround = fGround;
  163. LoadTextr();
  164. SetEnvFactor(-0.05f, D3DVECTOR(10, 100, 0));
  165. }
  166. VOID CSnow::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
  167. {
  168. INT nGenCnt = 0; 
  169. INT nSpeedRate = (nLoopTime / 17);
  170. if ( nSpeedRate < 1 ) 
  171. nSpeedRate = 1;
  172. m_fDeltaTime = 0.02f*nSpeedRate;
  173.     for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  174.     {
  175. m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
  176. if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife || m_pxParticle[nCnt].m_vecPos.y >= m_fGround )
  177. {
  178. if( (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) > 255 )
  179. {
  180. m_pxParticle[nCnt].m_bIsDead = TRUE;
  181. }
  182. else
  183. {
  184. BYTE bRate;
  185. bRate = 255 - (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife);
  186. m_pxParticle[nCnt].m_bOpa = bRate;
  187. if ( bRate < m_pxParticle[nCnt].m_bRed ) m_pxParticle[nCnt].m_bRed = bRate;
  188. if ( bRate < m_pxParticle[nCnt].m_bGreen ) m_pxParticle[nCnt].m_bGreen = bRate;
  189. if ( bRate < m_pxParticle[nCnt].m_bBlue ) m_pxParticle[nCnt].m_bBlue = bRate;
  190. continue;
  191. }
  192. }
  193. if ( m_pxParticle[nCnt].m_bIsDead && nGenCnt < 20 )
  194. {
  195. SetParticleDefault(nCnt);
  196. nGenCnt++;
  197. }
  198. else
  199. {
  200. UpdateAirFiction(nCnt);
  201. UpdateMove(nCnt);
  202. m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
  203. if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
  204. {
  205. m_pxParticle[nCnt].m_wCurrDelay = 0;
  206. m_pxParticle[nCnt].m_wCurrFrame++;
  207. // FLOAT fRand = _RAND_FLOAT;
  208. // SetEnvFactor(fRand, D3DVECTOR(-fRand, fRand*100, 0));
  209. if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_SNOWFRAME )
  210. {
  211. m_pxParticle[nCnt].m_wCurrFrame = 0;
  212. }
  213. }
  214. }
  215.     }
  216. }
  217. HRESULT CSnow::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
  218. {
  219. if ( lpDevice )
  220. {
  221. if( SUCCEEDED(lpDevice->BeginScene()) )
  222. {
  223. D3DMATRIX matWorldOriginal;
  224. D3DMATRIX matTrans;
  225. D3DMATRIX matScale;
  226. D3DMATRIX matWorld;
  227. D3DVECTOR vTrans;
  228. D3DMATERIAL7 mtrl;
  229. lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  230. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  231. {
  232. if ( !m_pxParticle[nCnt].m_bIsDead )
  233. {
  234. D3DUtil_InitMaterial(mtrl, 
  235.  (FLOAT)m_pxParticle[nCnt].m_bRed/255.0f,
  236.  (FLOAT)m_pxParticle[nCnt].m_bGreen/255.0f, 
  237.  (FLOAT)m_pxParticle[nCnt].m_bBlue/255.0f);
  238. mtrl.diffuse.a = 0.0f;
  239. // mtrl.diffuse.a = m_pxParticle[nCnt].m_bOpa/255.0f;
  240. lpDevice->SetMaterial(&mtrl);
  241. // SetBlendRenderState(lpDevice, _BLEND_NORMAL, mtrl);
  242. lpDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
  243. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  244. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  245. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  246. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  247. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  248. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  249.    vTrans.x = (FLOAT) m_pxParticle[nCnt].m_vecPos.x-400;
  250. vTrans.y = (FLOAT)-m_pxParticle[nCnt].m_vecPos.y+300;
  251. vTrans.z = (FLOAT) m_pxParticle[nCnt].m_vecPos.z; 
  252. D3DUtil_SetScaleMatrix(matScale, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize);
  253. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  254. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  255. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  256. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_szSnowFile[m_pxParticle[nCnt].m_wCurrFrame]));
  257. lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
  258. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  259. }
  260. }
  261. // ResetBlendenderState(lpDevice);
  262. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  263. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  264. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  265. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  266. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  267. lpDevice->EndScene();
  268. return S_OK;
  269. }
  270. }
  271. return E_FAIL;
  272. }
  273. VOID CSnow::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
  274. {
  275.     m_pxParticle[wNum].m_vecPos = D3DVECTOR((FLOAT)GetRandomNum(0, m_fWidth)/*(-400, 1200)*/, (FLOAT)GetRandomNum(-300,  0), 0.0f);
  276.     m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-30,  30), (FLOAT)GetRandomNum(70, 100), 0.0f);
  277. m_pxParticle[wNum].m_vecAccel = D3DVECTOR(0.0f, 0.0f, 0.0f);
  278. m_pxParticle[wNum].m_vecOldPos = D3DVECTOR(0.0f, 0.0f, 0.0f);
  279. m_pxParticle[wNum].m_vecLocalForce = D3DVECTOR(0.0f, 0.0f, 0.0f);
  280. m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(2500,  7000);
  281. m_pxParticle[wNum].m_fMass = 1000 + _RAND_FLOAT;
  282. m_pxParticle[wNum].m_fSize = (FLOAT)GetRandomNum(2, 6) + _RAND_FLOAT;
  283. // m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum((BYTE)m_pxParticle[wNum].m_fSize*2000,  6000);
  284. m_pxParticle[wNum].m_bIsDead = FALSE;
  285. m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bBlue = (FLOAT)GetRandomNum(/*(BYTE)(m_pxParticle[wNum].m_fSize)*30+20*/150, 200);
  286. m_pxParticle[wNum].m_bBlue += 50;
  287. // m_pxParticle[wNum].m_bRed = (FLOAT)GetRandomNum(0, 255);
  288. // m_pxParticle[wNum].m_bGreen = (FLOAT)GetRandomNum(0, 255);
  289. // m_pxParticle[wNum].m_bBlue = (FLOAT)GetRandomNum(0, 255);
  290. m_pxParticle[wNum].m_wDelay = 300;//(FLOAT)GetRandomNum(50, 150);
  291. m_pxParticle[wNum].m_wCurrLife = 0;
  292. m_pxParticle[wNum].m_wCurrDelay = 0;
  293. m_pxParticle[wNum].m_wCurrFrame = 0;
  294. m_pxParticle[wNum].m_bOpa = 255;
  295. }
  296. /******************************************************************************************************************
  297. CRain Class
  298. *******************************************************************************************************************/
  299. CRain::CRain()
  300. {
  301. InitSystem();
  302. }
  303. CRain::~CRain()
  304. {
  305. DestroySystem();
  306. }
  307. VOID CRain::LoadTextr()
  308. {
  309. CHAR* szFileList1[] = 
  310. {
  311. // "Rain0.bmp",
  312. "Snow0.bmp",
  313. };
  314. CHAR* szFileList2[] = 
  315. {
  316. "RainDrop0.bmp",
  317. "RainDrop1.bmp",
  318. "RainDrop2.bmp",
  319. "RainDrop3.bmp",
  320. "RainDrop4.bmp",
  321. };
  322. for ( INT nCnt = 0; nCnt < _MAX_RAINFRAME; nCnt++ )
  323. {
  324. strcpy(m_pszRainFile[nCnt], szFileList1[nCnt]);
  325. D3DTextr_CreateTextureFromFile(m_pszRainFile[nCnt]);
  326. D3DTextr_Restore(m_pszRainFile[nCnt], g_xMainWnd.Get3DDevice());
  327. }
  328. for ( nCnt = 0; nCnt < _MAX_RAINDROPFRAME; nCnt++ )
  329. {
  330. strcpy(m_pszRainDropFile[nCnt], szFileList2[nCnt]);
  331. D3DTextr_CreateTextureFromFile(m_pszRainDropFile[nCnt]);
  332. D3DTextr_Restore(m_pszRainDropFile[nCnt], g_xMainWnd.Get3DDevice());
  333. }
  334. }
  335. VOID CRain::InitSystem()
  336. {
  337. CParticleSystem::InitSystem();
  338. m_fWidth = m_fGround = 0.0f;
  339. m_bRainIntensity = 0;
  340. m_bGenCnt = 10;
  341. ZeroMemory(m_pszRainFile, _MAX_RAINFRAME*MAX_PATH);
  342. ZeroMemory(m_pszRainDropFile, _MAX_RAINDROPFRAME*MAX_PATH);
  343. }
  344. VOID CRain::DestroySystem()
  345. {
  346. CParticleSystem::DestroySystem();
  347. for ( INT nCnt = 0; nCnt < _MAX_RAINFRAME; nCnt++ )
  348. {
  349. D3DTextr_Invalidate(m_pszRainFile[nCnt]);
  350. D3DTextr_DestroyTexture(m_pszRainFile[nCnt]);
  351. }
  352. for ( nCnt = 0; nCnt < _MAX_RAINDROPFRAME; nCnt++ )
  353. {
  354. D3DTextr_Invalidate(m_pszRainDropFile[nCnt]);
  355. D3DTextr_DestroyTexture(m_pszRainDropFile[nCnt]);
  356. }
  357. InitSystem();
  358. }
  359. VOID CRain::SetupSystem(WORD wCnt, FLOAT fWidth, FLOAT fGround)
  360. {
  361. InitSystem();
  362. CParticleSystem::SetupSystem(wCnt);
  363. m_fWidth  = fWidth;
  364. m_fGround = fGround;
  365. LoadTextr();
  366. SetEnvFactor(-0.05f, D3DVECTOR(10, 100, 0));
  367. }
  368. VOID CRain::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
  369. {
  370. INT nGenCnt = 0; 
  371. INT nSpeedRate = (nLoopTime / 17);
  372. if ( nSpeedRate < 1 ) 
  373. nSpeedRate = 1;
  374. m_fDeltaTime = 0.02f*nSpeedRate;
  375.     for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  376.     {
  377. m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
  378. if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife || m_pxParticle[nCnt].m_vecPos.y >= m_fGround )
  379. {
  380. if( (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) > /*_MAX_RAINDROPFRAME*50*/250 )
  381. {
  382. m_pxParticle[nCnt].m_bIsDead = TRUE;
  383. }
  384. else
  385. {
  386. BYTE bRate;
  387. bRate = /*50*_MAX_RAINDROPFRAME*/250 - (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) / 4;
  388. m_pxParticle[nCnt].m_bOpa = bRate;
  389. m_pxParticle[nCnt].m_wDelay = 50;
  390. if ( bRate < m_pxParticle[nCnt].m_bRed ) m_pxParticle[nCnt].m_bRed = bRate;
  391. if ( bRate < m_pxParticle[nCnt].m_bGreen ) m_pxParticle[nCnt].m_bGreen = bRate;
  392. if ( bRate < m_pxParticle[nCnt].m_bBlue ) m_pxParticle[nCnt].m_bBlue = bRate;
  393. m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
  394. if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
  395. {
  396. m_pxParticle[nCnt].m_wCurrDelay = 0;
  397. m_pxParticle[nCnt].m_wCurrFrame++;
  398. if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_RAINDROPFRAME )
  399. {
  400. m_pxParticle[nCnt].m_wCurrFrame = 0;
  401. }
  402. }
  403. continue;
  404. }
  405. }
  406. if ( m_pxParticle[nCnt].m_bIsDead && nGenCnt < m_bGenCnt )
  407. {
  408. SetParticleDefault(nCnt);
  409. nGenCnt++;
  410. }
  411. else
  412. {
  413. UpdateAirFiction(nCnt);
  414. UpdateMove(nCnt);
  415. m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
  416. if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
  417. {
  418. m_pxParticle[nCnt].m_wCurrDelay = 0;
  419. m_pxParticle[nCnt].m_wCurrFrame++;
  420. if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_RAINFRAME )
  421. {
  422. m_pxParticle[nCnt].m_wCurrFrame = 0;
  423. }
  424. }
  425. }
  426.     }
  427. }
  428. HRESULT CRain::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
  429. {
  430. if ( lpDevice )
  431. {
  432. if( SUCCEEDED(lpDevice->BeginScene()) )
  433. {
  434. D3DMATRIX matWorldOriginal;
  435. D3DMATRIX matTrans;
  436. D3DMATRIX matScale;
  437. D3DMATRIX matRot;
  438. D3DMATRIX matWorld;
  439. D3DMATRIX matTmpWorld;
  440. D3DVECTOR vTrans;
  441. D3DMATERIAL7 mtrl;
  442. lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  443. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  444. {
  445. if ( !m_pxParticle[nCnt].m_bIsDead )
  446. {
  447. D3DUtil_InitMaterial(mtrl, 
  448.  (FLOAT)m_pxParticle[nCnt].m_bRed/255.0f,
  449.  (FLOAT)m_pxParticle[nCnt].m_bGreen/255.0f, 
  450.  (FLOAT)m_pxParticle[nCnt].m_bBlue/255.0f);
  451. mtrl.diffuse.a = 0.0f;
  452. // mtrl.diffuse.a = m_pxParticle[nCnt].m_bOpa/255.0f;
  453. lpDevice->SetMaterial(&mtrl);
  454. SetBlendRenderState(lpDevice, _BLEND_LIGHTINV, mtrl);
  455. /* lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
  456. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  457. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  458. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  459. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  460. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  461. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  462. */
  463.    vTrans.x = (FLOAT) m_pxParticle[nCnt].m_vecPos.x-400;
  464. vTrans.y = (FLOAT)-m_pxParticle[nCnt].m_vecPos.y+300;
  465. vTrans.z = (FLOAT) m_pxParticle[nCnt].m_vecPos.z; 
  466. D3DUtil_SetScaleMatrix(matScale, 1.5f, m_pxParticle[nCnt].m_fSize, 1.0f);
  467. D3DUtil_SetRotateZMatrix(matRot, g_PI/2 - atan((m_pxParticle[nCnt].m_vecPos.y - m_pxParticle[nCnt].m_vecOldPos.y)/(m_pxParticle[nCnt].m_vecPos.x - m_pxParticle[nCnt].m_vecOldPos.x)));
  468. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  469. D3DMath_MatrixMultiply(matTmpWorld, matRot, matTrans);
  470. D3DMath_MatrixMultiply(matWorld, matScale, matTmpWorld);
  471. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  472. if( (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) > 0 && (m_pxParticle[nCnt].m_wCurrLife-m_pxParticle[nCnt].m_wLife) < 510 )
  473. {
  474. D3DUtil_SetScaleMatrix(matScale, 64.0f, 64.0f, 1.0f);
  475. // D3DUtil_SetRotateZMatrix(matRot, (FLOAT)GetRandomNum(0, 2) + _RAND_FLOAT);
  476. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  477. D3DMath_MatrixMultiply(matTmpWorld, matRot, matTrans);
  478. D3DMath_MatrixMultiply(matWorld, matScale, matTmpWorld);
  479. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  480. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszRainDropFile[m_pxParticle[nCnt].m_wCurrFrame]));
  481. }
  482. else
  483. {
  484. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszRainFile[m_pxParticle[nCnt].m_wCurrFrame]));
  485. }
  486. lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
  487. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  488. }
  489. }
  490. // ResetBlendenderState(lpDevice);
  491. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  492. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  493. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  494. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  495. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  496. lpDevice->EndScene();
  497. return S_OK;
  498. }
  499. }
  500. return E_FAIL;
  501. }
  502. VOID CRain::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
  503. {
  504. // m_bRainIntensity ---> 厚狼 碍档啊 缴秦龙荐废 gencnt, mass, size, delay, velocity殿俊 康氢阑 固模促.
  505. ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
  506.     m_pxParticle[wNum].m_vecPos = D3DVECTOR((FLOAT)GetRandomNum(-100, m_fWidth+100)/*(-400, 1200)*/, (FLOAT)GetRandomNum(-500, 0), 0.0f);
  507.     m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)/*GetRandomNum(0,  10)*/0, 500/*(FLOAT)GetRandomNum(10, 30)*/, 0.0f);
  508. // m_pxParticle[wNum].m_vecAccel = D3DVECTOR(0.0f, 0.0f, 0.0f);
  509. // m_pxParticle[wNum].m_vecOldPos = D3DVECTOR(0.0f, 0.0f, 0.0f);
  510. // m_pxParticle[wNum].m_vecLocalForce = D3DVECTOR(0.0f, 0.0f, 0.0f);
  511. m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(800, 1400);
  512. m_pxParticle[wNum].m_fMass = 100.0f;
  513. m_pxParticle[wNum].m_fSize = (FLOAT)GetRandomNum(3, 30) + _RAND_FLOAT;
  514. // m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum((BYTE)m_pxParticle[wNum].m_fSize*2000,  6000);
  515. // m_pxParticle[wNum].m_bIsDead = FALSE;
  516. m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bBlue = (FLOAT)GetRandomNum(/*(BYTE)(m_pxParticle[wNum].m_fSize)*30+20*/120, 180);
  517. m_pxParticle[wNum].m_bBlue = 125;
  518. // m_pxParticle[wNum].m_bRed = (FLOAT)GetRandomNum(0, 255);
  519. // m_pxParticle[wNum].m_bGreen = (FLOAT)GetRandomNum(0, 255);
  520. // m_pxParticle[wNum].m_bBlue = (FLOAT)GetRandomNum(0, 255);
  521. m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(50, 150);
  522. // m_pxParticle[wNum].m_wCurrLife = 0;
  523. // m_pxParticle[wNum].m_wCurrDelay = 0;
  524. // m_pxParticle[wNum].m_wCurrFrame = 0;
  525. // m_pxParticle[wNum].m_bOpa = 255;
  526. }
  527. /******************************************************************************************************************
  528. CFly Class
  529. *******************************************************************************************************************/
  530. CFly::CFly()
  531. {
  532. InitSystem();
  533. }
  534. CFly::~CFly()
  535. {
  536. DestroySystem();
  537. }
  538. VOID CFly::LoadTextr()
  539. {
  540. CHAR* szFileList[] = 
  541. {
  542. "shine0.bmp",
  543. "shine1.bmp",
  544. "shine2.bmp",
  545. "shine3.bmp",
  546. "shine4.bmp",
  547. "shine5.bmp",
  548. "shine6.bmp",
  549. "shine7.bmp",
  550. "shine8.bmp",
  551. "shine9.bmp",
  552. };
  553. for ( INT nCnt = 0; nCnt < _MAX_FLYFRAME; nCnt++ )
  554. {
  555. strcpy(m_pszFlyFile[nCnt], szFileList[nCnt]);
  556. D3DTextr_CreateTextureFromFile(m_pszFlyFile[nCnt]);
  557. D3DTextr_Restore(m_pszFlyFile[nCnt], g_xMainWnd.Get3DDevice());
  558. }
  559. }
  560. VOID CFly::InitSystem()
  561. {
  562. CParticleSystem::InitSystem();
  563. m_bGenCnt = 3;
  564. ZeroMemory(m_pszFlyFile, _MAX_FLYFRAME*MAX_PATH);
  565. }
  566. VOID CFly::DestroySystem()
  567. {
  568. CParticleSystem::DestroySystem();
  569. for ( INT nCnt = 0; nCnt < _MAX_FLYFRAME; nCnt++ )
  570. {
  571. D3DTextr_Invalidate(m_pszFlyFile[nCnt]);
  572. D3DTextr_DestroyTexture(m_pszFlyFile[nCnt]);
  573. }
  574. InitSystem();
  575. }
  576. VOID CFly::SetupSystem(WORD wCnt)
  577. {
  578. InitSystem();
  579. CParticleSystem::SetupSystem(wCnt);
  580. LoadTextr();
  581. SetEnvFactor(-0.05f, D3DVECTOR(100, 1000, 0));
  582. }
  583. VOID CFly::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
  584. {
  585. BYTE bRate;
  586. INT nGenCnt = 0; 
  587. INT nSpeedRate = (nLoopTime / 17);
  588. if ( nSpeedRate < 1 ) 
  589. nSpeedRate = 1;
  590. m_fDeltaTime = 0.02f*nSpeedRate;
  591.     for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  592.     {
  593. m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
  594. if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife )
  595. {
  596. m_pxParticle[nCnt].m_bIsDead = TRUE;
  597. }
  598. else
  599. {
  600. m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
  601. if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
  602. {
  603. m_pxParticle[nCnt].m_wCurrDelay = 0;
  604. m_pxParticle[nCnt].m_wCurrFrame++;
  605. m_pxParticle[nCnt].m_fSize += 0.5f;
  606. if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_FLYFRAME )
  607. {
  608. m_pxParticle[nCnt].m_wCurrFrame = 0;
  609. }
  610. }
  611. /* bRate = 255 - 255*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  612. m_pxParticle[nCnt].m_bRed = m_pxParticle[nCnt].m_bGreen = m_pxParticle[nCnt].m_bBlue = bRate;
  613. */ bRate = m_pxParticle[nCnt].m_bFstRed - m_pxParticle[nCnt].m_bFstRed*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  614. m_pxParticle[nCnt].m_bRed = bRate;
  615. bRate = m_pxParticle[nCnt].m_bFstGreen - m_pxParticle[nCnt].m_bFstGreen*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  616. m_pxParticle[nCnt].m_bGreen = bRate;
  617. bRate = m_pxParticle[nCnt].m_bFstBlue - m_pxParticle[nCnt].m_bFstBlue*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  618. m_pxParticle[nCnt].m_bBlue = bRate;
  619. UpdateAirFiction(nCnt);
  620. UpdateMove(nCnt);
  621. }
  622. if ( m_pxParticle[nCnt].m_bIsDead )
  623. {
  624. if ( nGenCnt < m_bGenCnt )
  625. {
  626. SetParticleDefault(nCnt, vecGenPos);
  627. nGenCnt++;
  628. }
  629. }
  630.     }
  631. }
  632. HRESULT CFly::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
  633. {
  634. if ( lpDevice )
  635. {
  636. if( SUCCEEDED(lpDevice->BeginScene()) )
  637. {
  638. D3DMATRIX matWorldOriginal;
  639. D3DMATRIX matTrans;
  640. D3DMATRIX matScale;
  641. D3DMATRIX matWorld;
  642. D3DVECTOR vTrans;
  643. D3DMATERIAL7 mtrl;
  644. lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  645. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  646. {
  647. if ( !m_pxParticle[nCnt].m_bIsDead )
  648. {
  649. D3DUtil_InitMaterial(mtrl, 
  650.  (FLOAT)m_pxParticle[nCnt].m_bRed/255.0f,
  651.  (FLOAT)m_pxParticle[nCnt].m_bGreen/255.0f, 
  652.  (FLOAT)m_pxParticle[nCnt].m_bBlue/255.0f);
  653. mtrl.diffuse.a = 0.0f;
  654. // mtrl.diffuse.a = m_pxParticle[nCnt].m_bOpa/255.0f;
  655. lpDevice->SetMaterial(&mtrl);
  656. // SetBlendRenderState(lpDevice, _BLEND_NORMAL, mtrl);
  657. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
  658. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  659. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  660. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  661. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  662. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  663. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  664.    vTrans.x = (FLOAT) m_pxParticle[nCnt].m_vecPos.x-400;
  665. vTrans.y = (FLOAT)-m_pxParticle[nCnt].m_vecPos.y+300;
  666. vTrans.z = (FLOAT) m_pxParticle[nCnt].m_vecPos.z; 
  667. D3DUtil_SetScaleMatrix(matScale, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize, 1);
  668. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  669. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  670. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  671. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszFlyFile[m_pxParticle[nCnt].m_wCurrFrame]));
  672. lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
  673. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  674. }
  675. }
  676. // ResetBlendenderState(lpDevice);
  677. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  678. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  679. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  680. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  681. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  682. lpDevice->EndScene();
  683. return S_OK;
  684. }
  685. }
  686. return E_FAIL;
  687. }
  688. VOID CFly::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
  689. {
  690. // m_bRainIntensity ---> 厚狼 碍档啊 缴秦龙荐废 gencnt, mass, size, delay, velocity殿俊 康氢阑 固模促.
  691. ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
  692.     m_pxParticle[wNum].m_vecPos = vecGenPos;
  693.     m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-30, 30), (FLOAT)GetRandomNum(-20, 40), 0.0f);
  694. m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(500, 1500);
  695. m_pxParticle[wNum].m_fMass = 1000.0f;
  696. m_pxParticle[wNum].m_fSize = (FLOAT)GetRandomNum(5, 40) + _RAND_FLOAT;
  697. // m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum((BYTE)m_pxParticle[wNum].m_fSize*2000,  6000);
  698. // m_pxParticle[wNum].m_bIsDead = FALSE;
  699. m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed   = (FLOAT)GetRandomNum(200, 255);
  700. m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = m_pxParticle[wNum].m_bFstRed/2;//(FLOAT)GetRandomNum(0, 125);
  701. m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue  = (FLOAT)GetRandomNum(0, 30);
  702. m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(200, 300);
  703. // m_pxParticle[wNum].m_wCurrLife = 0;
  704. // m_pxParticle[wNum].m_wCurrDelay = 0;
  705. // m_pxParticle[wNum].m_wCurrFrame = 0;
  706. // m_pxParticle[wNum].m_bOpa = 255;
  707. }
  708. /******************************************************************************************************************
  709. CBoom Class
  710. *******************************************************************************************************************/
  711. CBoom::CBoom()
  712. {
  713. InitSystem();
  714. }
  715. CBoom::~CBoom()
  716. {
  717. DestroySystem();
  718. }
  719. VOID CBoom::LoadTextr()
  720. {
  721. CHAR* szFileList[] = 
  722. {
  723. "shine0.bmp",
  724. "shine1.bmp",
  725. "shine2.bmp",
  726. "shine3.bmp",
  727. "shine4.bmp",
  728. "shine5.bmp",
  729. "shine6.bmp",
  730. "shine7.bmp",
  731. "shine8.bmp",
  732. "shine9.bmp",
  733. };
  734. for ( INT nCnt = 0; nCnt < _MAX_BOOMFRAME; nCnt++ )
  735. {
  736. strcpy(m_pszBoomFile[nCnt], szFileList[nCnt]);
  737. D3DTextr_CreateTextureFromFile(m_pszBoomFile[nCnt]);
  738. D3DTextr_Restore(m_pszBoomFile[nCnt], g_xMainWnd.Get3DDevice());
  739. }
  740. }
  741. VOID CBoom::InitSystem()
  742. {
  743. CParticleSystem::InitSystem();
  744. m_shPartNum = 0;
  745. ZeroMemory(m_pszBoomFile, _MAX_BOOMFRAME*MAX_PATH);
  746. }
  747. VOID CBoom::DestroySystem()
  748. {
  749. CParticleSystem::DestroySystem();
  750. for ( INT nCnt = 0; nCnt < _MAX_BOOMFRAME; nCnt++ )
  751. {
  752. D3DTextr_Invalidate(m_pszBoomFile[nCnt]);
  753. D3DTextr_DestroyTexture(m_pszBoomFile[nCnt]);
  754. }
  755. InitSystem();
  756. }
  757. VOID CBoom::SetupSystem(WORD wCnt)
  758. {
  759. InitSystem();
  760. CParticleSystem::SetupSystem(wCnt);
  761. LoadTextr();
  762. SetEnvFactor(-0.05f, D3DVECTOR(0, 200, 0));
  763. }
  764. VOID CBoom::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
  765. {
  766. INT nSpeedRate = (nLoopTime / 17);
  767. INT nPartCnt = 0;
  768. if ( nSpeedRate < 1 ) 
  769. nSpeedRate = 1;
  770. m_fDeltaTime = 0.02f*nSpeedRate;
  771.     for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  772.     {
  773. if ( !m_pxParticle[nCnt].m_bIsDead )
  774. {
  775. m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
  776. if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife )
  777. {
  778. m_pxParticle[nCnt].Init();
  779. m_shPartNum--;
  780. nPartCnt--;
  781. }
  782. else
  783. {
  784. m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
  785. m_pxParticle[nCnt].m_fMass += 3.0f;
  786. if ( m_pxParticle[nCnt].m_fSize < 0 )
  787. m_pxParticle[nCnt].m_fSize = 0;
  788. if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
  789. {
  790. m_pxParticle[nCnt].m_wCurrDelay = 0;
  791. m_pxParticle[nCnt].m_wCurrFrame++;
  792. if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_BOOMFRAME )
  793. {
  794. m_pxParticle[nCnt].m_wCurrFrame = 0;
  795. }
  796. }
  797. m_pxParticle[nCnt].m_fSize = m_pxParticle[nCnt].m_fOriSize - m_pxParticle[nCnt].m_fOriSize*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  798. UpdateAirFiction(nCnt);
  799. UpdateMove(nCnt);
  800. }
  801. nPartCnt++;
  802. if ( nPartCnt >= m_shPartNum )
  803. return;
  804. }
  805.     }
  806. }
  807. HRESULT CBoom::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
  808. {
  809. INT nPartCnt = 0;
  810. if ( lpDevice )
  811. {
  812. if( SUCCEEDED(lpDevice->BeginScene()) )
  813. {
  814. D3DMATRIX matWorldOriginal;
  815. D3DMATRIX matTrans;
  816. D3DMATRIX matScale;
  817. D3DMATRIX matWorld;
  818. D3DVECTOR vTrans;
  819. D3DMATERIAL7 mtrl;
  820. lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  821. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  822. {
  823. if ( !m_pxParticle[nCnt].m_bIsDead )
  824. {
  825. D3DUtil_InitMaterial(mtrl, 
  826.  (FLOAT)m_pxParticle[nCnt].m_bRed/255.0f,
  827.  (FLOAT)m_pxParticle[nCnt].m_bGreen/255.0f, 
  828.  (FLOAT)m_pxParticle[nCnt].m_bBlue/255.0f);
  829. mtrl.diffuse.a = 0.0f;
  830. lpDevice->SetMaterial(&mtrl);
  831. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
  832. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  833. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  834. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  835. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  836. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  837. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  838.    vTrans.x = (FLOAT) m_pxParticle[nCnt].m_vecPos.x-400;
  839. vTrans.y = (FLOAT)-m_pxParticle[nCnt].m_vecPos.y+300;
  840. vTrans.z = (FLOAT) m_pxParticle[nCnt].m_vecPos.z; 
  841. D3DUtil_SetScaleMatrix(matScale, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize, 1);
  842. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  843. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  844. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  845. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszBoomFile[m_pxParticle[nCnt].m_wCurrFrame]));
  846. lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
  847. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  848. nPartCnt++;
  849. if ( nPartCnt >= m_shPartNum )
  850. break;
  851. }
  852. }
  853. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  854. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  855. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  856. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  857. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  858. lpDevice->EndScene();
  859. return S_OK;
  860. }
  861. }
  862. return E_FAIL;
  863. }
  864. VOID CBoom::SetBoomParticle(D3DVECTOR vecGenPos)
  865. {
  866. INT nGenCnt = 0;
  867. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  868. {
  869. if ( m_pxParticle[nCnt].m_bIsDead )
  870. {
  871. SetParticleDefault(nCnt, vecGenPos);
  872. m_shPartNum++;
  873. nGenCnt++;
  874. if ( nGenCnt > 10 )
  875. return;
  876. }
  877. }
  878. /* for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  879. {
  880. if ( m_pxParticle[nCnt].m_bIsDead )
  881. {
  882. // vecGenPos.x += GetRandomNum(-2, 2);
  883. // vecGenPos.y += GetRandomNum(-2, 2);
  884. // vecGenPos.z += GetRandomNum(-10, 10);
  885. SetParticleDefault(nCnt, vecGenPos);
  886. }
  887. }
  888. */
  889. }
  890. VOID CBoom::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
  891. {
  892. ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
  893.     m_pxParticle[wNum].m_vecPos = vecGenPos;
  894. //    m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-40, 40), (FLOAT)GetRandomNum(-100, -20), 0.0f);
  895. //    m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-60, 60), (FLOAT)GetRandomNum(-80, 0), 0.0f);
  896. //    m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-50, 50), (FLOAT)GetRandomNum(-100, -20), 0.0f);
  897. //    m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-60, 60), (FLOAT)GetRandomNum(-150, -50), 0.0f);
  898.     m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-75, 75), (FLOAT)GetRandomNum(-180, -50), 0.0f);
  899. m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(800, 1200);
  900. m_pxParticle[wNum].m_fMass = 1.0f;
  901. m_pxParticle[wNum].m_fSize = m_pxParticle[wNum].m_fOriSize = (FLOAT)GetRandomNum(5, 40) + _RAND_FLOAT;
  902. // m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum((BYTE)m_pxParticle[wNum].m_fSize*2000,  6000);
  903. // m_pxParticle[wNum].m_bIsDead = FALSE;
  904. /* m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed   = (FLOAT)GetRandomNum(200, 255);
  905. m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = (FLOAT)GetRandomNum(0, 150);
  906. m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue  = (FLOAT)GetRandomNum(0, 150);
  907. */
  908. /* m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed   = (FLOAT)GetRandomNum(150, 200);
  909. m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = (FLOAT)GetRandomNum(150, 200);
  910. m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue  = (FLOAT)GetRandomNum(200, 255);
  911. */
  912. m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed   = (FLOAT)GetRandomNum(0, 255);
  913. m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = m_pxParticle[wNum].m_bFstRed/2;
  914. m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue  = 0;
  915. m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(200, 300);
  916. // m_pxParticle[wNum].m_wCurrLife = 0;
  917. // m_pxParticle[wNum].m_wCurrDelay = 0;
  918. // m_pxParticle[wNum].m_wCurrFrame = 0;
  919. // m_pxParticle[wNum].m_bOpa = 255;
  920. }
  921. /******************************************************************************************************************
  922. CFlyingTail Class
  923. *******************************************************************************************************************/
  924. CFlyingTail::CFlyingTail()
  925. {
  926. InitSystem();
  927. }
  928. CFlyingTail::~CFlyingTail()
  929. {
  930. DestroySystem();
  931. }
  932. VOID CFlyingTail::LoadTextr()
  933. {
  934. CHAR* szFileList[] = 
  935. {
  936. "shine0.bmp",
  937. "shine1.bmp",
  938. "shine2.bmp",
  939. "shine3.bmp",
  940. "shine4.bmp",
  941. "shine5.bmp",
  942. "shine6.bmp",
  943. "shine7.bmp",
  944. "shine8.bmp",
  945. "shine9.bmp",
  946. };
  947. for ( INT nCnt = 0; nCnt < _MAX_FLYTAILFRAME; nCnt++ )
  948. {
  949. strcpy(m_pszFlyingTailFile[nCnt], szFileList[nCnt]);
  950. D3DTextr_CreateTextureFromFile(m_pszFlyingTailFile[nCnt]);
  951. D3DTextr_Restore(m_pszFlyingTailFile[nCnt], g_xMainWnd.Get3DDevice());
  952. }
  953. }
  954. VOID CFlyingTail::InitSystem()
  955. {
  956. CParticleSystem::InitSystem();
  957. m_shPartNum = 0;
  958. ZeroMemory(m_pszFlyingTailFile, _MAX_FLYTAILFRAME*MAX_PATH);
  959. }
  960. VOID CFlyingTail::DestroySystem()
  961. {
  962. CParticleSystem::DestroySystem();
  963. for ( INT nCnt = 0; nCnt < _MAX_FLYTAILFRAME; nCnt++ )
  964. {
  965. D3DTextr_Invalidate(m_pszFlyingTailFile[nCnt]);
  966. D3DTextr_DestroyTexture(m_pszFlyingTailFile[nCnt]);
  967. }
  968. InitSystem();
  969. }
  970. VOID CFlyingTail::SetupSystem(WORD wCnt)
  971. {
  972. InitSystem();
  973. CParticleSystem::SetupSystem(wCnt);
  974. LoadTextr();
  975. SetEnvFactor(-0.05f, D3DVECTOR(100, 1000, 0));
  976. }
  977. VOID CFlyingTail::SetFlyTailParticle(D3DVECTOR vecGenPos)
  978. {
  979. INT nGenCnt = 0;
  980. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  981. {
  982. if ( m_pxParticle[nCnt].m_bIsDead )
  983. {
  984. SetParticleDefault(nCnt, vecGenPos);
  985. m_shPartNum++;
  986. nGenCnt++;
  987. if ( nGenCnt > 2 )
  988. return;
  989. }
  990. }
  991. }
  992. VOID CFlyingTail::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
  993. {
  994. BYTE bRate;
  995. INT  nSpeedRate, nPartCnt;
  996. nPartCnt = 0;
  997. nSpeedRate = (nLoopTime / 17);
  998. if ( nSpeedRate < 1 )  nSpeedRate = 1;
  999. int check = 0;
  1000. m_fDeltaTime = 0.02f*nSpeedRate;
  1001.     for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  1002.     {
  1003. if ( !m_pxParticle[nCnt].m_bIsDead )
  1004. {
  1005. m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
  1006. if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife )
  1007. {
  1008. m_pxParticle[nCnt].Init();
  1009. m_shPartNum--;
  1010. nPartCnt--;
  1011. }
  1012. else
  1013. {
  1014. m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
  1015. if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
  1016. {
  1017. m_pxParticle[nCnt].m_wCurrDelay = 0;
  1018. m_pxParticle[nCnt].m_wCurrFrame++;
  1019. if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_FLYTAILFRAME )
  1020. {
  1021. m_pxParticle[nCnt].m_wCurrFrame = 0;
  1022. }
  1023. }
  1024. bRate = m_pxParticle[nCnt].m_bFstRed - m_pxParticle[nCnt].m_bFstRed*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1025. m_pxParticle[nCnt].m_bRed = bRate;
  1026. bRate = m_pxParticle[nCnt].m_bFstGreen - m_pxParticle[nCnt].m_bFstGreen*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1027. m_pxParticle[nCnt].m_bGreen = bRate;
  1028. bRate = m_pxParticle[nCnt].m_bFstBlue - m_pxParticle[nCnt].m_bFstBlue*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1029. m_pxParticle[nCnt].m_bBlue = bRate;
  1030. UpdateAirFiction(nCnt);
  1031. UpdateMove(nCnt);
  1032. }
  1033. nPartCnt++;
  1034. if ( nPartCnt >= m_shPartNum )
  1035. {
  1036. return;
  1037. }
  1038. }
  1039.     }
  1040. }
  1041. HRESULT CFlyingTail::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
  1042. {
  1043. INT  nPartCnt;
  1044. nPartCnt = 0;
  1045. if ( lpDevice )
  1046. {
  1047. if( SUCCEEDED(lpDevice->BeginScene()) )
  1048. {
  1049. D3DMATRIX matWorldOriginal;
  1050. D3DMATRIX matTrans;
  1051. D3DMATRIX matScale;
  1052. D3DMATRIX matWorld;
  1053. D3DVECTOR vTrans;
  1054. D3DMATERIAL7 mtrl;
  1055. lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1056. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  1057. {
  1058. if ( !m_pxParticle[nCnt].m_bIsDead )
  1059. {
  1060. D3DUtil_InitMaterial(mtrl, 
  1061.  (FLOAT)m_pxParticle[nCnt].m_bRed/255.0f,
  1062.  (FLOAT)m_pxParticle[nCnt].m_bGreen/255.0f, 
  1063.  (FLOAT)m_pxParticle[nCnt].m_bBlue/255.0f);
  1064. mtrl.diffuse.a = 0.0f;
  1065. lpDevice->SetMaterial(&mtrl);
  1066. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
  1067. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  1068. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  1069. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  1070. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  1071. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  1072. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  1073.    vTrans.x = (FLOAT) m_pxParticle[nCnt].m_vecPos.x-400;
  1074. vTrans.y = (FLOAT)-m_pxParticle[nCnt].m_vecPos.y+300;
  1075. vTrans.z = (FLOAT) m_pxParticle[nCnt].m_vecPos.z; 
  1076. D3DUtil_SetScaleMatrix(matScale, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize, 1);
  1077. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  1078. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  1079. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  1080. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszFlyingTailFile[m_pxParticle[nCnt].m_wCurrFrame]));
  1081. lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
  1082. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1083. nPartCnt++;
  1084. if ( nPartCnt >= m_shPartNum )
  1085. break;
  1086. }
  1087. }
  1088. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  1089. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  1090. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  1091. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  1092. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1093. lpDevice->EndScene();
  1094. return S_OK;
  1095. }
  1096. }
  1097. return E_FAIL;
  1098. }
  1099. VOID CFlyingTail::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
  1100. {
  1101. ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
  1102.     m_pxParticle[wNum].m_vecPos = vecGenPos;
  1103.     m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-50, 50), (FLOAT)GetRandomNum(-30, 60), 0.0f);
  1104. // m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(500, 1000);
  1105. m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(150, 400);
  1106. m_pxParticle[wNum].m_fMass = 1000.0f;
  1107. m_pxParticle[wNum].m_fSize = (FLOAT)GetRandomNum(5, 40) + _RAND_FLOAT;
  1108. m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed   = (FLOAT)GetRandomNum(200, 255);
  1109. m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = m_pxParticle[wNum].m_bFstRed/2;//(FLOAT)GetRandomNum(0, 125);
  1110. m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue  = (FLOAT)GetRandomNum(0, 30);
  1111. /*
  1112. m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed   = (FLOAT)GetRandomNum(200, 255);
  1113. m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = (FLOAT)GetRandomNum(0, 150);
  1114. m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue  = (FLOAT)GetRandomNum(0, 150);
  1115. */ m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(200, 300);
  1116. }
  1117. /******************************************************************************************************************
  1118. CSmoke Class
  1119. *******************************************************************************************************************/
  1120. CSmoke::CSmoke()
  1121. {
  1122. InitSystem();
  1123. }
  1124. CSmoke::~CSmoke()
  1125. {
  1126. DestroySystem();
  1127. }
  1128. VOID CSmoke::LoadTextr()
  1129. {
  1130. CHAR* szFileList[] = 
  1131. {
  1132. "Smoke.bmp",
  1133. };
  1134. for ( INT nCnt = 0; nCnt < _MAX_SMOKEFRAME; nCnt++ )
  1135. {
  1136. strcpy(m_pszSmokeFile[nCnt], szFileList[nCnt]);
  1137. D3DTextr_CreateTextureFromFile(m_pszSmokeFile[nCnt], 0L, D3DTEXTR_TRANSPARENTBLACK);
  1138. D3DTextr_Restore(m_pszSmokeFile[nCnt], g_xMainWnd.Get3DDevice());
  1139. }
  1140. }
  1141. VOID CSmoke::InitSystem()
  1142. {
  1143. CParticleSystem::InitSystem();
  1144. m_shPartNum = 0;
  1145. ZeroMemory(m_pszSmokeFile, _MAX_SMOKEFRAME*MAX_PATH);
  1146. }
  1147. VOID CSmoke::DestroySystem()
  1148. {
  1149. CParticleSystem::DestroySystem();
  1150. for ( INT nCnt = 0; nCnt < _MAX_SMOKEFRAME; nCnt++ )
  1151. {
  1152. D3DTextr_Invalidate(m_pszSmokeFile[nCnt]);
  1153. D3DTextr_DestroyTexture(m_pszSmokeFile[nCnt]);
  1154. }
  1155. InitSystem();
  1156. }
  1157. VOID CSmoke::SetupSystem(WORD wCnt)
  1158. {
  1159. InitSystem();
  1160. CParticleSystem::SetupSystem(wCnt);
  1161. LoadTextr();
  1162. SetEnvFactor(-0.05f, D3DVECTOR(0, 1000, 0));
  1163. }
  1164. VOID CSmoke::UpdateSystem(INT nLoopTime, D3DVECTOR vecGenPos)
  1165. {
  1166. BYTE bRate;
  1167. INT  nSpeedRate, nPartCnt;
  1168. D3DVECTOR vecAddVel;
  1169. nPartCnt = 0;
  1170. nSpeedRate = (nLoopTime / 17);
  1171. if ( nSpeedRate < 1 )  nSpeedRate = 1;
  1172. m_fDeltaTime = 0.02f*nSpeedRate;
  1173. // SetSmokeParticle(vecGenPos);
  1174.     for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  1175.     {
  1176. if ( !m_pxParticle[nCnt].m_bIsDead )
  1177. {
  1178. m_pxParticle[nCnt].m_wCurrLife += nLoopTime;
  1179. if ( m_pxParticle[nCnt].m_wCurrLife > m_pxParticle[nCnt].m_wLife )
  1180. {
  1181. m_pxParticle[nCnt].Init();
  1182. m_shPartNum--;
  1183. nPartCnt--;
  1184. }
  1185. else
  1186. {
  1187. m_pxParticle[nCnt].m_wCurrDelay += nLoopTime;
  1188. if ( m_pxParticle[nCnt].m_wCurrDelay > m_pxParticle[nCnt].m_wDelay )
  1189. {
  1190. m_pxParticle[nCnt].m_wCurrDelay = 0;
  1191. m_pxParticle[nCnt].m_wCurrFrame++;
  1192. if ( m_pxParticle[nCnt].m_wCurrFrame >= _MAX_SMOKEFRAME )
  1193. {
  1194. m_pxParticle[nCnt].m_wCurrFrame = 0;
  1195. }
  1196. }
  1197. // m_pxParticle[nCnt].m_fSize = m_pxParticle[nCnt].m_fOriSize + m_pxParticle[nCnt].m_fOriSize*15.0f*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1198. // vecAddVel = D3DVECTOR((FLOAT)GetRandomNum(-1, 1), GetRandomNum(-2, 0), 0.0f);
  1199. m_pxParticle[nCnt].m_fSize = m_pxParticle[nCnt].m_fOriSize + m_pxParticle[nCnt].m_fOriSize*7.0f*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1200. vecAddVel = D3DVECTOR((FLOAT)GetRandomNum(-1, 1), 0.0f, 0.0f);
  1201. m_pxParticle[nCnt].m_vecVel += vecAddVel;
  1202. bRate = m_pxParticle[nCnt].m_bFstRed - m_pxParticle[nCnt].m_bFstRed*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1203. m_pxParticle[nCnt].m_bRed = bRate;
  1204. bRate = m_pxParticle[nCnt].m_bFstGreen - m_pxParticle[nCnt].m_bFstGreen*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1205. m_pxParticle[nCnt].m_bGreen = bRate;
  1206. bRate = m_pxParticle[nCnt].m_bFstBlue - m_pxParticle[nCnt].m_bFstBlue*(FLOAT)((FLOAT)m_pxParticle[nCnt].m_wCurrLife/(FLOAT)m_pxParticle[nCnt].m_wLife);
  1207. m_pxParticle[nCnt].m_bBlue = bRate;
  1208. UpdateAirFiction(nCnt);
  1209. UpdateMove(nCnt);
  1210. }
  1211. nPartCnt++;
  1212. if ( nPartCnt >= m_shPartNum )
  1213. return;
  1214. }
  1215.     }
  1216. }
  1217. VOID CSmoke::SetSmokeParticle(D3DVECTOR vecGenPos)
  1218. {
  1219. INT nGenCnt = 0;
  1220. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  1221. {
  1222. if ( m_pxParticle[nCnt].m_bIsDead )
  1223. {
  1224. SetParticleDefault(nCnt, vecGenPos);
  1225. m_shPartNum++;
  1226. nGenCnt++;
  1227. if ( nGenCnt > 0 )
  1228. return;
  1229. }
  1230. }
  1231. }
  1232. HRESULT CSmoke::RenderSystem(LPDIRECT3DDEVICE7 lpDevice)
  1233. {
  1234. INT  nPartCnt;
  1235. nPartCnt = 0;
  1236. if ( lpDevice )
  1237. {
  1238. if( SUCCEEDED(lpDevice->BeginScene()) )
  1239. {
  1240. D3DMATRIX matWorldOriginal;
  1241. D3DMATRIX matTrans;
  1242. D3DMATRIX matScale;
  1243. D3DMATRIX matWorld;
  1244. D3DVECTOR vTrans;
  1245. D3DMATERIAL7 mtrl;
  1246. lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1247. for ( INT nCnt = 0; nCnt < m_wNum; nCnt++ )
  1248. {
  1249. if ( !m_pxParticle[nCnt].m_bIsDead )
  1250. {
  1251. D3DUtil_InitMaterial(mtrl, 
  1252.  (FLOAT)m_pxParticle[nCnt].m_bRed/255.0f,
  1253.  (FLOAT)m_pxParticle[nCnt].m_bGreen/255.0f, 
  1254.  (FLOAT)m_pxParticle[nCnt].m_bBlue/255.0f);
  1255. mtrl.diffuse.a = 0.0f;
  1256. lpDevice->SetMaterial(&mtrl);
  1257. /*
  1258. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
  1259. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  1260. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  1261. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  1262. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  1263. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCCOLOR);
  1264. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
  1265. */
  1266. SetBlendRenderState(lpDevice, _BLEND_LIGHTINV, mtrl);
  1267.    vTrans.x = (FLOAT) m_pxParticle[nCnt].m_vecPos.x-400;
  1268. vTrans.y = (FLOAT)-m_pxParticle[nCnt].m_vecPos.y+300;
  1269. vTrans.z = (FLOAT) m_pxParticle[nCnt].m_vecPos.z; 
  1270. D3DUtil_SetScaleMatrix(matScale, m_pxParticle[nCnt].m_fSize, m_pxParticle[nCnt].m_fSize, 1);
  1271. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  1272. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  1273. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  1274. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_pszSmokeFile[m_pxParticle[nCnt].m_wCurrFrame]));
  1275. lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avShape, 4, NULL);
  1276. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1277. nPartCnt++;
  1278. if ( nPartCnt >= m_shPartNum )
  1279. break;
  1280. }
  1281. }
  1282. ResetBlendenderState(lpDevice);
  1283. /*
  1284. lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  1285. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  1286. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  1287. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  1288. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);*/
  1289. lpDevice->EndScene();
  1290. return S_OK;
  1291. }
  1292. }
  1293. return E_FAIL;
  1294. }
  1295. VOID CSmoke::SetParticleDefault(WORD wNum, D3DVECTOR vecGenPos)
  1296. {
  1297. ZeroMemory(&m_pxParticle[wNum], sizeof(CParticle));
  1298. // vecGenPos.x += (FLOAT)GetRandomNum(-5, 5);
  1299. // vecGenPos.y += (FLOAT)GetRandomNum(-8, 2);
  1300.     m_pxParticle[wNum].m_vecPos = vecGenPos;
  1301.     m_pxParticle[wNum].m_vecVel = D3DVECTOR((FLOAT)GetRandomNum(-8, 8), /*(FLOAT)GetRandomNum(-15, -10)*/0.0f, 0.0f);
  1302. // m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(500, 1000);
  1303. m_pxParticle[wNum].m_wLife = (FLOAT)GetRandomNum(150, 400);
  1304. m_pxParticle[wNum].m_fMass = 1000.0f;
  1305. // m_pxParticle[wNum].m_fSize = m_pxParticle[wNum].m_fOriSize = (FLOAT)GetRandomNum(5, 10) + _RAND_FLOAT;
  1306. m_pxParticle[wNum].m_fSize = m_pxParticle[wNum].m_fOriSize = (FLOAT)GetRandomNum(5, 10) + _RAND_FLOAT;
  1307. m_pxParticle[wNum].m_bRed = m_pxParticle[wNum].m_bFstRed = m_pxParticle[wNum].m_bGreen = m_pxParticle[wNum].m_bFstGreen = m_pxParticle[wNum].m_bBlue = m_pxParticle[wNum].m_bFstBlue = (FLOAT)GetRandomNum(100, 150);
  1308. m_pxParticle[wNum].m_wDelay = (FLOAT)GetRandomNum(200, 300);
  1309. }
  1310. /******************************************************************************************************************
  1311. CElec Class
  1312. *******************************************************************************************************************/
  1313. CElec::CElec()
  1314. {
  1315. InitElec();
  1316. }
  1317. CElec::~CElec()
  1318. {
  1319. DestroyElec();
  1320. }
  1321. VOID CElec::LoadTextr()
  1322. {
  1323. CHAR* szFileList[] = 
  1324. {
  1325. "Elec.bmp",
  1326. };
  1327. for ( INT nCnt = 0; nCnt < _MAX_ELECFRAME; nCnt++ )
  1328. {
  1329. strcpy(m_szElecFile[nCnt], szFileList[nCnt]);
  1330. D3DTextr_CreateTextureFromFile(m_szElecFile[nCnt]);
  1331. D3DTextr_Restore(m_szElecFile[nCnt], g_xMainWnd.Get3DDevice());
  1332. }
  1333. }
  1334. VOID CElec::SetupElec()
  1335. {
  1336. D3DVECTOR vNorm(0, 0, -1);
  1337. for ( INT nCntY = 0; nCntY < (_MAX_ELEC_NODEY+1); nCntY++ )
  1338. {
  1339. for ( INT nCntX = 0; nCntX < (_MAX_ELEC_NODEX+1); nCntX++ )
  1340. {
  1341. FLOAT fXPos = -0.5f+(FLOAT)nCntX/(FLOAT)(_MAX_ELEC_NODEX);
  1342. FLOAT fYPos = /*-0.5f+*/(FLOAT)nCntY/(FLOAT)(_MAX_ELEC_NODEY);
  1343. FLOAT fu = (FLOAT)nCntX/(FLOAT)(_MAX_ELEC_NODEX);
  1344. FLOAT fv = (FLOAT)nCntY/(FLOAT)(_MAX_ELEC_NODEY);
  1345. m_avElec[nCntY][nCntX] = D3DVERTEX(D3DVECTOR(fXPos, fYPos, 0), vNorm, fu, fv);
  1346. // m_avElec[nCntY][nCntX] = D3DLVERTEX(D3DVECTOR(fXPos, fYPos, 0), RGB(0, 255, 0), RGB(255, 0, 0), fu, fv);
  1347. }
  1348. }
  1349. memcpy(m_avSaveElec, m_avElec, (_MAX_ELEC_NODEY+1)*(_MAX_ELEC_NODEX+1)*sizeof(D3DVERTEX));
  1350. // 鸥老弃府帮狼 牢郸胶 积己.
  1351.     WORD* pwIndex = m_pwElecIndices;
  1352. for ( nCntY = 0; nCntY < _MAX_ELEC_NODEY; nCntY++ )
  1353. {
  1354. for ( INT nCntX = 0; nCntX < _MAX_ELEC_NODEX; nCntX++ )
  1355. {
  1356. *pwIndex++ = (nCntX+1)+((_MAX_ELEC_NODEX+1)*nCntY);
  1357. *pwIndex++ = nCntX+((_MAX_ELEC_NODEX+1)*(nCntY+1));
  1358. *pwIndex++ = (nCntX+1)+((_MAX_ELEC_NODEX+1)*(nCntY+1));
  1359. *pwIndex++ = nCntX+((_MAX_ELEC_NODEX+1)*(nCntY+1));
  1360. *pwIndex++ = (nCntX+1)+((_MAX_ELEC_NODEX+1)*nCntY);
  1361. *pwIndex++ = (nCntX)+((_MAX_ELEC_NODEX+1)*nCntY);
  1362. }
  1363. }
  1364. LoadTextr();
  1365. }
  1366. VOID CElec::InitElec()
  1367. {
  1368. ZeroMemory(m_szElecFile, _MAX_SNOWFRAME*MAX_PATH);
  1369. ZeroMemory(m_pwElecIndices, _ELEC_INDICES*sizeof(WORD));
  1370. ZeroMemory(m_avElec, sizeof(D3DVERTEX)*_MAX_ELEC_NODEY+1*_MAX_ELEC_NODEX+1);
  1371. ZeroMemory(m_avSaveElec, (_MAX_ELEC_NODEY+1)*(_MAX_ELEC_NODEX+1)*sizeof(D3DVERTEX));
  1372. m_fSize = 0;
  1373. m_fRadian = 0;
  1374. m_shPosX = 0;
  1375. m_shPosY = 0;
  1376. m_shDstPosX = 0;
  1377. m_shDstPosY = 0;
  1378. }
  1379. VOID CElec::DestroyElec()
  1380. {
  1381. for ( INT nCnt = 0; nCnt < _MAX_ELECFRAME; nCnt++ )
  1382. {
  1383. D3DTextr_Invalidate(m_szElecFile[nCnt]);
  1384. D3DTextr_DestroyTexture(m_szElecFile[nCnt]);
  1385. }
  1386. InitElec();
  1387. }
  1388. VOID CElec::UpdateElec(SHORT shPosX, SHORT shPosY, SHORT shDstPosX, SHORT shDstPosY)
  1389. {
  1390. DOUBLE dTheta = 0.0f;
  1391. FLOAT fDiv = 0.0f;
  1392. m_shPosX = shPosX;
  1393. m_shPosY = shPosY;
  1394. m_shDstPosX = shDstPosX;
  1395. m_shDstPosY = shDstPosY;
  1396. INT nAbsX = abs(m_shDstPosX - m_shPosX);
  1397. INT nAbsY = abs(m_shDstPosY - m_shPosY);
  1398. m_fSize = (FLOAT)sqrt(nAbsX*nAbsX + nAbsY*nAbsY);
  1399. // fDiv = (FLOAT)(nAbsY)/(FLOAT)(nAbsX);
  1400. fDiv = (FLOAT)-(m_shDstPosX - m_shPosX)/m_fSize;
  1401. m_fRadian = (FLOAT)asin(fDiv);
  1402. if ( m_shDstPosY - m_shPosY > 0 )
  1403. m_fRadian = g_PI/2 + g_PI/2 - m_fRadian;
  1404. // for ( INT nCntY = 0; nCntY < (_MAX_ELEC_NODEY+1); nCntY++ )
  1405. static int nCnt = 0;
  1406. nCnt++;
  1407. if ( nCnt >= 3 )
  1408. nCnt = 0;
  1409. if ( nCnt == 2 )
  1410. {
  1411. for ( INT nCntY = 1; nCntY < _MAX_ELEC_NODEY; nCntY++ )
  1412. {
  1413. // FLOAT fRandX = _RAND_FLOAT*1.3f  - 1.0f;
  1414. FLOAT fRandX = _RAND_FLOAT*0.8f - 0.4f;
  1415. FLOAT fRandY = _RAND_FLOAT*0.2f;
  1416. for ( INT nCntX = 0; nCntX < (_MAX_ELEC_NODEX+1); nCntX++ )
  1417. {
  1418. m_avElec[nCntY][nCntX].x = m_avSaveElec[nCntY][nCntX].x+fRandX;
  1419. // m_avElec[nCntY][nCntX].y = m_avSaveElec[nCntY][nCntX].y+fRandY;
  1420. }
  1421. }
  1422. }
  1423. /*
  1424. CHAR szBuff[MAX_PATH];
  1425. sprintf(szBuff, "->扼叼救:[%f] %f", m_fRadian, fDiv);
  1426. g_xMainWnd.PutsHan(g_xMainWnd.GetBackBuffer(), 0, 100, RGB(250, 125, 0), RGB(0, 0, 0), szBuff);
  1427. */
  1428. }
  1429. HRESULT CElec::RenderElec(LPDIRECT3DDEVICE7 lpDevice)
  1430. {
  1431. if ( lpDevice )
  1432. {
  1433. if( SUCCEEDED(lpDevice->BeginScene()) )
  1434. {
  1435. D3DMATRIX matWorldOriginal;
  1436. D3DMATRIX matTrans;
  1437. D3DMATRIX matScale;
  1438. D3DMATRIX matRot;
  1439. D3DMATRIX matTmpWorld;
  1440. D3DMATRIX matWorld;
  1441. D3DVECTOR vTrans;
  1442. D3DMATERIAL7 mtrl;
  1443. lpDevice->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1444. D3DUtil_InitMaterial(mtrl, 
  1445.  (FLOAT)200/255.0f,
  1446.  (FLOAT)200/255.0f, 
  1447.  (FLOAT)255/255.0f);
  1448. mtrl.diffuse.a = 0.0f;
  1449. lpDevice->SetMaterial(&mtrl);
  1450. SetBlendRenderState(lpDevice, _BLEND_NORMAL, mtrl);
  1451. /* lpDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
  1452. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  1453. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  1454. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  1455. lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  1456. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  1457. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  1458. */
  1459.    vTrans.x = (FLOAT)m_shPosX-400;
  1460. vTrans.y = (FLOAT)-m_shPosY+300;
  1461. vTrans.z = (FLOAT)0; 
  1462. D3DUtil_SetRotateZMatrix(matRot, m_fRadian);
  1463. // D3DUtil_SetRotateZMatrix(matRot, g_PI*2/2);
  1464. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  1465. D3DUtil_SetScaleMatrix(matScale, 128/2, 512 , 1);
  1466. D3DMath_MatrixMultiply(matTmpWorld, matRot, matTrans);
  1467. D3DMath_MatrixMultiply(matWorld, matScale, matTmpWorld);
  1468. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  1469. // lpDevice->SetTexture(0, NULL);
  1470. lpDevice->SetTexture(0, D3DTextr_GetSurface(m_szElecFile[0]));
  1471. // lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING, FALSE);
  1472. lpDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
  1473.    D3DFVF_VERTEX,
  1474.    m_avElec, _ELEC_VERTICES, 
  1475.    m_pwElecIndices, _ELEC_INDICES, NULL);
  1476. /* lpDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
  1477.    D3DFVF_LVERTEX,
  1478.    m_avElec, _ELEC_VERTICES, 
  1479.    m_pwElecIndices, _ELEC_INDICES, NULL);
  1480. */
  1481. lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1482. // lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING, TRUE);
  1483. ResetBlendenderState(lpDevice);
  1484. /* lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  1485. lpDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  1486. lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  1487. lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  1488. */
  1489. lpDevice->EndScene();
  1490. return S_OK;
  1491. }
  1492. }
  1493. return E_FAIL;
  1494. }