PlayCheckDel.cpp
上传用户:jalin138
上传日期:2022-02-12
资源大小:5720k
文件大小:9k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include "PlayCheckDel.h"
  2. #include "PlayChange.h"
  3. #include "PlayCommand.h"
  4. #include <time.h>
  5. CPlayCheckDel::CPlayCheckDel(CSprite* _Vector[],
  6.  ST_GAME_PLAY *_play)
  7. {
  8. m_pPlay   = _play;
  9. int i = 0;
  10. while ( i < m_pPlay->size*m_pPlay->size )
  11. {
  12. m_vSprite[i] = _Vector[i];
  13. i ++;
  14. }
  15. m_bHaveDel = false;
  16. Check_Del();
  17. m_nState = 1;
  18. m_sMatch = g_Res->GetEffect("Match");
  19. }
  20. CPlayCheckDel::~CPlayCheckDel(void)
  21. {
  22. m_pPlay = NULL;
  23. m_vMove.clear();
  24. memset(m_listDel,0,sizeof(m_listDel));
  25. std::list<hgeParticleSystem*>::iterator iter1;
  26. for (iter1 = m_listDelPar.begin();
  27. iter1 != m_listDelPar.end();
  28. iter1 ++)
  29. {
  30. SAFE_DELETE( *iter1 );
  31. }
  32. m_listDelPar.clear();
  33. memset(m_vSprite,NULL,sizeof(m_vSprite));
  34. m_listDelPar.clear();
  35. }
  36. // 状态逻辑接口
  37. bool CPlayCheckDel::Logic(void)
  38. {
  39. if ( m_bHaveDel )
  40. {
  41. UpdateDelPar();
  42. switch ( m_nState )
  43. {
  44. case 1:
  45. if ( SetColor() )
  46. m_nState = 2;
  47. break;
  48. case 2:
  49. if ( SetMove() )
  50. {
  51. m_nState = 3;
  52. }
  53. else
  54. {
  55. if ( Check_Del() )
  56. m_nState = 1;
  57. else
  58. return true;
  59. }
  60. break;
  61. case 3:
  62. if ( DropMove() )
  63. m_nState = 2;
  64. break;
  65. default:
  66. break;
  67. }
  68. return false;
  69. }
  70. return true;
  71. }
  72. // 状态渲染接口
  73. void CPlayCheckDel::Render(void)
  74. {
  75. std::list<hgeParticleSystem*>::iterator iter1;
  76. for ( iter1 = m_listDelPar.begin();
  77. iter1 != m_listDelPar.end();
  78. iter1 ++ )
  79. {
  80. (*iter1)->Render();
  81. }
  82. #ifdef _DEBUG
  83. g_Font->Print(10,30,"Play CheckDel");
  84. float mt_x = 0,mt_y = 0;
  85. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i++)
  86. {
  87. if ( m_listDel[i] >= 0 )
  88. {
  89. g_Font->Print( 650.0f+mt_x, 260.0f+mt_y, "[%d]", m_listDel[i] );
  90. mt_x += 32;
  91. if (mt_x > 96)
  92. {
  93. mt_x = 0;
  94. mt_y += 20;
  95. }
  96. }
  97. }
  98. mt_x = 0;
  99. std::vector<int>::iterator iter3;
  100. for (iter3 = m_vMove.begin();
  101. iter3 != m_vMove.end();
  102. iter3++)
  103. {
  104. g_Font->Print( 650.0f+mt_x, 400.0f+mt_y, "[%d]", *iter3 );
  105. mt_x += 32;
  106. }
  107. #endif
  108. }
  109. // 检测消除
  110. bool CPlayCheckDel::Check_Del(void)
  111. {
  112. memset( m_listDel,-1,sizeof(m_listDel) );
  113. DeleteDelPar();
  114. m_vMove.clear();
  115. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i ++)
  116. {
  117. Check_Across(i);
  118. Check_Erect(i);
  119. }
  120. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i++)
  121. {
  122. if ( m_listDel[i] >= 0  )
  123. {
  124. m_bHaveDel = true;
  125. return true;
  126. }
  127. }
  128. return false;
  129. }
  130. // 横向检测
  131. bool CPlayCheckDel::Check_Across(const int _n)
  132. {
  133. if ( _n%m_pPlay->size > m_pPlay->size-m_pPlay->check_sum )
  134. return false;
  135. for (int i = 1;i < m_pPlay->check_sum;i ++)
  136. {
  137. if ( m_vSprite[_n+i]->m_nType != m_vSprite[_n]->m_nType )
  138. return false;
  139. }
  140. for (int i = 0;i < m_pPlay->check_sum;i ++) 
  141. {
  142. RegisterDle(_n+i);
  143. }
  144. return true;
  145. }
  146. // 列向检测
  147. bool CPlayCheckDel::Check_Erect(const int _n)
  148. {
  149. if ( _n / m_pPlay->size > m_pPlay->size - m_pPlay->check_sum )
  150. return false;
  151. for (int i = 1;i < m_pPlay->check_sum;i ++)
  152. {
  153. if ( m_vSprite[_n+m_pPlay->size*i]->m_nType != m_vSprite[_n]->m_nType )
  154. return false;
  155. }
  156. for (int i = 0;i < m_pPlay->check_sum;i ++)
  157. {
  158. RegisterDle(_n+m_pPlay->size*i);
  159. }
  160. return true;
  161. }
  162. // 记录消除项
  163. void CPlayCheckDel::RegisterDle(int _n)
  164. {
  165. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i++)
  166. {
  167. if ( m_listDel[i] == _n )
  168. return ;
  169. }
  170. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i++ )
  171. {
  172. if ( m_listDel[i] < 0 )
  173. {
  174. m_listDel[i] = _n;
  175. SetDelPar(_n);
  176. return ;
  177. }
  178. }
  179. }
  180. void CPlayCheckDel::RemoveDle(int _n)
  181. {
  182. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i++ )
  183. {
  184. if ( m_listDel[i] == _n )
  185. {
  186. m_listDel[i] = -1;
  187. return ;
  188. }
  189. }
  190. }
  191. // 消除效果
  192. bool CPlayCheckDel::UpdateDelPar(void)
  193. {
  194. std::list<hgeParticleSystem*>::iterator iter1;
  195. for ( iter1 = m_listDelPar.begin();
  196. iter1 != m_listDelPar.end();
  197. iter1 ++ )
  198. {
  199. if ((*iter1)->info.nEmission < 300 )
  200. (*iter1)->info.nEmission += 20;
  201. (*iter1)->Update(0.01f);
  202. }
  203. return false;
  204. }
  205. void CPlayCheckDel::SetDelPar(const int _n)
  206. {
  207. hgeSprite *sprPar = g_Res->GetSprite( "sprDel" );
  208. m_listDelPar.push_back( new hgeParticleSystem("particle/particle7.psi",sprPar) );
  209. float mt_x = (_n%m_pPlay->size)*m_pPlay->width + m_pPlay->width/2.0f+170.0f;
  210. float mt_y = (_n/m_pPlay->size)*m_pPlay->width + m_pPlay->width/2.0f+100.0f;
  211. m_listDelPar.back()->Fire();
  212. m_listDelPar.back()->MoveTo( mt_x, mt_y );
  213. m_listDelPar.back()->info.nEmission = 0; 
  214. }
  215. void CPlayCheckDel::DeleteDelPar(void)
  216. {
  217. std::list<hgeParticleSystem*>::iterator iter1;
  218. for (iter1 = m_listDelPar.begin();
  219. iter1 != m_listDelPar.end();
  220. iter1 ++)
  221. {
  222. SAFE_DELETE( *iter1 );
  223. }
  224. m_listDelPar.clear();
  225. }
  226. // 减少对象透明度
  227. bool CPlayCheckDel::SetColor(void)
  228. {
  229. int mt_n = 0;
  230. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i++)
  231. {
  232. if ( m_listDel[i] >= 0 )
  233. {
  234. m_vSprite[m_listDel[i]]->a -= 4;
  235. if ( m_vSprite[m_listDel[i]]->a < 50 )
  236. {
  237. m_pPlay->score += 2;//得分
  238. m_vSprite[m_listDel[i]]->a = 00;
  239. }
  240. mt_n = m_listDel[i];
  241. }
  242. }
  243. if ( m_vSprite[mt_n]->a < 1 )
  244. {
  245. g_Hge->Effect_Play(m_sMatch);
  246. std::list<hgeParticleSystem*>::iterator iter1;
  247. for ( iter1 = m_listDelPar.begin();
  248. iter1 != m_listDelPar.end();
  249. iter1 ++ )
  250. {
  251. (*iter1)->info.nEmission = 0;
  252. (*iter1)->Stop();
  253. }
  254. return true;
  255. }
  256. return false;
  257. }
  258. // 设置当前移动项
  259. bool CPlayCheckDel::SetMove(void)
  260. {
  261. // 检测是否为空
  262. int b_empty = true;
  263. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i ++)
  264. {
  265. if ( m_listDel[i] >= 0 )
  266. {
  267. b_empty = false;
  268. break;
  269. }
  270. }
  271. if ( b_empty )
  272. return false;
  273. m_vMove.clear();
  274. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i ++)
  275. {
  276. if ( m_listDel[i] >= 0 )
  277. {
  278. if ( m_listDel[i] < m_pPlay->size )
  279. {
  280. EddSprite( m_listDel[i] );
  281. RemoveDle( m_listDel[i] );
  282. continue;
  283. }
  284. SetMove(m_listDel[i]);
  285. }
  286. }
  287. return true;
  288. }
  289. bool CPlayCheckDel::SetMove(int _n)
  290. {
  291. std::vector<int>::iterator iter1;
  292. for (iter1 = m_vMove.begin();
  293. iter1 != m_vMove.end();
  294. iter1 ++ )
  295. {
  296. if (*iter1%m_pPlay->size == _n%m_pPlay->size )
  297. {
  298. return false;
  299. }
  300. }
  301. m_vMove.push_back( _n );
  302. return true;
  303. }
  304. // 落下
  305. bool CPlayCheckDel::DropMove(void)
  306. {
  307. static float mt_width = 0.0f;
  308. float mf_speed = 20.0f/m_pPlay->size;
  309. mt_width += mf_speed;
  310. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i ++)
  311. {
  312. std::vector<int>::iterator iter1;
  313. for (iter1 = m_vMove.begin();
  314. iter1 != m_vMove.end();
  315. iter1 ++)
  316. {
  317. if (  i%m_pPlay->size == *iter1%m_pPlay->size
  318. && i/m_pPlay->size < *iter1/m_pPlay->size )
  319. {
  320. m_vSprite[i]->m_fy += mf_speed;
  321. }
  322. }
  323. }
  324. if ( mt_width > m_pPlay->width )
  325. {
  326. mt_width = 0.0f;
  327. std::vector<int>::iterator iter1;
  328. for (iter1 = m_vMove.begin();
  329. iter1 != m_vMove.end();
  330. iter1 ++)
  331. {
  332. Change( *iter1 );
  333. RemoveDle(*iter1);
  334. }
  335. m_vMove.clear();
  336. return true;
  337. }
  338. return false;
  339. }
  340. // 交换
  341. bool CPlayCheckDel::Change(const int _n)
  342. {
  343. if ( _n < m_pPlay->size )
  344. {
  345. EddSprite(_n);
  346. return true;
  347. }
  348. int n1 = _n;
  349. for (int i = 0;i < _n/m_pPlay->size;i ++)
  350. {
  351. int n2 = n1 - m_pPlay->size;
  352. int temp = 0;
  353. temp = m_vSprite[n1]->m_nType;
  354. m_vSprite[n1]->m_nType = m_vSprite[n2]->m_nType;
  355. m_vSprite[n2]->m_nType = temp;
  356. temp = m_vSprite[n1]->a;
  357. m_vSprite[n1]->a = m_vSprite[n2]->a;
  358. m_vSprite[n2]->a = temp;
  359. hgeSprite *spr = NULL;
  360. spr = m_vSprite[n1]->m_pSpr;
  361. m_vSprite[n1]->m_pSpr = m_vSprite[n2]->m_pSpr;
  362. m_vSprite[n2]->m_pSpr = spr;
  363. m_vSprite[n1]->m_fx = 
  364. (n1%m_pPlay->size) * m_pPlay->width + 170.0f + m_pPlay->width/2.0f;
  365. m_vSprite[n1]->m_fy = 
  366. (n1/m_pPlay->size) * m_pPlay->width + 100.0f + m_pPlay->width/2.0f;
  367. m_vSprite[n2]->m_fx = 
  368. (n2%m_pPlay->size) * m_pPlay->width + 170.0f + m_pPlay->width/2.0f;
  369. m_vSprite[n2]->m_fy = 
  370. (n2/m_pPlay->size) * m_pPlay->width + 100.0f + m_pPlay->width/2.0f;
  371. n1 -= m_pPlay->size;
  372. }
  373. EddSprite(_n);
  374. return true;
  375. }
  376. // 增加
  377. bool CPlayCheckDel::EddSprite(const int _n)
  378. {
  379. int n = _n%m_pPlay->size;
  380. srand((unsigned)time(NULL));
  381. int mi_type = 0,mj_type = 0,m_type = 0;
  382. for (int i = 0;i < m_pPlay->size;i ++ )
  383. {
  384. if ( n == i )
  385. {
  386. if ( i >= m_pPlay->check_sum - 1 )
  387. {
  388. int mt_at = m_pPlay->check_sum - 1;
  389. mi_type = m_vSprite[i-mt_at]->m_nType;
  390. }
  391. int mt_at = m_pPlay->size*(m_pPlay->check_sum-1);
  392. mj_type = m_vSprite[i+mt_at]->m_nType;
  393. m_type = rand()%m_pPlay->spr_sum+1;
  394. while ( m_type == mi_type || m_type == mj_type )
  395. {
  396. m_type = rand()%m_pPlay->spr_sum+1;
  397. }
  398. m_vSprite[i]->m_nType = m_type;
  399. char sprName[24] = {0};
  400. sprintf_s( sprName, sizeof(sprName), "sprSprite%d", m_type );
  401. m_vSprite[i]->m_pSpr = g_Res->GetSprite( sprName );
  402. m_vSprite[i]->m_fx = (i%m_pPlay->size) * m_pPlay->width 
  403. + 170.0f + m_pPlay->width/2.0f;
  404. m_vSprite[i]->m_fy = 100.0f + m_pPlay->width/2.0f;
  405. m_vSprite[i]->a = 255;
  406. return true;
  407. }
  408. }
  409. return false;
  410. }
  411. // 传入场景管理对象,以改变状态
  412. bool CPlayCheckDel::Handle(CSceneManage *_Manage)
  413. {
  414. if ( NULL == _Manage )
  415. return false;
  416. if ( !m_bHaveDel )
  417. {
  418. int mt_n = 0;
  419. mt_n = m_pPlay->nChoice1;
  420. m_pPlay->nChoice1 = m_pPlay->nChoice2;
  421. m_pPlay->nChoice2 = mt_n;
  422. _Manage->ChangeState( new CPlayChange(m_vSprite,m_pPlay,PLAY_CHACK_DEL) );
  423. }
  424. else
  425. {
  426. _Manage->ChangeState( new CPlayCommand(m_vSprite,m_pPlay) );
  427. }
  428. return false;
  429. }