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

游戏引擎

开发平台:

Visual C++

  1. #include "StatePlay.h"
  2. #include "StateMenu.h"
  3. #include "PlayCommand.h"
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #define  _CRTDBG_MAP_ALLOC
  7. #include <crtdbg.h>
  8. #ifdef _DEBUG
  9. #define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
  10. #endif
  11. CStatePlay::CStatePlay(void)
  12. {
  13. int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
  14. tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
  15. _CrtSetDbgFlag( tmpFlag );
  16. m_pButton = new CbuttonFont( L"返回主菜单", 25 );
  17. m_pFont = new GfxFont("幼圆",20,true);
  18. m_pFont->SetColor(0xff30e97f);
  19. m_pPlay = new ST_GAME_PLAY;
  20. m_pPlay->SetZero();
  21. memset(m_vSprite,NULL,sizeof(m_vSprite));
  22. InitializeDate();
  23. m_pPlayManage = new CSceneManage( new CPlayCommand(m_vSprite,m_pPlay) );
  24. }
  25. CStatePlay::~CStatePlay(void)
  26. {
  27. SAFE_DELETE( m_pButton );
  28. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i ++ )
  29. {
  30. SAFE_DELETE(m_vSprite[i]);
  31. }
  32. SAFE_DELETE(m_pPlay);
  33. SAFE_DELETE( m_pPlayManage );
  34. SAFE_DELETE( m_pFont );
  35. SAFE_DELETE( m_pButton );
  36. }
  37. // 逻辑实现
  38. bool CStatePlay::Logic(void)
  39. {
  40. if ( m_pButton->Logic(15,275 ) )
  41. return true;
  42. m_pPlay->score -= g_Hge->Timer_GetDelta()*2;
  43. if ( m_pPlay->score <= 0 )
  44. return true;
  45. return m_pPlayManage->Logic();
  46. }
  47. // 渲染实现
  48. void CStatePlay::Render(void)
  49. {
  50. RenderBack();
  51. DrawLine();
  52. m_pButton->Render();
  53. m_pFont->Print( 30,350,"积分:%d",(int)m_pPlay->score );
  54. float m_fsize = m_pPlay->width/72.0f - 0.15f; 
  55. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i ++)
  56. {
  57. m_vSprite[i]->Render(m_fsize);
  58. #ifdef _DEBUG
  59. g_Font->Print(m_vSprite[i]->m_fx-20,m_vSprite[i]->m_fy,"[%d][%d]",i,m_vSprite[i]->m_nType);
  60. #endif
  61. }
  62. m_pPlayManage->Render();
  63. }
  64. // 初始化游戏数据
  65. void CStatePlay::InitializeDate(void)
  66. {
  67. m_pPlay->check_sum = 
  68. g_Hge->Ini_GetInt( "Play", "check sum", 3 );
  69. m_pPlay->spr_sum = 
  70. g_Hge->Ini_GetInt( "Play", "sprite", 4 );
  71. m_pPlay->score = 
  72. (float)g_Hge->Ini_GetInt( "Play", "score", 50 );
  73. m_pPlay->size = 
  74. g_Hge->Ini_GetInt( "Play", "size", 8 );
  75. m_pPlay->width = 460.0f/m_pPlay->size;
  76. srand((unsigned)time(NULL));
  77. int mi_type = 0,mj_type = 0;
  78. for (int i = 0;i < m_pPlay->size*m_pPlay->size;i ++ )
  79. {
  80. mi_type = 0;
  81. mj_type = 0;
  82. if ( i % 8 >= m_pPlay->check_sum - 1 )
  83. {
  84. int mt_at = m_pPlay->check_sum - 1;
  85. mi_type = m_vSprite[i-mt_at]->m_nType;
  86. }
  87. if ( i+m_pPlay->size >= m_pPlay->size*m_pPlay->check_sum )
  88. {
  89. int mt_at = m_pPlay->size*(m_pPlay->check_sum-1); 
  90. mj_type = m_vSprite[i-mt_at]->m_nType;
  91. }
  92. m_vSprite[i] = new CSprite(mi_type,mj_type,m_pPlay->spr_sum);
  93. m_vSprite[i]->m_fx = (i%m_pPlay->size) * m_pPlay->width 
  94. + 170.0f + m_pPlay->width/2.0f;
  95. m_vSprite[i]->m_fy = (i/m_pPlay->size) * m_pPlay->width 
  96. + 100.0f + m_pPlay->width/2.0f;
  97. }
  98. }
  99. // 绘制线框
  100. void CStatePlay::DrawLine(void)
  101. {
  102. DWORD color = 0xffd1abab;
  103. for (int i = 0;i <= m_pPlay->size;i ++ )
  104. {
  105. g_Hge->Gfx_RenderLine( 170.0f + i*m_pPlay->width,
  106.   100.0f, 
  107.   170.0f + i*m_pPlay->width,
  108.   560.0f, color );
  109. g_Hge->Gfx_RenderLine( 170.0f,
  110.   100.0f + i*m_pPlay->width, 
  111.   630.0f,
  112.   100.0f + i*m_pPlay->width, color );
  113. }
  114. }
  115. // 场景切换,返回true时退出游戏
  116. bool CStatePlay::Handle(CSceneManage *_SceneManage)
  117. {
  118. if ( NULL == _SceneManage )
  119. return false;
  120. _SceneManage->ChangeState( new CStateMenu() );
  121. return false;
  122. }