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

游戏引擎

开发平台:

Visual C++

  1. #ifndef _GAMEOBJECT_HPP
  2. #define _GAMEOBJECT_HPP
  3. #define BLOCK_SPEED 0.15f
  4. class GameObject
  5. {
  6. protected:
  7. bool mActive;
  8. bool mFlipped;
  9. bool mJumping;
  10. bool mDucking;
  11. bool mBullet;
  12. JTexture* mTexture;
  13. JTexture* mQuestion;
  14. JSprite* mCurrAnimation;
  15. float mX;
  16. float mY;
  17. float mYVelocity;
  18. float mXVelocity;
  19. float mHScale;
  20. float mVScale;
  21. static GameStatePlay* mApp;
  22. static JGE* mEngine;
  23. static TileMap* mMap;
  24. public:
  25. GameObject(GameStatePlay *app);
  26. virtual ~GameObject();
  27. virtual void Update(float dt) = 0;
  28. virtual void Render() = 0;
  29. void SetPosition(float x, float y) { mX = x; mY = y; }
  30. void SetActive(bool flag) { mActive = flag; }
  31. bool IsActive() { return mActive; }
  32. float GetX() { return mX; }
  33. float GetY() { return mY; }
  34. void SetX(float x){mX=x;}
  35. void SetY(float y){mY=y;}
  36. JSprite* GetSprite() { return mCurrAnimation; }
  37. };
  38. JGE* GameObject::mEngine = NULL;
  39. GameStatePlay* GameObject::mApp = NULL;
  40. TileMap* GameObject::mMap = NULL;
  41. GameObject::GameObject(GameStatePlay *app)
  42. {
  43. mApp = app;
  44. mTexture = mApp->GetTexture(0);
  45. mQuestion = mApp->GetTexture(1);
  46. mEngine = mApp->GetJGE();
  47. mMap = mApp->GetTileMap();
  48. mActive = false;
  49. mHScale = 1.0f;
  50. mVScale = 1.0f;
  51. }
  52. GameObject::~GameObject()
  53. {
  54. }
  55. class MoveableObject: public GameObject
  56. {
  57. protected:
  58. bool mFlipped;
  59. bool mJumping;
  60. bool mBullet;
  61. float mYRenderOffset;
  62. int mLeftAdjustment;
  63. int mRightAdjustment;
  64. int mHitLeftAdjustment;
  65. int mHitRightAdjustment;
  66. int mFallLeftAdjustment;
  67. int mFallRightAdjustment;
  68. int mRealHeight;
  69. float bulletdirection;
  70. public:
  71. MoveableObject(GameStatePlay* app);
  72. virtual ~MoveableObject();
  73. virtual void Update(float dt);
  74. virtual void Render();
  75. virtual void HitTop(int left, int right, int row) {}
  76. virtual void EatFruit(int left, int right, int row) {}
  77. virtual void HitBottom(int left, int right, int row) {}
  78. virtual void HitLeft() {}
  79. virtual void HitRight(int left, int right, int row) {}
  80. virtual void Bullet(float x, float y,float direction) {}
  81. virtual void StandingOnNothing(int col, int row);
  82. };
  83. MoveableObject::MoveableObject(GameStatePlay* app): GameObject(app)
  84. {
  85. mFlipped = true;
  86. mJumping = false;
  87. mDucking = false;
  88. mBullet=false;
  89. mXVelocity = 0.0f;
  90. mYVelocity = 0.0f;
  91. bulletdirection=1;
  92. }
  93. MoveableObject::~MoveableObject()
  94. {
  95. }
  96. void MoveableObject::Update(float dt)
  97. {
  98. int col, row;
  99. bool moved = false;
  100. float xdelta = mXVelocity*dt;
  101. float xNew;
  102. if (mJumping)
  103. {
  104. float gravity = DEFAULT_GRAVITY;
  105. float distance = mYVelocity*dt + gravity*dt*dt/2;
  106. mYVelocity += gravity*dt;
  107. float newY = mY + distance;
  108. if (distance < 0.0f)
  109. {
  110. int left = ((int)mX)+23;
  111. int right = ((int)mX)+47;
  112. if(mMap->CheckHoriz(left, right, (int)(mY)-mRealHeight, mFlipped, &col, &row) ==4||mMap->CheckHoriz(left, right, (int)(mY)-mRealHeight, mFlipped, &col, &row) ==3)
  113. {
  114. newY = mY + distance;
  115. EatFruit(left, right, row);
  116. }
  117. else if (mMap->CheckHoriz(left, right, (int)(mY)-mRealHeight, mFlipped, &col, &row) != 0&&mMap->CheckHoriz(left, right, (int)(mY)-mRealHeight, mFlipped, &col, &row) !=4&&mMap->CheckHoriz(left, right, (int)(mY)-mRealHeight, mFlipped, &col, &row) !=3)
  118. {
  119. mYVelocity = 0.0f;
  120. newY = mY;
  121. HitTop(left, right, row);
  122. }
  123. }
  124. else if (distance > 0.0f)
  125. {
  126. int left = ((int)mX)+23;
  127. int right = ((int)mX)+47;
  128. float y = mY;
  129. bool done = false;
  130. while (!done)
  131. {
  132. if(mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY), mFlipped, &col, &row) == 3||mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY), mFlipped, &col, &row) == 4)
  133. {
  134. newY = mY + distance;
  135. EatFruit(left, right, row);
  136. }
  137. else if (mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY), mFlipped, &col, &row) != 0)
  138. {
  139. mJumping = false;
  140. newY = (float)((row << TILE_SHIFT)-1);
  141. done = true;
  142. }
  143. if (y == newY) 
  144. done = true;
  145. else
  146. {
  147. y += TILE_HEIGHT;
  148. if (y > newY)
  149. y = newY;
  150. }
  151. }
  152. }
  153. mY = newY;
  154. }
  155. if (xdelta < 0.0f)
  156. {
  157. xNew = mX + xdelta;
  158. if (xNew < 0.0f)
  159. xNew = 0.0f;
  160. moved = true;
  161. if (mMap->CheckVert(((int)mX)+mHitLeftAdjustment, (int)(mY)-mRealHeight, (int)(mY), &col, &row) != 0&&mMap->CheckVert(((int)mX)+mHitLeftAdjustment, (int)(mY)-mRealHeight, (int)(mY), &col, &row) != 3&&mMap->CheckVert(((int)mX)+mHitLeftAdjustment, (int)(mY)-mRealHeight, (int)(mY), &col, &row) != 4)
  162. {
  163. xNew = mX;
  164. moved = false;
  165. HitLeft();
  166. }
  167. bulletdirection=-1;
  168. mX = xNew;
  169. }
  170. else if (xdelta > 0.0f)
  171. {
  172. int left = ((int)mX)+23;
  173. int right = ((int)mX)+47;
  174. moved = true;
  175. xNew = mX + xdelta;
  176. if (xNew > VIRTUAL_WIDTH-32.0f)
  177. xNew = VIRTUAL_WIDTH-32.0f;
  178. if(mMap->CheckVert(((int)mX)+mHitRightAdjustment, (int)(mY)-mRealHeight, (int)(mY), &col, &row) == 10)
  179. {
  180. moved = true;
  181. HitRight(left, right, row);
  182. }
  183. else if (mMap->CheckVert(((int)mX)+mHitRightAdjustment, (int)(mY)-mRealHeight, (int)(mY), &col, &row) != 0&&mMap->CheckVert(((int)mX)+mHitRightAdjustment, (int)(mY)-mRealHeight, (int)(mY), &col, &row) != 3&&mMap->CheckVert(((int)mX)+mHitRightAdjustment, (int)(mY)-mRealHeight, (int)(mY), &col, &row) != 4)
  184. {
  185. xNew = mX;
  186. moved = false;
  187. HitRight(left, right, row);
  188. }
  189. bulletdirection=1;
  190. mX = xNew;
  191. }
  192. if(mDucking)
  193. {
  194.         int col, row;
  195. int left = ((int)mX)+23;
  196. int right = ((int)mX)+47;
  197. if (mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY)+1, mFlipped, &col, &row) == 6||mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY)+1, mFlipped, &col, &row) == 10)  
  198. {
  199.      HitBottom( left, right,row);
  200.   
  201.                  
  202. }
  203.    mDucking = false ;
  204. }
  205. if (!mJumping &&!mDucking&& moved)
  206. {
  207. int col, row;
  208. int left = ((int)mX)+23;
  209. int right = ((int)mX)+47;
  210. float gravity = DEFAULT_GRAVITY;
  211. float distance = mYVelocity*dt + gravity*dt*dt/2;
  212. mYVelocity += gravity*dt;
  213. float newY = mY + distance;
  214. if (mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY)+1, mFlipped, &col, &row) == 0)
  215. {
  216. StandingOnNothing(col, row);
  217. }
  218. else if (mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY), mFlipped, &col, &row) == 3||mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY), mFlipped, &col, &row) == 4)
  219. {
  220. EatFruit(left, right, row);
  221. }
  222. }
  223. if (!mJumping &&!mDucking&& !moved)
  224. {
  225. int col, row;
  226. int left = ((int)mX)+23;
  227. int right = ((int)mX)+47;
  228. float gravity = DEFAULT_GRAVITY;
  229. float distance = mYVelocity*dt + gravity*dt*dt/2;
  230. mYVelocity += gravity*dt;
  231. float newY = mY + distance;
  232. if (mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY)+1, mFlipped, &col, &row) == 3||mMap->CheckHoriz(((int)mX)+mLeftAdjustment, ((int)mX)+mRightAdjustment, (int)(mY)+1, mFlipped, &col, &row) == 4)
  233. {
  234. mYVelocity += gravity*dt;
  235. newY = mY + distance;
  236. mJumping = true;
  237. EatFruit(left, right, row);
  238. }
  239. }
  240. if(mBullet)
  241. {
  242. Bullet(mX,mY,bulletdirection);
  243. }
  244. mCurrAnimation->Update(dt);
  245. }
  246. void MoveableObject::StandingOnNothing(int col, int row)
  247. {
  248. mYVelocity = 0.0f;
  249. mJumping = true;
  250. if (mFlipped)
  251. mX = (float)((col<<TILE_SHIFT)+mFallRightAdjustment);
  252. else
  253. mX = (float)((col<<TILE_SHIFT)+mFallLeftAdjustment);
  254. }
  255. void MoveableObject::Render()
  256. {
  257. if(mY<=470)
  258. {
  259. float x, y;
  260. mCurrAnimation->SetScale(mHScale, mVScale);
  261. mMap->GetPosition(&x, &y);
  262. mCurrAnimation->SetPosition(mX-x, mY-y+mYRenderOffset);
  263. mCurrAnimation->Render();
  264. }
  265. }
  266. #endif