module('spritebatch') module('camera') module('color') module('ui') module('screen') module('time') module('glm') module('text') module('tileset') module('texture') module('input') CELL_STATE_DEFAULT = 0 CELL_STATE_HOVER = 1 CELL_STATE_DOWN = 2 CELL_STATE_DISABLED = 3 screenSetBackground(colorBlack()) camera = cameraCreate(CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC) tilesetUi = tilesetGetByName("ui") textureUi = textureLoad(tilesetUi.texture) tilesetBorder = tilesetGetByName("border") textureBorder = textureLoad(tilesetBorder.texture) textureGrid = textureLoad("minesweeper/grid_bg.dpi") tilesetCell = tilesetGetByName("cell") textureCell = textureLoad(tilesetCell.texture) cellSliceDefault = tilesetPositionGetUV(tilesetCell, 3, 5) cellSliceHover = tilesetPositionGetUV(tilesetCell, 3, 4) cellSliceDown = tilesetPositionGetUV(tilesetCell, 3, 6) cellSliceDisabled = tilesetPositionGetUV(tilesetCell, 3, 7) sweepwerCols = 10 sweeperRows = 14 mouseX = -1 mouseY = -1 centerX = 0 centerY = 0 boardWidth = sweepwerCols * tilesetCell.tileWidth boardHeight = sweeperRows * tilesetCell.tileHeight i = 0 cells = {} for y = 1, sweeperRows do for x = 1, sweepwerCols do cells[i] = CELL_STATE_DEFAULT i = i + 1 end end function cellDraw(x, y, type) local slice = cellSliceDefault if type == CELL_STATE_HOVER then slice = cellSliceHover elseif type == CELL_STATE_DOWN then slice = cellSliceDown elseif type == CELL_STATE_DISABLED then slice = cellSliceDisabled end spriteBatchPush(textureCell, x, y, x + tilesetCell.tileWidth, y + tilesetCell.tileHeight, colorWhite(), slice.u0, slice.v0, slice.u1, slice.v1 ) end function backgroundDraw() local t = (TIME.time / 40) % 1 local scaleX = screenGetWidth() / textureGrid.width local scaleY = screenGetHeight() / textureGrid.height local u0 = t * scaleX local v0 = t * scaleY local u1 = scaleX + u0 local v1 = scaleY + v0 spriteBatchPush(textureGrid, 0, 0, screenGetWidth(), screenGetHeight(), colorWhite(), u0, v0, u1, v1 ) end function borderDraw(x, y, innerWidth, innerHeight) -- Top Left local uv = tilesetPositionGetUV(tilesetBorder, 0, 0) spriteBatchPush(textureBorder, x - tilesetBorder.tileWidth, y - tilesetBorder.tileWidth, x, y, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) -- Top Right uv = tilesetPositionGetUV(tilesetBorder, 10, 0) spriteBatchPush(textureBorder, x + innerWidth, y - tilesetBorder.tileHeight, x + innerWidth + tilesetBorder.tileWidth, y, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) -- Bottom Left uv = tilesetPositionGetUV(tilesetBorder, 0, 10) spriteBatchPush(textureBorder, x - tilesetBorder.tileWidth, y + innerHeight, x, y + innerHeight + tilesetBorder.tileHeight, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) -- Bottom Right uv = tilesetPositionGetUV(tilesetBorder, 10, 10) spriteBatchPush(textureBorder, x + innerWidth, y + innerHeight, x + innerWidth + tilesetBorder.tileWidth, y + innerHeight + tilesetBorder.tileHeight, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) -- Top uv = tilesetPositionGetUV(tilesetBorder, 1, 0) spriteBatchPush(textureBorder, x, y - tilesetBorder.tileHeight, x + innerWidth, y, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) -- Bottom uv = tilesetPositionGetUV(tilesetBorder, 1, 10) spriteBatchPush(textureBorder, x, y + innerHeight, x + innerWidth, y + innerHeight + tilesetBorder.tileHeight, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) -- Left uv = tilesetPositionGetUV(tilesetBorder, 0, 1) spriteBatchPush(textureBorder, x - tilesetBorder.tileWidth, y, x, y + innerHeight, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) -- Right uv = tilesetPositionGetUV(tilesetBorder, 10, 1) spriteBatchPush(textureBorder, x + innerWidth, y, x + innerWidth + tilesetBorder.tileWidth, y + innerHeight, colorWhite(), uv.u0, uv.v0, uv.u1, uv.v1 ) end function sceneDispose() end function sceneUpdate() end function sceneRender() -- Update camera cameraPushMatrix(camera) camera.bottom = screenGetHeight() camera.right = screenGetWidth() -- Update mouse position if INPUT_POINTER then mouseX = inputGetValue(INPUT_ACTION_POINTERX) * screenGetWidth() mouseY = inputGetValue(INPUT_ACTION_POINTERY) * screenGetHeight() end centerX = math.floor(screenGetWidth() / 2) centerY = math.floor(screenGetHeight() / 2) -- Draw elements backgroundDraw() borderDraw( centerX - (boardWidth / 2), centerY - (boardHeight / 2), boardWidth, boardHeight ) i = 0 -- Foreach cell local offX = centerX - (boardWidth / 2) local offY = centerY - (boardHeight / 2) for y = 0, sweeperRows - 1 do for x = 0, sweepwerCols - 1 do i = y * sweepwerCols + x -- Hovered if cells[i] == CELL_STATE_DEFAULT and mouseX >= x * tilesetCell.tileWidth + offX and mouseX < (x + 1) * tilesetCell.tileWidth + offX and mouseY >= y * tilesetCell.tileHeight + offY and mouseY < (y + 1) * tilesetCell.tileHeight + offY then cells[i] = CELL_STATE_HOVER else cells[i] = CELL_STATE_DEFAULT end cellDraw( x * tilesetCell.tileWidth + offX, y * tilesetCell.tileHeight + offY, cells[i] ) end end spriteBatchFlush() cameraPopMatrix() end