Add interactive cells
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
.mttt-cell:hover{
|
||||||
|
background: lightblue;
|
||||||
|
}
|
||||||
68
src/game.nim
68
src/game.nim
@@ -1,9 +1,8 @@
|
|||||||
import dom, strformat, times, jsconsole
|
import dom, strformat, times, jsconsole
|
||||||
|
|
||||||
import gamelight/[graphics, vec]
|
import gamelight/[graphics, vec]
|
||||||
|
|
||||||
import libmttt
|
import libmttt
|
||||||
|
|
||||||
|
from lenientops import `*`, `+`
|
||||||
type
|
type
|
||||||
Game* = ref object
|
Game* = ref object
|
||||||
renderer: Renderer2D
|
renderer: Renderer2D
|
||||||
@@ -27,10 +26,49 @@ const
|
|||||||
|
|
||||||
var
|
var
|
||||||
debugMode = true
|
debugMode = true
|
||||||
renderWidth, renderHeight: int ## Canvas render area in pixels
|
|
||||||
# TODO this should be dynamic
|
# TODO this should be dynamic
|
||||||
sidebarWidth = 150 ## Size of the left sidebar
|
sidebarWidth = 150 ## Size of the left sidebar
|
||||||
|
|
||||||
|
proc cellClick(event: Event): void =
|
||||||
|
## TODO Process cell clicks from here
|
||||||
|
let
|
||||||
|
cX = event.target.getAttribute("x")
|
||||||
|
cY = event.target.getAttribute("y")
|
||||||
|
mX = event.target.getAttribute("metaX")
|
||||||
|
mY = event.target.getAttribute("metaY")
|
||||||
|
console.debug(fmt"Click: cell ({cX}, {cY}) in mini board ({mX}, {mY})")
|
||||||
|
|
||||||
|
proc createMiniCells(renderer: Renderer2D, board: Coordinate, start: Point, size: float): seq[Element] =
|
||||||
|
## Create the interactive cells in a miniboard
|
||||||
|
for x in 0 .. 2:
|
||||||
|
for y in 0 .. 2:
|
||||||
|
let pos = (start.x + x * size, start.y + y * size).toPoint
|
||||||
|
let cell: Element = renderer.createDivElement(pos, size, size)
|
||||||
|
cell.setAttribute("info", fmt"({x}, {y}) at {start}")
|
||||||
|
cell.setAttribute("X", $x)
|
||||||
|
cell.setAttribute("Y", $y)
|
||||||
|
cell.setAttribute("metaX", $board.x)
|
||||||
|
cell.setAttribute("metaY", $board.y)
|
||||||
|
cell.onclick = cellClick
|
||||||
|
cell.classList.add("mttt-cell")
|
||||||
|
result.add cell
|
||||||
|
|
||||||
|
proc createCellElements(renderer: Renderer2D): seq[Element] =
|
||||||
|
## Create the cell elements for the whole game board
|
||||||
|
# TODO: put those somewhere shared
|
||||||
|
let
|
||||||
|
gAreaX = 2 * padding + sidebarWidth
|
||||||
|
gAreaY = padding
|
||||||
|
gAreaH = renderer.getHeight - 2 * padding
|
||||||
|
gAreaW = renderer.getWidth - sidebarWidth - 3 * padding
|
||||||
|
gSize = min(gAreaH, gAreaW)
|
||||||
|
bSize = (gSize / 3)
|
||||||
|
|
||||||
|
for x in 0 .. 2:
|
||||||
|
for y in 0 .. 2:
|
||||||
|
let pos = (gAreaX + x * bSize, gAreaY + y * bSize)
|
||||||
|
result.add renderer.createMiniCells((x, y), pos, bSize / 3)
|
||||||
|
|
||||||
proc switchScene(game: Game, scene: Scene) =
|
proc switchScene(game: Game, scene: Scene) =
|
||||||
case scene:
|
case scene:
|
||||||
of Scene.MainMenu:
|
of Scene.MainMenu:
|
||||||
@@ -42,29 +80,23 @@ proc switchScene(game: Game, scene: Scene) =
|
|||||||
let timePos = (padding.toFloat, padding.toFloat + 35.0).toPoint
|
let timePos = (padding.toFloat, padding.toFloat + 35.0).toPoint
|
||||||
game.timeElement = game.renderer.createTextElement("0", timePos, "#000000", 20, font)
|
game.timeElement = game.renderer.createTextElement("0", timePos, "#000000", 20, font)
|
||||||
|
|
||||||
|
# TODO Save these somewhere???
|
||||||
|
let elements = game.renderer.createCellElements()
|
||||||
|
|
||||||
proc newGame*(canvasId: string, debug: bool = false): Game =
|
proc newGame*(canvasId: string, debug: bool = false): Game =
|
||||||
debugMode = debug
|
debugMode = debug
|
||||||
var
|
var
|
||||||
player1 = Player(name: "Player 1")
|
player1 = Player(name: "Player 1")
|
||||||
player2 = Player(name: "Player 2")
|
player2 = Player(name: "Player 2")
|
||||||
|
|
||||||
# Update game area size
|
|
||||||
renderHeight = window.innerHeight
|
|
||||||
renderWidth = window.innerWidth
|
|
||||||
|
|
||||||
console.debug(fmt"Game area: {renderWidth}x{renderHeight}")
|
|
||||||
|
|
||||||
if debugMode:
|
|
||||||
renderHeight = renderHeight - 19 ## The size of the debug bar
|
|
||||||
console.debug(fmt"Game area after debug check: {renderWidth}x{renderHeight}")
|
|
||||||
|
|
||||||
result = Game(
|
result = Game(
|
||||||
renderer: newRenderer2D(canvasId, renderWidth, renderHeight),
|
renderer: newRenderer2D(canvasId, window.innerWidth, window.innerHeight),
|
||||||
scene: Scene.Game,
|
scene: Scene.Game,
|
||||||
state: newGameState(player1, player2),
|
state: newGameState(player1, player2),
|
||||||
paused: false,
|
paused: false,
|
||||||
startTime: getTime()
|
startTime: getTime()
|
||||||
)
|
)
|
||||||
|
result.renderer.setScaleToScreen(true)
|
||||||
switchScene(result, Scene.Game)
|
switchScene(result, Scene.Game)
|
||||||
|
|
||||||
proc update(game: Game, time: Duration) =
|
proc update(game: Game, time: Duration) =
|
||||||
@@ -77,7 +109,7 @@ proc update(game: Game, time: Duration) =
|
|||||||
proc drawMainMenu(game: Game) =
|
proc drawMainMenu(game: Game) =
|
||||||
discard
|
discard
|
||||||
|
|
||||||
proc drawPos(renderer: Renderer2D, x, y: float): void =
|
proc drawPos(renderer: Renderer2D, x, y: float): void =
|
||||||
renderer.fillText(fmt"(x:{x.toInt}, y:{y.toInt})", (x, y).toPoint)
|
renderer.fillText(fmt"(x:{x.toInt}, y:{y.toInt})", (x, y).toPoint)
|
||||||
|
|
||||||
proc drawPos(renderer: Renderer2D, point: Point): void =
|
proc drawPos(renderer: Renderer2D, point: Point): void =
|
||||||
@@ -118,8 +150,8 @@ proc drawGame(game: Game) =
|
|||||||
let
|
let
|
||||||
gAreaX = 2 * padding + sidebarWidth
|
gAreaX = 2 * padding + sidebarWidth
|
||||||
gAreay = padding
|
gAreay = padding
|
||||||
gAreaH = renderHeight - 2 * padding
|
gAreaH = game.renderer.getHeight - 2 * padding
|
||||||
gAreaW = renderWidth - sidebarWidth - 3 * padding
|
gAreaW = game.renderer.getWidth - sidebarWidth - 3 * padding
|
||||||
gSize = min(gAreaH, gAreaW)
|
gSize = min(gAreaH, gAreaW)
|
||||||
bSize = (gSize / 3).toInt
|
bSize = (gSize / 3).toInt
|
||||||
|
|
||||||
@@ -138,7 +170,7 @@ proc draw(game: Game) =
|
|||||||
## Draw the current screen on the canvas
|
## Draw the current screen on the canvas
|
||||||
|
|
||||||
# Fill background color.
|
# Fill background color.
|
||||||
game.renderer.fillRect(0.0, 0.0, renderWidth, renderHeight, gameBgColor)
|
game.renderer.fillRect(0.0, 0.0, game.renderer.getWidth, game.renderer.getHeight, gameBgColor)
|
||||||
|
|
||||||
case game.scene
|
case game.scene
|
||||||
of Scene.MainMenu:
|
of Scene.MainMenu:
|
||||||
|
|||||||
Reference in New Issue
Block a user