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

游戏引擎

开发平台:

Visual C++

  1. #ifndef _TILEMAP_H_
  2. #define _TILEMAP_H_
  3. #include "../../JGE/include/JGE.h"
  4. #define TILE_WIDTH 32
  5. #define TILE_HEIGHT 32
  6. #define TILE_SHIFT 5
  7. #define TILE_SOLID 1
  8. #define TILE_MONEY 2
  9. #define TILE_POWERUP 3
  10. #define TILE_TUNNEL 4
  11. typedef JQuad* JQUAD_PTR;
  12. class TileMap
  13. {
  14. private:
  15. JGE* mEngine;
  16. GameStatePlay* mApp;
  17. JTexture* mTileTex;
  18. short* mTilemap;
  19. u8* mTilemapCollision;
  20. JQUAD_PTR* mTiles;
  21.     
  22. int mTileWidth;
  23. int mTileHeight;
  24. int mCols;
  25. int mRows;
  26. int mColsPerScreen;
  27. int mRowsPerScreen;
  28. float mMapX;
  29. float mMapY;
  30. float mTargetX;
  31. float mTargetY;
  32.     bool banana;
  33. float mAnimateCounter;
  34. public:
  35. TileMap(GameStatePlay* app, JTexture* tex);
  36. ~TileMap();
  37. void Load(const char* mapDat, const char* mapCollision);
  38. void SetTarget(float x, float y);
  39. void Update(float dt);
  40. void Render(float x, float y);
  41. bool BBoxCollide(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
  42. int CheckHoriz(int x1, int x2, int y, bool fromLeft, int* col, int* row);
  43. int CheckVert(int x, int y1, int y2, int* col, int* row);
  44. short GetTile(int col, int row);
  45. u8 GetTileInfo(int col, int row);
  46. void SetTile(int col, int row, short tile);
  47. void SetTileInfo(int col, int row, u8 n);
  48. void GetPosition(float* x, float* y) { *x = mMapX; *y = mMapY; }
  49. bool GetBanana(){ return   banana;}
  50. };
  51. TileMap::TileMap(GameStatePlay* app, JTexture* tex): mApp(app)
  52. {
  53. mEngine = mApp->GetJGE();
  54. mTileTex = tex;
  55. mTilemap = NULL;
  56. mTilemapCollision = NULL;
  57. int col = tex->mWidth/TILE_WIDTH;
  58. int row = tex->mHeight/TILE_HEIGHT;
  59. mTiles = new JQUAD_PTR[col*row];
  60. float x = 0.0f;
  61. float y = 0.0f;
  62. int n = 0;
  63. for (int i=0;i<row;i++)
  64. {
  65. x = 0.0f;
  66. for (int j=0;j<col;j++)
  67. {
  68. mTiles[n++] = new JQuad(tex, x, y, TILE_WIDTH, TILE_HEIGHT);
  69. x += TILE_WIDTH;
  70. }
  71. y += TILE_HEIGHT;
  72. }
  73. mMapX = 0.0f;
  74. mMapY = VIRTUAL_HEIGHT - SCREEN_HEIGHT_F;
  75.     
  76. mAnimateCounter = 0;
  77. }
  78. TileMap::~TileMap()
  79. {
  80. if (mTilemap)
  81. delete mTilemap;
  82. if (mTilemapCollision != NULL)
  83. delete mTilemapCollision;
  84. for (int i=0;i<32;i++)
  85. delete mTiles[i];
  86. delete[] mTiles;
  87. }
  88. void TileMap::Load(const char* mapDat, const char* mapCollision)
  89. {
  90. if (mTilemap != NULL)
  91. delete mTilemap;
  92. if (mTilemapCollision != NULL)
  93. delete mTilemapCollision;
  94. FILE* f = fopen(mapDat, "rb");
  95. if (f != NULL)
  96. {
  97. short cols;
  98. short rows;
  99. fread(&cols, 1, sizeof(short), f);
  100. fread(&rows, 1, sizeof(short), f);
  101. mCols = (int)cols;
  102. mRows = (int)rows;
  103. mTilemap = new short[cols*rows];
  104. fread(mTilemap, cols*rows, sizeof(short), f);
  105. fclose(f);
  106. }
  107. f = fopen(mapCollision, "rb");
  108. if (f != NULL)
  109. {
  110. short cols;
  111. short rows;
  112. fread(&cols, 1, sizeof(short), f);
  113. fread(&rows, 1, sizeof(short), f);
  114. mTilemapCollision = new u8[cols*rows];
  115. fread(mTilemapCollision, cols*rows, sizeof(u8), f);
  116. fclose(f);
  117. }
  118. }
  119. void TileMap::Render(float x, float y)
  120. {
  121. int mapX = (int) mMapX;
  122. int mapY = (int) mMapY;
  123. int col = mapX/TILE_WIDTH;
  124. float xoffset = -(float)(mapX%TILE_WIDTH);
  125. int row = mapY/TILE_HEIGHT;
  126. float yy = -(float)(mapY%TILE_HEIGHT);
  127. int start = mCols * row + col;
  128. float xx=0;
  129. int currCol;
  130. int n, index;
  131. while (yy < SCREEN_HEIGHT_F && row < mRows)
  132. {
  133. xx = xoffset;
  134. currCol = col;
  135. index = start;
  136. while (xx < SCREEN_WIDTH_F && currCol< mCols)
  137. {
  138. n = mTilemap[index++];
  139. if (n > 0)
  140. {
  141. mEngine->RenderQuad(mTiles[n], xx, yy);
  142. }
  143. xx += TILE_WIDTH;
  144. currCol++;
  145. }
  146. yy += TILE_HEIGHT;
  147. start += mCols;
  148. row++;
  149. }
  150. }
  151. bool BBoxCollide(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
  152. {
  153. if (x1 - x2 < -w1) return false;
  154. if (x1 - x2 > w2) return false;
  155. if (y1 - y2 < -h1) return false;
  156. if (y1 - y2 > h2) return false;
  157. return true; // collision!!!
  158. }
  159. int TileMap::CheckHoriz(int x1, int x2, int y, bool fromLeft, int* col, int* row)
  160. {
  161. int tile;
  162. int colStart;
  163. int colEnd;
  164. int incr;
  165. if (fromLeft)
  166. {
  167. colStart = x1>>TILE_SHIFT;
  168. colEnd = x2>>TILE_SHIFT;
  169. incr = 1;
  170. }
  171. else 
  172. {
  173. colStart = x2>>TILE_SHIFT;
  174. colEnd = x1>>TILE_SHIFT;
  175. incr = -1;
  176. }
  177. *row = y>>TILE_SHIFT;
  178. *col = colStart;
  179. for (int currCol=colStart;; currCol+=incr)
  180. {
  181. if (currCol >= 0 && currCol < mCols && *row >= 0 && *row <= mRows)
  182. {
  183. tile = mTilemapCollision[(*row) * mCols + currCol];
  184. if (tile != 0)
  185. {
  186. *col = currCol;
  187. return tile;
  188. }
  189. }
  190. if (currCol==colEnd) break;
  191. }
  192. return 0;
  193. }
  194. int TileMap::CheckVert(int x, int y1, int y2, int* col, int* row)
  195. {
  196. int tile;
  197. int rowStart = y1>>TILE_SHIFT;
  198. int rowEnd = y2>>TILE_SHIFT;
  199. *col = x>>TILE_SHIFT;
  200. *row = rowStart;
  201. for (int currRow = rowStart;currRow<=rowEnd;currRow++)
  202. {
  203. if (*col >= 0 && *col < mCols && currRow >= 0 && currRow <= mRows)
  204. {
  205. tile = mTilemapCollision[currRow * mCols + (*col)];
  206. if (tile != 0)
  207. {
  208. *row = currRow;
  209. return tile;
  210. }
  211. }
  212. }
  213. return 0;
  214. }
  215. short TileMap::GetTile(int col, int row)
  216. {
  217. return mTilemap[row*mCols + col];
  218. }
  219. u8 TileMap::GetTileInfo(int col, int row)
  220. {
  221. return mTilemapCollision[row*mCols + col];
  222. }
  223. void TileMap::SetTile(int col, int row, short tile)
  224. {
  225. mTilemap[row*mCols + col] = tile;
  226. }
  227. void TileMap::SetTileInfo(int col, int row, u8 n)
  228. {
  229. mTilemapCollision[row*mCols + col] = n;
  230. }
  231. void TileMap::SetTarget(float x, float y)
  232. {
  233. mTargetX = x;
  234. mTargetY = y;
  235. if (mTargetX < 0.0f)
  236. mTargetX = 0.0f;
  237. if (mTargetX + SCREEN_WIDTH_F > VIRTUAL_WIDTH)
  238. mTargetX = VIRTUAL_WIDTH - SCREEN_WIDTH_F;
  239. if (mTargetY < 0.0f)
  240. mTargetY = 0.0f;
  241. if (mTargetY + SCREEN_HEIGHT_F > VIRTUAL_HEIGHT)
  242. mTargetY = VIRTUAL_HEIGHT - SCREEN_HEIGHT_F;
  243. }
  244. void TileMap::Update(float dt)
  245. {
  246. float speed = DEFAULT_WALK_SPEED;
  247. if (mMapX < mTargetX)
  248. {
  249. mMapX += speed*dt;
  250. if (mMapX > mTargetX)
  251. mMapX = mTargetX;
  252. }
  253. else if (mMapX > mTargetX)
  254. {
  255. mMapX -= speed*dt;
  256. if (mMapX < mTargetX)
  257. mMapX = mTargetX;
  258. }
  259. speed = 0.2f;
  260. if (mMapY < mTargetY)
  261. {
  262. mMapY += speed*dt;
  263. if (mMapY > mTargetY)
  264. mMapY = mTargetY;
  265. }
  266. else if (mMapY > mTargetY)
  267. {
  268. mMapY -= speed*dt;
  269. if (mMapY < mTargetY)
  270. mMapY = mTargetY;
  271. }
  272. mAnimateCounter += dt;
  273. if (mAnimateCounter > 300.0f)
  274. {
  275. mAnimateCounter = 0.0f;
  276. int col = (((int)mMapX)>>TILE_SHIFT)-1;
  277. int row = (((int)mMapY)>>TILE_SHIFT)-1;
  278. if (col<0) col = 0;
  279. if (row<0) row = 0;
  280. short tile;
  281. u8 tileInfo;
  282. int currCol, currRow;
  283. for (int i=0;i<16+2;i++)
  284. {
  285. for (int j=0;j<16+2;j++)
  286. {
  287. currCol = col+j;
  288. currRow = row+i;
  289. if (currCol >=0 && currCol < mCols && currRow >= 0 && currRow < mRows)
  290. {
  291. tile = GetTile(currCol, currRow);
  292. if (tile == 1)
  293. SetTile(currCol, currRow, 31);
  294. else if (tile == 31)
  295. SetTile(currCol, currRow, 1);
  296. tileInfo = GetTileInfo(currCol, currRow);
  297. if (tileInfo == BLOCK_TURTLE)
  298. {
  299. SetTileInfo(currCol, currRow, 0);
  300. mApp->SpawnTurtle(currCol, currRow);
  301. }
  302. /* else if (tileInfo == BLOCK_FLOWER)
  303. {
  304. SetTileInfo(currCol, currRow, 0);
  305. }*/
  306. else if (tileInfo == BLOCK_WEASEL)
  307. {
  308. SetTileInfo(currCol, currRow, 0);
  309. mApp->SpawnWeasel(currCol, currRow);
  310. }
  311. else if (tileInfo == BLOCK_SNOWMAN)
  312. {
  313. SetTileInfo(currCol, currRow, 0);
  314. mApp->SpawnSnowman(currCol, currRow);
  315. }
  316. else if (tileInfo == BLOCK_MONSTER)
  317. {
  318. SetTileInfo(currCol, currRow, 0);
  319. mApp->SpawnMonster(currCol, currRow);
  320. }
  321. }
  322. }
  323. }
  324. }
  325. }
  326. #endif