Фикс клавиатуры в бою, подсказка про WASD, зелёное дуло
Quintus слушает клавиатуру на самом канвасе, а не на document/window; без autoFocus и явного focus() канвас не получал фокус (особенно после переприкрепления к DOM на реванш) — WASD/стрелки/space никуда не долетали. Клик по кнопке D-pad тоже уводил фокус — возвращаем его на канвас. Дуло танка было почти того же цвета, что фон (#0a0e0c на чёрном) — не видно. Сделал ярко-зелёным с тёмной обводкой, читается на любом корпусе. Над блоком кнопок управления — подсказка, что WASD/стрелки тоже работают.
This commit is contained in:
@@ -52,9 +52,13 @@ function setupEntities() {
|
||||
ctx.strokeStyle = '#0a0e0c';
|
||||
ctx.stroke();
|
||||
|
||||
// ствол — явно торчит вперёд по направлению взгляда (локально «вверх»)
|
||||
ctx.fillStyle = '#0a0e0c';
|
||||
// ствол — явно торчит вперёд по направлению взгляда (локально «вверх»).
|
||||
// Ярко-зелёный с тёмной обводкой — иначе на тёмном корпусе не виден.
|
||||
ctx.fillStyle = '#00ff41';
|
||||
ctx.strokeStyle = '#0a0e0c';
|
||||
ctx.lineWidth = 1;
|
||||
ctx.fillRect(-2.5, -p.h / 2 - 12, 5, 16);
|
||||
ctx.strokeRect(-2.5, -p.h / 2 - 12, 5, 16);
|
||||
},
|
||||
});
|
||||
|
||||
@@ -116,7 +120,9 @@ function ensureQuintus(cols, rows) {
|
||||
Q = window.Quintus().include('Sprites, Scenes, 2D, Input').setup({
|
||||
width: cols * TILE_PX,
|
||||
height: rows * TILE_PX,
|
||||
autoFocus: true,
|
||||
});
|
||||
Q.el.tabIndex = 1;
|
||||
Q.input.keyboardControls({
|
||||
LEFT: 'left', RIGHT: 'right', UP: 'up', DOWN: 'down',
|
||||
A: 'left', D: 'right', W: 'up', S: 'down',
|
||||
@@ -157,7 +163,12 @@ function bindControlButtons(root) {
|
||||
};
|
||||
root.querySelectorAll('[data-input]').forEach((btn) => {
|
||||
const input = btn.dataset.input;
|
||||
btn.addEventListener('mousedown', () => press(input, true));
|
||||
// Клик по кнопке уводит фокус с канваса — а Quintus слушает клавиатуру
|
||||
// именно на нём, так что после клика WASD/стрелки перестанут работать.
|
||||
btn.addEventListener('mousedown', () => {
|
||||
press(input, true);
|
||||
Q?.el.focus();
|
||||
});
|
||||
btn.addEventListener('mouseup', () => press(input, false));
|
||||
btn.addEventListener('mouseleave', () => press(input, false));
|
||||
btn.addEventListener('touchstart', (e) => {
|
||||
@@ -320,6 +331,7 @@ export function startBattle(networkInstance, payload, ownPlayerId) {
|
||||
<div class="battle-layout">
|
||||
<div id="battle-canvas-slot"></div>
|
||||
<div class="battle-controls">
|
||||
<p class="battle-controls__hint">WASD / стрелки + пробел тоже работают</p>
|
||||
<div class="dpad">
|
||||
<button class="dpad__up" data-input="up">↑</button>
|
||||
<button class="dpad__left" data-input="left">←</button>
|
||||
@@ -333,6 +345,10 @@ export function startBattle(networkInstance, payload, ownPlayerId) {
|
||||
|
||||
ensureQuintus(cols, rows);
|
||||
document.getElementById('battle-canvas-slot').appendChild(Q.el);
|
||||
// Клавиатурные события Quintus слушает на самом канвасе — если фокус
|
||||
// не на нём (а он теряется при каждом переприкреплении к DOM на реванш),
|
||||
// WASD/стрелки/space просто никуда не долетают.
|
||||
Q.el.focus();
|
||||
bindControlButtons(container.querySelector('.battle-controls'));
|
||||
container.querySelector('#battle-result-overlay').addEventListener('click', onOverlayClick);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user