diff --git a/index.html b/index.html
index 280736a..ae3938c 100644
--- a/index.html
+++ b/index.html
@@ -91,6 +91,7 @@
Perks
+
diff --git a/snake.css b/snake.css
index 1093816..e306422 100644
--- a/snake.css
+++ b/snake.css
@@ -145,6 +145,7 @@ canvas { display: block; border-radius: 4px; }
#btn-left { grid-column: 1; grid-row: 2; }
#btn-down { grid-column: 2; grid-row: 2; }
#btn-right { grid-column: 3; grid-row: 2; }
+#btn-pause { grid-column: 3; grid-row: 1; font-size: 1rem; }
#hint { margin-top: 14px; font-size: 0.8rem; color: #555; }
@@ -798,4 +799,8 @@ canvas { display: block; border-radius: 4px; }
/* Reset canvas-wrapper order */
#canvas-wrapper { order: unset; }
+
+ /* Bring controls closer to the canvas */
+ #effects-bar { margin-top: 4px; }
+ #controls { margin-top: 6px; }
}
diff --git a/snake.js b/snake.js
index 375f1ec..4e35350 100644
--- a/snake.js
+++ b/snake.js
@@ -83,6 +83,7 @@ const DOM = {
btnDown: getElement('btn-down'),
btnLeft: getElement('btn-left'),
btnRight: getElement('btn-right'),
+ btnPause: getElement('btn-pause'),
nameEntryOverlay: getElement('name-entry-overlay'),
neRank: getElement('ne-rank'),
nc0: getElement('nc0'),
@@ -834,6 +835,7 @@ function startGame() {
init();
draw();
DOM.overlay.style.display = 'none';
+ DOM.btnPause.textContent = '\u23F8';
running = true;
lastTime = performance.now();
accumulated = 0;
@@ -847,6 +849,12 @@ function enqueueDir(directionName) {
if (dirQueue.length < 3) dirQueue.push(DIR[directionName]);
}
+function togglePause() {
+ if (!running) return;
+ paused = !paused;
+ DOM.btnPause.textContent = paused ? '\u23F5' : '\u23F8';
+}
+
function tryDir(directionName) {
if (!running) return;
enqueueDir(directionName);
@@ -925,7 +933,7 @@ function onKeyDown(event) {
return;
}
if (event.key === 'p' || event.key === 'P') {
- paused = !paused;
+ togglePause();
return;
}
@@ -936,7 +944,12 @@ function onKeyDown(event) {
enqueueDir(directionName);
}
+function isCtrlBtn(target) {
+ return target instanceof Element && !!target.closest('.ctrl-btn');
+}
+
function onTouchStart(event) {
+ if (isCtrlBtn(event.target)) return;
touchStartX = event.touches[0].clientX;
touchStartY = event.touches[0].clientY;
const levelupOpen = DOM.levelupOverlay.style.display !== 'none';
@@ -946,6 +959,7 @@ function onTouchStart(event) {
function onTouchEnd(event) {
if (DOM.infoDrawer.classList.contains('open')) return;
if (DOM.levelupOverlay.style.display !== 'none') return;
+ if (isCtrlBtn(event.target)) return;
const dx = event.changedTouches[0].clientX - touchStartX;
const dy = event.changedTouches[0].clientY - touchStartY;
if (Math.abs(dx) < 10 && Math.abs(dy) < 10) return;
@@ -978,10 +992,16 @@ function wireEvents() {
}
});
- DOM.btnUp.addEventListener('click', () => tryDir('UP'));
- DOM.btnDown.addEventListener('click', () => tryDir('DOWN'));
- DOM.btnLeft.addEventListener('click', () => tryDir('LEFT'));
- DOM.btnRight.addEventListener('click', () => tryDir('RIGHT'));
+ [
+ [DOM.btnUp, () => tryDir('UP')],
+ [DOM.btnDown, () => tryDir('DOWN')],
+ [DOM.btnLeft, () => tryDir('LEFT')],
+ [DOM.btnRight, () => tryDir('RIGHT')],
+ [DOM.btnPause, () => togglePause()],
+ ].forEach(([btn, handler]) => {
+ btn.addEventListener('click', handler);
+ btn.addEventListener('touchstart', (e) => { e.preventDefault(); handler(); }, { passive: false });
+ });
DOM.startBtn.addEventListener('click', startGame);
DOM.devPerkBtn.addEventListener('click', () => {