This commit is contained in:
@@ -115,6 +115,14 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 1.25rem;
|
gap: 1.25rem;
|
||||||
padding-top: 0.5rem;
|
padding-top: 0.5rem;
|
||||||
|
max-width: 180px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.battle-controls__hint {
|
||||||
|
color: var(--color-silver);
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-align: center;
|
||||||
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dpad {
|
.dpad {
|
||||||
|
|||||||
@@ -52,9 +52,13 @@ function setupEntities() {
|
|||||||
ctx.strokeStyle = '#0a0e0c';
|
ctx.strokeStyle = '#0a0e0c';
|
||||||
ctx.stroke();
|
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.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({
|
Q = window.Quintus().include('Sprites, Scenes, 2D, Input').setup({
|
||||||
width: cols * TILE_PX,
|
width: cols * TILE_PX,
|
||||||
height: rows * TILE_PX,
|
height: rows * TILE_PX,
|
||||||
|
autoFocus: true,
|
||||||
});
|
});
|
||||||
|
Q.el.tabIndex = 1;
|
||||||
Q.input.keyboardControls({
|
Q.input.keyboardControls({
|
||||||
LEFT: 'left', RIGHT: 'right', UP: 'up', DOWN: 'down',
|
LEFT: 'left', RIGHT: 'right', UP: 'up', DOWN: 'down',
|
||||||
A: 'left', D: 'right', W: 'up', S: 'down',
|
A: 'left', D: 'right', W: 'up', S: 'down',
|
||||||
@@ -157,7 +163,12 @@ function bindControlButtons(root) {
|
|||||||
};
|
};
|
||||||
root.querySelectorAll('[data-input]').forEach((btn) => {
|
root.querySelectorAll('[data-input]').forEach((btn) => {
|
||||||
const input = btn.dataset.input;
|
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('mouseup', () => press(input, false));
|
||||||
btn.addEventListener('mouseleave', () => press(input, false));
|
btn.addEventListener('mouseleave', () => press(input, false));
|
||||||
btn.addEventListener('touchstart', (e) => {
|
btn.addEventListener('touchstart', (e) => {
|
||||||
@@ -320,6 +331,7 @@ export function startBattle(networkInstance, payload, ownPlayerId) {
|
|||||||
<div class="battle-layout">
|
<div class="battle-layout">
|
||||||
<div id="battle-canvas-slot"></div>
|
<div id="battle-canvas-slot"></div>
|
||||||
<div class="battle-controls">
|
<div class="battle-controls">
|
||||||
|
<p class="battle-controls__hint">WASD / стрелки + пробел тоже работают</p>
|
||||||
<div class="dpad">
|
<div class="dpad">
|
||||||
<button class="dpad__up" data-input="up">↑</button>
|
<button class="dpad__up" data-input="up">↑</button>
|
||||||
<button class="dpad__left" data-input="left">←</button>
|
<button class="dpad__left" data-input="left">←</button>
|
||||||
@@ -333,6 +345,10 @@ export function startBattle(networkInstance, payload, ownPlayerId) {
|
|||||||
|
|
||||||
ensureQuintus(cols, rows);
|
ensureQuintus(cols, rows);
|
||||||
document.getElementById('battle-canvas-slot').appendChild(Q.el);
|
document.getElementById('battle-canvas-slot').appendChild(Q.el);
|
||||||
|
// Клавиатурные события Quintus слушает на самом канвасе — если фокус
|
||||||
|
// не на нём (а он теряется при каждом переприкреплении к DOM на реванш),
|
||||||
|
// WASD/стрелки/space просто никуда не долетают.
|
||||||
|
Q.el.focus();
|
||||||
bindControlButtons(container.querySelector('.battle-controls'));
|
bindControlButtons(container.querySelector('.battle-controls'));
|
||||||
container.querySelector('#battle-result-overlay').addEventListener('click', onOverlayClick);
|
container.querySelector('#battle-result-overlay').addEventListener('click', onOverlayClick);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user