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

游戏引擎

开发平台:

Visual C++

  1. #ifndef _MARIO_HPP_
  2. #define _MARIO_HPP_
  3. class JumpingBlock;
  4. #include "Weasel.hpp"
  5. #include "Snowman.hpp"
  6. #include "Turtle.hpp"
  7. #include "monster.hpp"
  8. #include "../../JGE/HGE/include/hgesprite.h"
  9. #include "../../JGE/HGE/include/hgeparticle.h"
  10. extern HGE *hge;
  11. class Mario: public MoveableObject
  12. {
  13. private:
  14. JSprite* mRun;
  15. JSprite* mIdle;
  16. JSprite* mJump;
  17. JSprite* mDuck;
  18. hgeSprite* spt;
  19. HTEXTURE mTex;
  20. hgeParticleSystem * mPar;
  21. bool attack;
  22. float mTall;
  23. float mBulletStartX,mBulletStartY;
  24. float  mBulletX,mBulletY;
  25. float keepdirection;
  26.     bool  hurt[10];
  27. public:
  28. Mario(GameStatePlay* app);
  29. virtual ~Mario();
  30. float experience;
  31. virtual void Update(float dt);
  32. virtual void Render();
  33. virtual void HitBottom(int left, int right, int row);
  34. virtual void StandingOnNothing(int col, int row);
  35. virtual void HitTop(int colLeft, int colRight, int row);
  36. virtual void HitRight(int colLeft, int colRight, int row);
  37. virtual void EatFruit(int colLeft, int colRight, int row);
  38. virtual void Bullet(float x, float y,float direction);
  39.     virtual void Hit();
  40. void AnswerRight();
  41. void AnswerWrong();
  42. int getExperience();
  43. };
  44. Mario::Mario(GameStatePlay* app): MoveableObject(app)
  45. {
  46. mMap = mApp->GetTileMap();
  47. mIdle = new JSprite(mTexture, 0, 0, 100, 88);
  48. mIdle->SetHotSpot(0.0f, 93.0f);
  49. mJump = new JSprite(mTexture, 300, 0, 100, 90);
  50. mJump->SetHotSpot(0.0f, 95.0f);
  51. mDuck = new JSprite(mTexture, 400, 0, 100, 90);
  52. mDuck->SetHotSpot(0.0f, 95.0f);
  53. mRun = new JSprite(mTexture, 0, 0, 100, 88);
  54. mRun->SetHotSpot(0.0f, 93.0f);
  55. mRun->AddFrame(100,0,100,95);
  56. mRun->AddFrame(200,0,100,95);
  57. mRun->StartAnimation();
  58. mCurrAnimation = mIdle;
  59. mCurrAnimation->SetFlip(true);
  60. mX = 32.0f;
  61. mY = VIRTUAL_HEIGHT - 32.0f - 1.0f;
  62. mTall = 64.0f;
  63. mYRenderOffset = 3.0f;
  64. mHScale = 0.70f;
  65. mVScale = 0.70f;
  66. mLeftAdjustment = 23;
  67. mRightAdjustment = 47;
  68. mHitLeftAdjustment = 12;
  69. mHitRightAdjustment = 58;
  70. mFallLeftAdjustment = -20;
  71. mFallRightAdjustment = -10;
  72. experience=0;
  73. mRealHeight = 60;
  74. experience = 0.0f;
  75. for(int i = 0 ;i < 10 ; i++)
  76. hurt[i] = false; 
  77. //粒子的渲染图形
  78. mTex=hge->Texture_Load("particle/particles.png");
  79. //如果加载失败,则弹出提示窗口
  80.     if(!mTex)
  81. {
  82. MessageBox(NULL, "Can't load particles.png", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
  83. }
  84. //设置粒子的渲染图形
  85.     spt=new hgeSprite(mTex, 32, 32, 32, 32);
  86. spt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);
  87. spt->SetHotSpot(16,16);
  88. //初始化粒子系统,并点燃粒子系统
  89.     mPar=new hgeParticleSystem("trail.psi",spt);
  90. mPar->Fire();
  91. mBulletX=0;
  92. mBulletY=0;
  93. keepdirection=1;
  94. attack = false;
  95. }
  96. Mario::~Mario()
  97. {
  98. delete mRun;
  99. delete mIdle;
  100. delete mDuck;
  101. delete mJump;
  102. delete mPar;
  103. }
  104. void Mario::Bullet(float x, float y,float direction)
  105. {
  106.  mBulletStartX=x-mapPositionX+25;
  107.  mBulletStartY=y-mapPositionY-25;
  108.  if(keepdirection==0)
  109.  keepdirection=direction;
  110.  if(mBulletY==0)
  111.  {
  112.  mBulletY=mBulletStartY;  
  113.  }
  114.   if(mBulletX==0)
  115.  {
  116.  mBulletX=mBulletStartX;  
  117.  }
  118.  attack = true;
  119.  float dt = mEngine->GetDelta();
  120.      mPar->info.nEmission=(int)(10*10+10*10)*2;
  121.  mPar->Transpose(mBulletX,mBulletY);
  122.  if(keepdirection>0)
  123.  mBulletX=mBulletX+2;
  124.  else
  125.  mBulletX=mBulletX-2;
  126.  
  127.  mPar->Update(dt);
  128.  if(((mBulletX-32)>512)||mBulletX<-32)
  129.  {
  130.  mBulletX=0;
  131.  mBulletY=0;
  132.  mBullet=false;
  133.  keepdirection=0;
  134.  }
  135.  for(int i =0 ;i<2 ;i++)
  136. {
  137.      Weasel* weasel = mApp->GetWeasel(i);
  138. Snowman* snowman = mApp->GetSnowman(i);
  139. Turtle* turtle = mApp->GetTurtle(i);
  140. Monster* monster = mApp->GetMonster();
  141. int bx=int(mBulletX)+int(mapPositionX)-25;
  142. int by=int(mBulletY)+int(mapPositionY)+25;
  143. int wx=int(weasel->GetX());
  144. int wy=int(weasel->GetY());
  145. int sx=int(snowman->GetX());
  146. int sy=int(snowman->GetY());
  147. int tx=int(turtle->GetX());
  148. int ty=int(turtle->GetY());
  149. int mx=int(monster->GetX());
  150. int my=int(monster->GetY());
  151. if(abs(wx-bx)<5&&abs(wy-by)<10)
  152. {
  153. weasel->die();
  154. mBullet=false;
  155. attack=false;
  156. }
  157. if(abs(sx-bx)<5&&abs(sy-by)<10)
  158. {
  159. snowman->die();
  160. mBullet=false;
  161. attack=false;
  162. }
  163. if(abs(tx-bx)<5&&abs(ty-by)<10)
  164. {
  165. turtle->die();
  166. mBullet=false;
  167. attack=false;
  168. }
  169. if(abs(mx-bx)<5&&abs(my-by)<10)
  170. {
  171. monster->die();
  172. mBullet=false;
  173. attack=false;
  174. }
  175.  }
  176. }
  177. void Mario::HitTop(int left, int right, int row)
  178. {
  179.     
  180. float dt = mEngine->GetDelta();
  181. int colLeft = (left>>TILE_SHIFT)<<TILE_SHIFT;
  182. int colRight = (right>>TILE_SHIFT)<<TILE_SHIFT;
  183. JumpingBlock* block = mApp->GetJumpingBlock();
  184. if (left < colLeft+24)
  185. {
  186. if(mApp->GetTileMap()->GetTileInfo(colLeft>>TILE_SHIFT, row)==BLOCK_QUES)
  187. {
  188. block->Update(dt);
  189. }
  190. block->Animate(colLeft>>TILE_SHIFT, row);
  191. }
  192. else
  193. {
  194. if(mApp->GetTileMap()->GetTileInfo(colRight>>TILE_SHIFT, row)==BLOCK_QUES)
  195. {
  196. block->Update(dt);
  197. }
  198. block->Animate(colRight>>TILE_SHIFT, row);
  199. }
  200. }
  201. void Mario::HitRight(int colLeft, int colRight, int row)
  202. {
  203. if(mApp->GetTileMap()->GetTileInfo(colRight>>TILE_SHIFT, row)==CHANGE_SEASON||mApp->GetTileMap()->GetTileInfo(colLeft>>TILE_SHIFT,row)==CHANGE_SEASON)
  204. {
  205. mApp->Season++;
  206. mApp->experience0=experience;
  207. }
  208. }
  209. void Mario::EatFruit(int left, int right, int row)
  210. {
  211.     
  212. float dt = mEngine->GetDelta();
  213. int colLeft = (left>>TILE_SHIFT)<<TILE_SHIFT;
  214. int colRight = (right>>TILE_SHIFT)<<TILE_SHIFT;
  215. JumpingBlock* block = mApp->GetJumpingBlock();
  216. if (left < colLeft+24)
  217. {
  218. if(mApp->GetTileMap()->GetTileInfo(colLeft>>TILE_SHIFT, row)==BLOCK_APPLE)
  219. {
  220. block->Update(dt);
  221. mApp->apple++;
  222. mApp->PlaySfx(2);
  223. }
  224. else if(mApp->GetTileMap()->GetTileInfo(colLeft>>TILE_SHIFT, row)==BLOCK_BANANA)
  225. {
  226. block->Update(dt);
  227. mApp->banana++;
  228. mApp->PlaySfx(2);
  229. }
  230. block->Animate(colLeft>>TILE_SHIFT, row);
  231. }
  232. else
  233. {
  234. if(mApp->GetTileMap()->GetTileInfo(colRight>>TILE_SHIFT, row)==BLOCK_APPLE)
  235. {
  236. block->Update(dt);
  237. mApp->apple++;
  238. mApp->PlaySfx(2);
  239. }
  240. else if(mApp->GetTileMap()->GetTileInfo(colRight>>TILE_SHIFT, row)==BLOCK_BANANA)
  241. {
  242. block->Update(dt);
  243. mApp->banana++;
  244. mApp->PlaySfx(2);
  245. }
  246. block->Animate(colRight>>TILE_SHIFT, row);
  247. }
  248. }
  249. void Mario::AnswerRight()
  250. {
  251.     experience+=4;
  252. }
  253. void Mario::AnswerWrong()
  254. {
  255.     experience-=2;
  256. }
  257. void Mario::Hit()
  258. {
  259. bool  check = false;
  260. for(int i =0 ;i<2 ;i++)
  261. {
  262.      Weasel* weasel = mApp->GetWeasel(i);
  263. Snowman* snowman = mApp->GetSnowman(i);
  264. Turtle* turtle = mApp->GetTurtle(i);
  265. Monster* monster = mApp->GetMonster();
  266. if(mX<(weasel->GetX()+3)&&mX>(weasel->GetX()-3)&&mY>(weasel->GetY()-54)&&mY<(weasel->GetY()))
  267. {
  268. weasel->die();
  269.     }
  270. else if(mX<(snowman->GetX()+3)&&mX>(snowman->GetX()-3)&&mY>(snowman->GetY()-174)&&mY<(snowman->GetY()))
  271. {
  272. snowman->die();
  273.     }
  274. if(!hurt[i])
  275. {
  276. if(mX<(weasel->GetX()+47)&&mX>(weasel->GetX())&&mY<(weasel->GetY()+34)&&mY>(weasel->GetY()-1))
  277. {
  278. if(weasel->aLive())
  279. {
  280.   hurt[i] = true;
  281.   check = true ;
  282. }
  283. }
  284. if(mX>(weasel->GetX())&&mX<(weasel->GetX()+47)&&mY<(weasel->GetY()+34)&&mY>(weasel->GetY()-1))
  285. {
  286. if(weasel->aLive())
  287. {
  288.   hurt[i] = true;
  289.   check = true ;
  290. }
  291. }
  292. if((mX>(snowman->GetX())&&mX<(snowman->GetX()+47)&&mY<(snowman->GetY()+134)&&mY>(snowman->GetY()-155)))
  293. {
  294. if(snowman->aLive())
  295. {
  296.   hurt[i] = true;
  297.   check = true ;
  298. }
  299. }
  300. if(mX>(snowman->GetX())&&mX<(snowman->GetX()+47)&&mY<(snowman->GetY()+34)&&mY>(snowman->GetY()-155))
  301. {
  302.  if(snowman->aLive())
  303. {
  304.   hurt[i] = true;
  305.   check = true ;
  306. }
  307. }
  308.   if((mX>(turtle->GetX())&&mX<(turtle->GetX()+47)&&mY<(turtle->GetY()+34)&&mY>(turtle->GetY()-1)))
  309. {
  310. if(turtle->aLive())
  311. {
  312.   hurt[i] = true;
  313.   check = true ;
  314. }
  315. }
  316. if(mX>(turtle->GetX())&&mX<(turtle->GetX()+47)&&mY<(turtle->GetY()+34)&&mY>(turtle->GetY()-1))
  317. {
  318. if(turtle->aLive())
  319. {
  320.   hurt[i] = true;
  321.   check = true ;
  322. }
  323. }
  324. }
  325. }
  326. if(check)
  327. experience-=0.001f;
  328.     for(int  i =0 ;i<10 ;i++)
  329. hurt[i] = false;
  330.             
  331. }
  332. void Mario::HitBottom(int left, int right, int row)
  333. {
  334. float dt = mEngine->GetDelta();
  335. int colLeft = (left>>TILE_SHIFT)<<TILE_SHIFT;
  336. int colRight = (right>>TILE_SHIFT)<<TILE_SHIFT;
  337. if(mApp->GetTileMap()->GetTileInfo(colRight>>TILE_SHIFT, row)==BLOCK_TUNNEL)
  338. {
  339. mApp->GetTileMap()->SetTileInfo(colRight>>TILE_SHIFT, row,0);
  340. mApp->GetTileMap()->SetTileInfo(colLeft>>TILE_SHIFT, row,0);
  341. mYVelocity = 0.0f;
  342. mJumping = true;
  343. }
  344. if(mApp->GetTileMap()->GetTileInfo(colRight>>TILE_SHIFT, row)==CHANGE_SEASON||mApp->GetTileMap()->GetTileInfo(colLeft>>TILE_SHIFT,row)==CHANGE_SEASON)
  345. {
  346. mApp->Season++;
  347. mApp->experience0=experience;
  348. }
  349. JumpingBlock* block = mApp->GetJumpingBlock();
  350. if (left < colLeft+24)
  351. {
  352. if(mApp->GetTileMap()->GetTileInfo(colLeft>>TILE_SHIFT, row)==BLOCK_BANANA)
  353. {
  354. block->Update(dt);
  355. }
  356. block->Animate(colLeft>>TILE_SHIFT, row);
  357. }
  358. else
  359. {
  360. if(mApp->GetTileMap()->GetTileInfo(colRight>>TILE_SHIFT, row)==BLOCK_BANANA)
  361. {
  362. block->Update(dt);
  363. }
  364. block->Animate(colRight>>TILE_SHIFT, row);
  365. }
  366. }
  367. void Mario::StandingOnNothing(int col, int row)
  368. {
  369. mCurrAnimation = mJump;
  370. MoveableObject::StandingOnNothing(col, row);
  371. }
  372. void Mario::Update(float dt)
  373. {
  374. if (mEngine->GetAnalogX() < 64)
  375. {
  376. mXVelocity = -DEFAULT_WALK_SPEED;
  377. if (!mJumping)
  378. mCurrAnimation = mRun;
  379. mCurrAnimation->SetFlip(false);
  380. mIdle->SetFlip(false);
  381. }
  382. else if (mEngine->GetAnalogX() > 192)
  383. {
  384. mXVelocity = DEFAULT_WALK_SPEED;
  385. if (!mJumping)
  386. mCurrAnimation = mRun;
  387. mCurrAnimation->SetFlip(true);
  388. mIdle->SetFlip(true);
  389. }
  390. else
  391. {
  392. mXVelocity = 0.0f;
  393. if (!mJumping)
  394. mCurrAnimation = mIdle;
  395. }
  396.     //int col , row;
  397. if (!mJumping)
  398. {
  399. #ifdef WIN32
  400. if (mEngine->GetAnalogY() < 64 || mEngine->GetButtonClick(PSP_CTRL_CIRCLE))
  401. #else
  402. if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE))
  403. #endif
  404. {
  405. mCurrAnimation = mJump;
  406. mJumping = true;
  407. mYVelocity = BIGM_INITIAL_JUMP_VEL;
  408. mApp->PlaySfx(SFX_JUMP2);
  409. }
  410. else if (mEngine->GetAnalogY() > 192)
  411. {
  412. mCurrAnimation = mDuck;
  413.             mDucking = true ; 
  414. mXVelocity = 0.0f;
  415. }
  416. }
  417. #ifdef WIN32
  418. if (mEngine->GetButtonClick(PSP_CTRL_DOWN))
  419. #endif
  420. {
  421. if(mApp->apple>0||mApp->banana>0)
  422. {
  423. mBullet=true;
  424. if(mApp->apple>0)
  425. {
  426. mApp->apple--;
  427. }
  428. else
  429. {
  430. mApp->banana--;
  431. }
  432. }
  433. }
  434. MoveableObject::Update(dt);
  435. for(int i = 0 ; i<10 ; i++)
  436. if(!hurt[i])
  437.            Hit();
  438. if (mY > VIRTUAL_HEIGHT)
  439. {
  440. mY = -64.0f;
  441. mYVelocity = 0.0f;
  442. }
  443. mMap->SetTarget(mX - 210.0f, mY - 136.0f);
  444. }
  445. int Mario::getExperience()
  446. {
  447. return int(experience);
  448. }
  449. void Mario::Render()
  450. {
  451. // hge->Gfx_BeginScene();
  452. // hge->Gfx_Clear(0);
  453. if(attack)
  454. {
  455. mPar->Render();
  456. // mPar->Transpose(mBulletStartX,mBulletStartY); 
  457. // mBulletStartX=mBulletStartX+2;
  458. // if(mBulletStartX<mapPositionX||mBulletStartX>mapPositionX+512)
  459. // attack=false;
  460. }
  461. // attack=false;
  462. // hge->Gfx_EndScene();
  463. MoveableObject::Render();
  464. }
  465. #endif