mini optimization (calling less functions, use cloneNode and not document.createElement)
This commit is contained in:
parent
34fbf05e2f
commit
43db4daa11
1 changed files with 57 additions and 40 deletions
97
game/game.js
97
game/game.js
|
|
@ -33,12 +33,23 @@ function addCanvasToDom(canvas) {
|
||||||
return canvas
|
return canvas
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ELEMENTS = {
|
||||||
|
TABLE: document.createElement('table'),
|
||||||
|
TR: document.createElement('tr'),
|
||||||
|
TD: document.createElement('td'),
|
||||||
|
BUTTON: document.createElement('button'),
|
||||||
|
INPUT: document.createElement('input'),
|
||||||
|
LABEL: document.createElement('label'),
|
||||||
|
DIV: document.createElement('div'),
|
||||||
|
A: document.createElement('a'),
|
||||||
|
}
|
||||||
|
|
||||||
function addMenuToDom(gameId) {
|
function addMenuToDom(gameId) {
|
||||||
const previewImageUrl = Game.getImageUrl(gameId)
|
const previewImageUrl = Game.getImageUrl(gameId)
|
||||||
function row (...elements) {
|
function row (...elements) {
|
||||||
const row = document.createElement('tr')
|
const row = ELEMENTS.TR.cloneNode(true)
|
||||||
for (let el of elements) {
|
for (let el of elements) {
|
||||||
const td = document.createElement('td')
|
const td = ELEMENTS.TD.cloneNode(true)
|
||||||
td.appendChild(el)
|
td.appendChild(el)
|
||||||
row.appendChild(td)
|
row.appendChild(td)
|
||||||
}
|
}
|
||||||
|
|
@ -46,27 +57,27 @@ function addMenuToDom(gameId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function btn(txt) {
|
function btn(txt) {
|
||||||
const btn = document.createElement('button')
|
const btn = ELEMENTS.BUTTON.cloneNode(true)
|
||||||
btn.classList.add('btn')
|
btn.classList.add('btn')
|
||||||
btn.innerText = txt
|
btn.innerText = txt
|
||||||
return btn
|
return btn
|
||||||
}
|
}
|
||||||
|
|
||||||
function colorinput() {
|
function colorinput() {
|
||||||
const input = document.createElement('input')
|
const input = ELEMENTS.INPUT.cloneNode(true)
|
||||||
input.type = 'color'
|
input.type = 'color'
|
||||||
return input
|
return input
|
||||||
}
|
}
|
||||||
|
|
||||||
function textinput(maxLength) {
|
function textinput(maxLength) {
|
||||||
const input = document.createElement('input')
|
const input = ELEMENTS.INPUT.cloneNode(true)
|
||||||
input.type = 'text'
|
input.type = 'text'
|
||||||
input.maxLength = maxLength
|
input.maxLength = maxLength
|
||||||
return input
|
return input
|
||||||
}
|
}
|
||||||
|
|
||||||
function label(text) {
|
function label(text) {
|
||||||
const label = document.createElement('label')
|
const label = ELEMENTS.LABEL.cloneNode(true)
|
||||||
label.innerText = text
|
label.innerText = text
|
||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
@ -89,7 +100,7 @@ function addMenuToDom(gameId) {
|
||||||
nameChangeEl
|
nameChangeEl
|
||||||
)
|
)
|
||||||
|
|
||||||
const settingsEl = document.createElement('table')
|
const settingsEl = ELEMENTS.TABLE.cloneNode(true)
|
||||||
settingsEl.classList.add('settings')
|
settingsEl.classList.add('settings')
|
||||||
settingsEl.appendChild(bgColorPickerRow)
|
settingsEl.appendChild(bgColorPickerRow)
|
||||||
settingsEl.appendChild(playerColorPickerRow)
|
settingsEl.appendChild(playerColorPickerRow)
|
||||||
|
|
@ -98,63 +109,62 @@ function addMenuToDom(gameId) {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
})
|
})
|
||||||
|
|
||||||
const settingsOverlay = document.createElement('div')
|
const settingsOverlay = ELEMENTS.DIV.cloneNode(true)
|
||||||
settingsOverlay.classList.add('overlay', 'transparent', 'closed')
|
settingsOverlay.classList.add('overlay', 'transparent', 'closed')
|
||||||
settingsOverlay.appendChild(settingsEl)
|
settingsOverlay.appendChild(settingsEl)
|
||||||
settingsOverlay.addEventListener('click', () => {
|
settingsOverlay.addEventListener('click', () => {
|
||||||
settingsOverlay.classList.toggle('closed')
|
settingsOverlay.classList.toggle('closed')
|
||||||
})
|
})
|
||||||
|
|
||||||
const previewEl = document.createElement('div')
|
const previewEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
previewEl.classList.add('preview')
|
previewEl.classList.add('preview')
|
||||||
|
|
||||||
const imgEl = document.createElement('div')
|
const imgEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
imgEl.classList.add('img')
|
imgEl.classList.add('img')
|
||||||
imgEl.style.backgroundImage = `url(${previewImageUrl})`
|
imgEl.style.backgroundImage = `url(${previewImageUrl})`
|
||||||
previewEl.appendChild(imgEl)
|
previewEl.appendChild(imgEl)
|
||||||
|
|
||||||
const previewOverlay = document.createElement('div')
|
const previewOverlay = ELEMENTS.DIV.cloneNode(true)
|
||||||
previewOverlay.classList.add('overlay', 'closed')
|
previewOverlay.classList.add('overlay', 'closed')
|
||||||
previewOverlay.appendChild(previewEl)
|
previewOverlay.appendChild(previewEl)
|
||||||
previewOverlay.addEventListener('click', () => {
|
previewOverlay.addEventListener('click', () => {
|
||||||
previewOverlay.classList.toggle('closed')
|
previewOverlay.classList.toggle('closed')
|
||||||
})
|
})
|
||||||
|
|
||||||
const settingsOpenerEl = document.createElement('div')
|
const settingsOpenerEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
settingsOpenerEl.classList.add('opener')
|
settingsOpenerEl.classList.add('opener')
|
||||||
settingsOpenerEl.appendChild(document.createTextNode('🛠️ Settings'))
|
settingsOpenerEl.appendChild(document.createTextNode('🛠️ Settings'))
|
||||||
settingsOpenerEl.addEventListener('click', () => {
|
settingsOpenerEl.addEventListener('click', () => {
|
||||||
settingsOverlay.classList.toggle('closed')
|
settingsOverlay.classList.toggle('closed')
|
||||||
})
|
})
|
||||||
|
|
||||||
const homeEl = document.createElement('a')
|
const homeEl = ELEMENTS.A.cloneNode(true)
|
||||||
homeEl.classList.add('opener')
|
homeEl.classList.add('opener')
|
||||||
homeEl.appendChild(document.createTextNode('🧩 Puzzles'))
|
homeEl.appendChild(document.createTextNode('🧩 Puzzles'))
|
||||||
homeEl.href = "/"
|
homeEl.href = "/"
|
||||||
|
|
||||||
const previewOpenerEl = document.createElement('div')
|
const previewOpenerEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
previewOpenerEl.classList.add('opener')
|
previewOpenerEl.classList.add('opener')
|
||||||
previewOpenerEl.appendChild(document.createTextNode('🖼️ Preview'))
|
previewOpenerEl.appendChild(document.createTextNode('🖼️ Preview'))
|
||||||
previewOpenerEl.addEventListener('click', () => {
|
previewOpenerEl.addEventListener('click', () => {
|
||||||
previewOverlay.classList.toggle('closed')
|
previewOverlay.classList.toggle('closed')
|
||||||
})
|
})
|
||||||
|
|
||||||
const tabsEl = document.createElement('div')
|
const tabsEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
tabsEl.classList.add('tabs')
|
tabsEl.classList.add('tabs')
|
||||||
tabsEl.appendChild(homeEl)
|
tabsEl.appendChild(homeEl)
|
||||||
tabsEl.appendChild(previewOpenerEl)
|
tabsEl.appendChild(previewOpenerEl)
|
||||||
tabsEl.appendChild(settingsOpenerEl)
|
tabsEl.appendChild(settingsOpenerEl)
|
||||||
|
|
||||||
const menuEl = document.createElement('div')
|
const menuEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
menuEl.classList.add('menu')
|
menuEl.classList.add('menu')
|
||||||
menuEl.appendChild(tabsEl)
|
menuEl.appendChild(tabsEl)
|
||||||
|
|
||||||
const scoresTitleEl = document.createElement('div')
|
const scoresTitleEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
scoresTitleEl.appendChild(document.createTextNode('Scores'))
|
scoresTitleEl.appendChild(document.createTextNode('Scores'))
|
||||||
|
|
||||||
const scoresListEl = document.createElement('table')
|
const scoresListEl = ELEMENTS.TABLE.cloneNode(true)
|
||||||
const updateScores = () => {
|
const updateScoreBoard = (ts) => {
|
||||||
const ts = TIME()
|
|
||||||
const minTs = ts - 30 * Time.SEC
|
const minTs = ts - 30 * Time.SEC
|
||||||
|
|
||||||
const players = Game.getRelevantPlayers(gameId, ts)
|
const players = Game.getRelevantPlayers(gameId, ts)
|
||||||
|
|
@ -195,23 +205,23 @@ function addMenuToDom(gameId) {
|
||||||
return `${icon} ${timeDiffStr}`
|
return `${icon} ${timeDiffStr}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const timerCountdownEl = document.createElement('div')
|
const timerCountdownEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
timerCountdownEl.innerText = timerStr()
|
timerCountdownEl.innerText = timerStr()
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
timerCountdownEl.innerText = timerStr()
|
timerCountdownEl.innerText = timerStr()
|
||||||
}, 50) // needs to be small, so that it updates quick enough in replay
|
}, 50) // needs to be small, so that it updates quick enough in replay
|
||||||
|
|
||||||
const timerEl = document.createElement('div')
|
const timerEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
timerEl.classList.add('timer')
|
timerEl.classList.add('timer')
|
||||||
timerEl.appendChild(timerCountdownEl)
|
timerEl.appendChild(timerCountdownEl)
|
||||||
|
|
||||||
let replayControl = null
|
let replayControl = null
|
||||||
if (MODE === 'replay') {
|
if (MODE === 'replay') {
|
||||||
const replayControlEl = document.createElement('div')
|
const replayControlEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
const speedUp = btn('⏫')
|
const speedUp = btn('⏫')
|
||||||
const speedDown = btn('⏬')
|
const speedDown = btn('⏬')
|
||||||
const pause = btn('⏸️')
|
const pause = btn('⏸️')
|
||||||
const speed = document.createElement('div')
|
const speed = ELEMENTS.DIV.cloneNode(true)
|
||||||
replayControlEl.appendChild(speed)
|
replayControlEl.appendChild(speed)
|
||||||
replayControlEl.appendChild(speedUp)
|
replayControlEl.appendChild(speedUp)
|
||||||
replayControlEl.appendChild(speedDown)
|
replayControlEl.appendChild(speedDown)
|
||||||
|
|
@ -220,7 +230,7 @@ function addMenuToDom(gameId) {
|
||||||
replayControl = { speedUp, speedDown, pause, speed }
|
replayControl = { speedUp, speedDown, pause, speed }
|
||||||
}
|
}
|
||||||
|
|
||||||
const scoresEl = document.createElement('div')
|
const scoresEl = ELEMENTS.DIV.cloneNode(true)
|
||||||
scoresEl.classList.add('scores')
|
scoresEl.classList.add('scores')
|
||||||
scoresEl.appendChild(scoresTitleEl)
|
scoresEl.appendChild(scoresTitleEl)
|
||||||
scoresEl.appendChild(scoresListEl)
|
scoresEl.appendChild(scoresListEl)
|
||||||
|
|
@ -235,7 +245,7 @@ function addMenuToDom(gameId) {
|
||||||
bgColorPickerEl,
|
bgColorPickerEl,
|
||||||
playerColorPickerEl,
|
playerColorPickerEl,
|
||||||
nameChangeEl,
|
nameChangeEl,
|
||||||
updateScores,
|
updateScoreBoard,
|
||||||
replayControl,
|
replayControl,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -322,7 +332,7 @@ async function main() {
|
||||||
|
|
||||||
const cursors = {}
|
const cursors = {}
|
||||||
const getPlayerCursor = async (p) => {
|
const getPlayerCursor = async (p) => {
|
||||||
let key = p.color + ' ' + p.d
|
const key = p.color + ' ' + p.d
|
||||||
if (!cursors[key]) {
|
if (!cursors[key]) {
|
||||||
const cursor = p.d ? cursorGrab : cursorHand
|
const cursor = p.d ? cursorGrab : cursorHand
|
||||||
const mask = p.d ? cursorGrabMask : cursorHandMask
|
const mask = p.d ? cursorGrabMask : cursorHandMask
|
||||||
|
|
@ -361,10 +371,17 @@ async function main() {
|
||||||
throw '[ 2020-12-22 MODE invalid, must be play|replay ]'
|
throw '[ 2020-12-22 MODE invalid, must be play|replay ]'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TILE_DRAW_OFFSET = Game.getTileDrawOffset(gameId)
|
||||||
|
const TILE_DRAW_SIZE = Game.getTileDrawSize(gameId)
|
||||||
|
const PUZZLE_WIDTH = Game.getPuzzleWidth(gameId)
|
||||||
|
const PUZZLE_HEIGHT = Game.getPuzzleHeight(gameId)
|
||||||
|
const TABLE_WIDTH = Game.getTableWidth(gameId)
|
||||||
|
const TABLE_HEIGHT = Game.getTableHeight(gameId)
|
||||||
|
|
||||||
const bitmaps = await PuzzleGraphics.loadPuzzleBitmaps(Game.getPuzzle(gameId))
|
const bitmaps = await PuzzleGraphics.loadPuzzleBitmaps(Game.getPuzzle(gameId))
|
||||||
|
|
||||||
const {bgColorPickerEl, playerColorPickerEl, nameChangeEl, updateScores, replayControl} = addMenuToDom(gameId)
|
const {bgColorPickerEl, playerColorPickerEl, nameChangeEl, updateScoreBoard, replayControl} = addMenuToDom(gameId)
|
||||||
updateScores()
|
updateScoreBoard(TIME())
|
||||||
|
|
||||||
const longFinished = Game.getFinishTs(gameId)
|
const longFinished = Game.getFinishTs(gameId)
|
||||||
let finished = longFinished ? true : false
|
let finished = longFinished ? true : false
|
||||||
|
|
@ -381,8 +398,8 @@ async function main() {
|
||||||
const viewport = new Camera(canvas)
|
const viewport = new Camera(canvas)
|
||||||
// center viewport
|
// center viewport
|
||||||
viewport.move(
|
viewport.move(
|
||||||
-(Game.getTableWidth(gameId) - viewport.width) /2,
|
-(TABLE_WIDTH - viewport.width) /2,
|
||||||
-(Game.getTableHeight(gameId) - viewport.height) /2
|
-(TABLE_HEIGHT - viewport.height) /2
|
||||||
)
|
)
|
||||||
|
|
||||||
const playerBgColor = () => {
|
const playerBgColor = () => {
|
||||||
|
|
@ -627,12 +644,12 @@ async function main() {
|
||||||
// DRAW BOARD
|
// DRAW BOARD
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
pos = viewport.worldToViewportRaw({
|
pos = viewport.worldToViewportRaw({
|
||||||
x: (Game.getTableWidth(gameId) - Game.getPuzzleWidth(gameId)) / 2,
|
x: (TABLE_WIDTH - PUZZLE_WIDTH) / 2,
|
||||||
y: (Game.getTableHeight(gameId) - Game.getPuzzleHeight(gameId)) / 2
|
y: (TABLE_HEIGHT - PUZZLE_HEIGHT) / 2
|
||||||
})
|
})
|
||||||
dim = viewport.worldDimToViewportRaw({
|
dim = viewport.worldDimToViewportRaw({
|
||||||
w: Game.getPuzzleWidth(gameId),
|
w: PUZZLE_WIDTH,
|
||||||
h: Game.getPuzzleHeight(gameId),
|
h: PUZZLE_HEIGHT,
|
||||||
})
|
})
|
||||||
ctx.fillStyle = 'rgba(255, 255, 255, .3)'
|
ctx.fillStyle = 'rgba(255, 255, 255, .3)'
|
||||||
ctx.fillRect(pos.x, pos.y, dim.w, dim.h)
|
ctx.fillRect(pos.x, pos.y, dim.w, dim.h)
|
||||||
|
|
@ -645,12 +662,12 @@ async function main() {
|
||||||
for (let tile of Game.getTilesSortedByZIndex(gameId)) {
|
for (let tile of Game.getTilesSortedByZIndex(gameId)) {
|
||||||
const bmp = bitmaps[tile.idx]
|
const bmp = bitmaps[tile.idx]
|
||||||
pos = viewport.worldToViewportRaw({
|
pos = viewport.worldToViewportRaw({
|
||||||
x: Game.getTileDrawOffset(gameId) + tile.pos.x,
|
x: TILE_DRAW_OFFSET + tile.pos.x,
|
||||||
y: Game.getTileDrawOffset(gameId) + tile.pos.y,
|
y: TILE_DRAW_OFFSET + tile.pos.y,
|
||||||
})
|
})
|
||||||
dim = viewport.worldDimToViewportRaw({
|
dim = viewport.worldDimToViewportRaw({
|
||||||
w: Game.getTileDrawSize(gameId),
|
w: TILE_DRAW_SIZE,
|
||||||
h: Game.getTileDrawSize(gameId),
|
h: TILE_DRAW_SIZE,
|
||||||
})
|
})
|
||||||
ctx.drawImage(bmp,
|
ctx.drawImage(bmp,
|
||||||
0, 0, bmp.width, bmp.height,
|
0, 0, bmp.width, bmp.height,
|
||||||
|
|
@ -695,7 +712,7 @@ async function main() {
|
||||||
|
|
||||||
// DRAW PLAYERS
|
// DRAW PLAYERS
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
updateScores()
|
updateScoreBoard(ts)
|
||||||
if (DEBUG) Debug.checkpoint('scores done')
|
if (DEBUG) Debug.checkpoint('scores done')
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue