CGameField.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. function CGameField() {
  2. var _aGrid = new Array();
  3. var _bAnimFullLines = false;
  4. this._init = function () {
  5. if (s_bMobile) {
  6. START_GRID_Y = CANVAS_HEIGHT_HALF - (GRID_Y * GRID_Y);
  7. }
  8. var iX = START_GRID_X;
  9. var iY = START_GRID_Y;
  10. for (var i = 0; i < GRID_Y; i++) {
  11. _aGrid[i] = new Array();
  12. for (var j = 0; j < GRID_X; j++) {
  13. _aGrid[i][j] = {x: iX, y: iY, occupied: false, cell: null, childID: null};
  14. this.createCellTest(iX, iY);
  15. iX += CELL_SIZE + CELL_OFFSET.x;
  16. }
  17. iY += CELL_SIZE + CELL_OFFSET.y;
  18. iX = START_GRID_X;
  19. }
  20. this.setID();
  21. };
  22. this.createCellTest = function (iX, iY) {
  23. if (!SHOW_CELL) {
  24. return;
  25. }
  26. var oCellGraphic;
  27. var oSpriteCell = s_oSpriteLibrary.getSprite("cell");
  28. oCellGraphic = createBitmap(oSpriteCell);
  29. oCellGraphic.x = iX;
  30. oCellGraphic.y = iY;
  31. oCellGraphic.regX = oSpriteCell.width * 0.5;
  32. oCellGraphic.regY = oSpriteCell.height * 0.5;
  33. s_oStage.addChild(oCellGraphic);
  34. s_oStage.setChildIndex(oCellGraphic, 1);
  35. };
  36. this.setID = function () {
  37. var oSprite = s_oSpriteLibrary.getSprite("cell_" + 0);
  38. for (var i = GRID_Y - 1; i > -1; i--) {
  39. for (var j = GRID_X - 1; j > -1; j--) {
  40. _aGrid[i][j].childID = new CCell(_aGrid[i][j].x, _aGrid[i][j].y, 0, oSprite, s_oGame.getContainerGame());
  41. _aGrid[i][j].childID.setVisible(false);
  42. }
  43. }
  44. };
  45. this.getMiddleGridX = function () {
  46. return _aGrid[0][GRID_X_HALF].x;
  47. };
  48. this.getStartGridY = function () {
  49. return _aGrid[0][0].y;
  50. };
  51. this.getXByCol = function (iCol) {
  52. return _aGrid[0][iCol].x;
  53. };
  54. this.getYByRow = function (iRow) {
  55. return _aGrid[iRow][0].y;
  56. };
  57. this.setCellState = function (iRow, iCol, bState) {
  58. _aGrid[iRow][iCol].occupied = bState;
  59. };
  60. this.getCellState = function (iRow, iCol) {
  61. return _aGrid[iRow][iCol].occupied;
  62. };
  63. this.checkDirection = function (oBlock, iDir) {
  64. var bHitSomething = false, oRenderOffsets = {x: 0, y: 0}, bFilled,
  65. iRenderCoordX, iRenderCoordY;
  66. for (var iStep = 0; iStep < oBlock.getWidth() * oBlock.getHeight(); iStep++) {
  67. iRenderCoordX = oBlock.getCol() + oRenderOffsets.x;
  68. iRenderCoordY = oBlock.getRow() + oRenderOffsets.y;
  69. switch (iDir) {
  70. case UP:
  71. iRenderCoordY--;
  72. break;
  73. case RIGHT:
  74. iRenderCoordX++;
  75. break;
  76. case DOWN:
  77. iRenderCoordY++;
  78. break;
  79. case LEFT:
  80. iRenderCoordX--;
  81. break;
  82. }
  83. if (iRenderCoordY > GRID_Y - 1) {
  84. return true;
  85. }
  86. if (_aGrid[iRenderCoordY][iRenderCoordX].occupied) {
  87. bFilled = oBlock.pieceFilled(iStep);
  88. if (bFilled) {
  89. bHitSomething = true;
  90. break;
  91. }
  92. }
  93. oRenderOffsets = oBlock.updateRenderOffsets(oRenderOffsets);
  94. }
  95. return bHitSomething;
  96. };
  97. this.getChildID = function (iRow, iCol) {
  98. return _aGrid[iRow][iCol].childID.getChildIndex();
  99. };
  100. this.checkHitBottom = function (oBlock) {
  101. var _bHitSomething = this.checkDirection(oBlock, DOWN);
  102. if (oBlock.getRow() + oBlock.getHeight() >= _aGrid.length) {
  103. _bHitSomething = true;
  104. }
  105. if (!_bHitSomething) {
  106. return;
  107. }
  108. oBlock.setReplace(true);
  109. var aCells = oBlock.getBlock();
  110. for (var i = 0; i < aCells.length; i++) {
  111. _aGrid[aCells[i].getRow()][aCells[i].getCol()].occupied = true;
  112. _aGrid[aCells[i].getRow()][aCells[i].getCol()].cell = aCells[i];
  113. }
  114. this.checkForFullLines();
  115. };
  116. this.checkBadRotation = function (aRotateBlock, oBlock) {
  117. var iHit = this._checkHit(aRotateBlock, oBlock);
  118. switch(iHit){
  119. case 2:{
  120. ///TRY SHIFT PIECE
  121. var iOriginalCol = oBlock.getCol();
  122. var iShift = GRID_X - aRotateBlock[0].length;
  123. oBlock.setCol(iShift);
  124. var iHitTest = this._checkHit(aRotateBlock, oBlock);
  125. if(iHitTest !== 0){
  126. oBlock.setCol(iOriginalCol);
  127. }else{
  128. iHit = 0;
  129. }
  130. break;
  131. }
  132. }
  133. return iHit;
  134. };
  135. this._checkHit = function(aRotateBlock, oBlock){
  136. var oRenderOffsets = {x: 0, y: 0},
  137. iRenderCoordX, iRenderCoordY;
  138. for (var iStep = 0; iStep < aRotateBlock[0].length * aRotateBlock.length; iStep++) {
  139. iRenderCoordX = oBlock.getCol() + oRenderOffsets.x;
  140. iRenderCoordY = oBlock.getRow() + oRenderOffsets.y;
  141. //console.log("X:"+iRenderCoordX + " Y:"+iRenderCoordY)
  142. if (iRenderCoordY > GRID_Y - 1) {
  143. return 1;
  144. }
  145. if (iRenderCoordX > GRID_X - 1) {
  146. return 2;
  147. }
  148. if (_aGrid[iRenderCoordY][iRenderCoordX].occupied) {
  149. return 1;
  150. }
  151. oRenderOffsets.x++;
  152. if (oRenderOffsets.x >= aRotateBlock[0].length) {
  153. oRenderOffsets.y++;
  154. oRenderOffsets.x = 0;
  155. }
  156. }
  157. return 0;
  158. };
  159. this.isAnimFullLines = function () {
  160. return _bAnimFullLines;
  161. };
  162. this.checkForFullLines = function () {
  163. var iFullLines = 0, iLinePieceCount;
  164. var aDeleteLine = new Array();
  165. var iID = 0;
  166. for (var i = 0; i < _aGrid.length; i++) {
  167. iLinePieceCount = 0;
  168. for (var j = 0; j < _aGrid[0].length; j++) {
  169. if (_aGrid[i][j].occupied) {
  170. iLinePieceCount++;
  171. }
  172. }
  173. if (iLinePieceCount === _aGrid[0].length) {
  174. iFullLines++;
  175. aDeleteLine[iID] = i;
  176. iID++;
  177. var iTime = DELAY_CELL_DESTROY_MS;
  178. for (var j = 0; j < _aGrid[0].length; j++) {
  179. _aGrid[i][j].occupied = false;
  180. this.animCellDestroy(_aGrid[i][j], iTime);
  181. iTime += DELAY_CELL_DESTROY_MS;
  182. }
  183. }
  184. }
  185. if (iFullLines > 0) {
  186. _bAnimFullLines = true;
  187. playSound("delete_lines", 1, false);
  188. iTime += CELL_DESTROY_MS * 2;
  189. createjs.Tween.get(this).wait(iTime).call(function () {
  190. s_oGame.calculateScore(iFullLines);
  191. s_oGame.checkForNewLevel(iFullLines);
  192. this.checkEmptyRowForFall(aDeleteLine);
  193. _bAnimFullLines = false;
  194. });
  195. }
  196. };
  197. this.animCellDestroy = function (oCell, iTime) {
  198. oCell.cell.changeState(1);
  199. createjs.Tween.get(oCell.cell.getSprite()).wait(iTime).to({scaleX: 0, scaleY: 0}, CELL_DESTROY_MS, createjs.Ease.cubicOut).call(function () {
  200. if (oCell.occupied === true) {
  201. oCell.cell.unload();
  202. }
  203. });
  204. };
  205. this.checkEmptyRowForFall = function (aDeleteLine) {
  206. var iTimeWait = 0;
  207. for (var i = 0; i < aDeleteLine.length; i++) {
  208. for (var k = 0; k < _aGrid[i].length; k++) {
  209. for (var j = aDeleteLine[i] - 1; j > -1; j--) {
  210. if (_aGrid[j][k].occupied === true) {
  211. _aGrid[j][k].occupied = false;
  212. _aGrid[j + 1][k].cell = _aGrid[j][k].cell;
  213. _aGrid[j][k].cell = null;
  214. _aGrid[j + 1][k].occupied = true;
  215. }
  216. }
  217. }
  218. }
  219. for (var j = _aGrid[i].length - 1; j > -1; j--) {
  220. for (var i = _aGrid.length - 1; i > -1; i--) {
  221. if (_aGrid[i][j].occupied === true) {
  222. _aGrid[i][j].cell.setChildIndex(this.getChildID(i, j));
  223. this.animateLineDown(_aGrid[i][j].cell.getSprite(), _aGrid[i][j].y, iTimeWait);
  224. iTimeWait += DELAY_LINE_DOWN;
  225. }
  226. }
  227. }
  228. };
  229. this.animateLineDown = function (oCell, iY, iTimeWait) {
  230. createjs.Tween.get(oCell).wait(iTimeWait).to({y: iY}, LINE_DOWN_TIME, createjs.Ease.cubicOut);
  231. };
  232. this.unload = function () {
  233. for (var i = 0; i < _aGrid.length; i++) {
  234. for (var j = 0; j < _aGrid[0].length; j++) {
  235. if (_aGrid[i][j].occupied) {
  236. _aGrid[i][j].cell.unload();
  237. }
  238. }
  239. }
  240. _aGrid = null;
  241. s_oGameField = null;
  242. };
  243. this._init();
  244. s_oGameField = this;
  245. return this;
  246. }
  247. var s_oGameField;