monster.hpp
上传用户:zhj2929
上传日期:2022-07-23
资源大小:28772k
文件大小:8k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #ifndef _MONSTER_HPP
  2. #define _MONSTER_HPP
  3. #include "../../JGE/HGE/include/hgesprite.h"
  4. #include "../../JGE/HGE/include/hgeparticle.h"
  5. #include "Mario.hpp"
  6. extern HGE *hge;
  7. extern float mario_x;
  8. extern float mario_y;
  9. extern float mapPositionX;
  10. extern float mapPositionY;
  11. class Monster: public MoveableObject
  12. {
  13. private:
  14. JSprite* mRun;
  15. JSprite* mDie;
  16. JSprite* mIdle;
  17. TileMap* mMap;
  18.     
  19. u8 mTileInfo;
  20. hgeSprite* spt;
  21. HTEXTURE tex;
  22. hgeParticleSystem * par1;
  23. hgeParticleSystem * par2;
  24. hgeParticleSystem * par3;
  25. hgeParticleSystem * par4;
  26. hgeParticleSystem * par5;
  27. hgeParticleSystem * par6;
  28. hgeParticleSystem * par7;
  29. hgeParticleSystem * par8;
  30. hgeParticleSystem * par9;
  31. hgeParticleSystem * par10;
  32. hgeParticleSystem * par11;
  33. hgeParticleSystem * par12;
  34. bool attack;
  35. int dead;
  36. public:
  37. Monster(GameStatePlay* app);
  38. virtual ~Monster();
  39. virtual void Update(float dt);
  40. virtual void HitLeft();
  41. virtual void HitRight();
  42. virtual void Render();
  43. void Spawn(int col, int row);
  44. void die();
  45. int aLive();
  46. int gameEnd;
  47. };
  48. void Monster::die()
  49. {       
  50. mCurrAnimation = mDie;
  51. dead  = 1 ;
  52. attack = 0 ;
  53. }
  54. int Monster::aLive()
  55. {
  56. if(dead==0)
  57. return 1;
  58. else
  59. return 0;
  60. }
  61. Monster::Monster(GameStatePlay* app): MoveableObject(app)
  62. {
  63. gameEnd = false ;
  64.     mMap = mApp->GetTileMap();
  65. mRun = new JSprite(mTexture, 131,329,110,160);
  66. mRun->SetHotSpot(0.0f, 160.0f);
  67. mRun->AddFrame(260,334,120,160);
  68. mRun->AddFrame(383,339,120,160);
  69. mRun->SetDuration(400.0f);
  70. mRun->StartAnimation();
  71. mIdle = new JSprite(mTexture, 131,329,110,160);
  72. mIdle->SetHotSpot(0.0f, 160.0f);
  73. mIdle->StartAnimation();
  74. mDie = new JSprite(mTexture, 131,329,110,160);
  75. mDie->SetHotSpot(0.0f, 160.0f);
  76. mDie->AddFrame(212,489,131,148);
  77. mDie->AddFrame(353,492,145,152);
  78. mDie->SetDuration(300.0f);
  79. mDie->StartAnimation();
  80. mCurrAnimation = mIdle;
  81. mYRenderOffset = 6.0f;
  82. mXVelocity = -DEFAULT_WALK_SPEED/2;
  83. mFlipped = false;
  84. mHScale = 0.80f;
  85. mVScale = 0.80f;
  86. mLeftAdjustment = 23;
  87. mRightAdjustment = 47;
  88. mHitLeftAdjustment = 2;
  89. mHitRightAdjustment = 46;
  90. mFallLeftAdjustment = -20;
  91. mFallRightAdjustment = -10;
  92. mRealHeight = 60;
  93. dead = 0 ;
  94. //粒子的渲染图形
  95. tex=hge->Texture_Load("particle/particles.png");
  96. //如果加载失败,则弹出提示窗口
  97.     if(!tex)
  98. {
  99. MessageBox(NULL, "Can't load particles.png", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
  100. }
  101. //设置粒子的渲染图形
  102.     spt=new hgeSprite(tex, 32, 32, 32, 32);
  103. spt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);
  104. spt->SetHotSpot(16,16);
  105. //初始化粒子系统,并点燃粒子系统
  106.     par1=new hgeParticleSystem("trail.psi",spt);
  107. par1->Fire();
  108. par2=new hgeParticleSystem("trail.psi",spt);
  109. par2->Fire();
  110. par3=new hgeParticleSystem("trail.psi",spt);
  111. par3->Fire();
  112. par4=new hgeParticleSystem("trail.psi",spt);
  113. par4->Fire();
  114. par5=new hgeParticleSystem("trail.psi",spt);
  115. par5->Fire();
  116. par6=new hgeParticleSystem("trail.psi",spt);
  117. par6->Fire();
  118. par7=new hgeParticleSystem("trail.psi",spt);
  119. par7->Fire();
  120. par8=new hgeParticleSystem("trail.psi",spt);
  121. par8->Fire();
  122. par9=new hgeParticleSystem("trail.psi",spt);
  123. par9->Fire();
  124. par10=new hgeParticleSystem("trail.psi",spt);
  125. par10->Fire();
  126. par11=new hgeParticleSystem("trail.psi",spt);
  127. par11->Fire();
  128. par12=new hgeParticleSystem("trail.psi",spt);
  129. par12->Fire();
  130. attack = false;
  131. }
  132. Monster::~Monster()
  133. {
  134. delete mRun;
  135. delete mIdle;
  136. delete mDie;
  137.     delete par1;
  138. delete par2;
  139. delete par3;
  140. delete par4;
  141.     delete par5;
  142. delete par6;
  143. delete par7;
  144. delete par8;
  145.     delete par9;
  146. delete par10;
  147. delete par11;
  148. delete par12;
  149. delete spt;
  150. hge->Texture_Free(tex);
  151. }
  152. void Monster::Update(float dt)
  153. { float distance=0.0f;
  154. distance+=mario_x;
  155.    // mCurrAnimation = mDie;
  156. if(dead)
  157. dead++;
  158. if(dead<1050&&dead)
  159.     mCurrAnimation->Update(dt);
  160. if(dead>=1050)
  161.             
  162. { mActive = false ;
  163. gameEnd = 1;
  164. }
  165.      if(dead==0)
  166.  {
  167.  mCurrAnimation = mRun;
  168.  mCurrAnimation->Update(dt);
  169. if(mCurrAnimation->GetAnimationFrame()==2)
  170. {
  171. float marioPositionX,marioPositionY;
  172. float bossPositionX,bossPositionY;
  173. bossPositionX = this->GetX() - mapPositionX;
  174. bossPositionY = this->GetY() - mapPositionY;
  175. if(mario_y<=480)
  176. {
  177. //mCurrAnimation = mRun;
  178.                marioPositionX = mario_x - mapPositionX;
  179.                marioPositionY = mario_y - mapPositionY;
  180.    if(bossPositionX-marioPositionX<=250)
  181.    {
  182.   attack = true;
  183.                   par1->info.nEmission=(int)(10*10+10*10)*2;
  184.   
  185.   par1->MoveTo(bossPositionX-10,bossPositionY - 75);
  186.   par1->MoveTo(bossPositionX-150,bossPositionY + 100);
  187.   par2->info.nEmission=(int)(10*10+10*10)*2;
  188.   par2->MoveTo(bossPositionX-10,bossPositionY - 75);
  189.   par2->MoveTo(bossPositionX-200,bossPositionY + 70);
  190.   par3->info.nEmission=(int)(10*10+10*10)*2;
  191.   par3->MoveTo(bossPositionX-10,bossPositionY - 75);
  192.   par3->MoveTo(bossPositionX-240,bossPositionY + 40);
  193.   par4->info.nEmission=(int)(10*10+10*10)*2;
  194.   par4->MoveTo(bossPositionX-10,bossPositionY - 75);
  195.   par4->MoveTo(bossPositionX-270,bossPositionY + 10);
  196.   par5->info.nEmission=(int)(10*10+10*10)*2;
  197.   par5->MoveTo(bossPositionX-10,bossPositionY - 75);
  198.   par5->MoveTo(bossPositionX-290,bossPositionY - 20);
  199.   par6->info.nEmission=(int)(10*10+10*10)*2;
  200.   par6->MoveTo(bossPositionX-10,bossPositionY - 75);
  201.   par6->MoveTo(bossPositionX-300,bossPositionY - 50);
  202.   par7->info.nEmission=(int)(10*10+10*10)*2;
  203.   
  204.   par7->MoveTo(bossPositionX-10,bossPositionY - 75);
  205.   par7->MoveTo(bossPositionX-300,bossPositionY - 100);
  206.   par8->info.nEmission=(int)(10*10+10*10)*2;
  207.   par8->MoveTo(bossPositionX-10,bossPositionY - 75);
  208.   par8->MoveTo(bossPositionX-290,bossPositionY - 130);
  209.   par9->info.nEmission=(int)(10*10+10*10)*2;
  210.   par9->MoveTo(bossPositionX-10,bossPositionY - 75);
  211.   par9->MoveTo(bossPositionX-270,bossPositionY - 160);
  212.   par10->info.nEmission=(int)(10*10+10*10)*2;
  213.   par10->MoveTo(bossPositionX-10,bossPositionY - 75);
  214.   par10->MoveTo(bossPositionX-240,bossPositionY - 190);
  215.   par11->info.nEmission=(int)(10*10+10*10)*2;
  216.   par11->MoveTo(bossPositionX-10,bossPositionY - 75);
  217.   par11->MoveTo(bossPositionX-200,bossPositionY - 210);
  218.   par12->info.nEmission=(int)(10*10+10*10)*2;
  219.   par12->MoveTo(bossPositionX-10,bossPositionY - 75);
  220.   par12->MoveTo(bossPositionX-150,bossPositionY - 240);
  221.   par1->Update(dt);
  222.   par2->Update(dt);
  223.   par3->Update(dt);
  224.   par4->Update(dt);
  225.   par5->Update(dt);
  226.   par6->Update(dt);
  227.   par7->Update(dt);
  228.   par8->Update(dt);
  229.   par9->Update(dt);
  230.   par10->Update(dt);
  231.   par11->Update(dt);
  232.   par12->Update(dt);
  233.   if((marioPositionX-bossPositionX)*(marioPositionX-bossPositionX)+ (marioPositionY-bossPositionY)*(marioPositionY-bossPositionY)<250*250)
  234.   {
  235.   gameEnd = 2;
  236.   }
  237.    }
  238.    else
  239.    {
  240.    attack = false;
  241.    }
  242. }
  243. else
  244. {
  245.                marioPositionX = mario_x;
  246.                marioPositionY = mario_y;
  247. }
  248. }
  249. else
  250. {
  251.               attack = false;
  252. }
  253. }
  254. }
  255. void Monster::Spawn(int col, int row)
  256. {
  257. mX = (float)(col<<TILE_SHIFT);
  258. mY = (float)((row+1)<<TILE_SHIFT) - 1.0f;
  259. SetActive(true);
  260. }
  261. void Monster::HitLeft()
  262. {
  263. mXVelocity = DEFAULT_WALK_SPEED/2;
  264. mCurrAnimation->SetFlip(true);
  265. }
  266. void Monster::HitRight()
  267. {
  268. mXVelocity = -DEFAULT_WALK_SPEED/2;
  269. mCurrAnimation->SetFlip(false);
  270. }
  271. void Monster::Render()
  272. {
  273. if(mY<=470)
  274. {
  275.   float x, y;
  276.   mCurrAnimation->SetScale(mHScale, mVScale);
  277.   mMap->GetPosition(&x, &y);
  278.   mCurrAnimation->SetPosition(mX-x, mY-y+mYRenderOffset);
  279.   mCurrAnimation->Render();
  280.   if(attack)
  281.   {
  282.     par1->Render();
  283. par2->Render();
  284. par3->Render();
  285. par4->Render();
  286. par5->Render();
  287. par6->Render();
  288. par7->Render();
  289. par8->Render();
  290. par9->Render();
  291. par10->Render();
  292. par11->Render();
  293. par12->Render();
  294.   }
  295. }
  296. }
  297. #endif