Показать сообщение отдельно
  #8 (permalink)  
Старый 30.04.2020, 02:42
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Toban, у вас обрабатывается только первое движение вперёд и первый поворот, чтобы можно было двигаться дальше, нужно добавлять новые повороты и новые движения вперёд. Для этого есть матрицы, которые могут хранить в себе накопление поворотов и движении вперёд.

Я так понимаю, вы хотите, чтобы при нажатии на клавишу W происходило движение вперёд, и одновременно можно было бы поворачиваться при помощи Q или E.

Я не знаю, почему вы так сложно сделали определение нажатой клавиши — достаточно завести множество (у вас есть!) в которое при нажатии клавиш будет записываться, какая нажата клавиша, а при отпускании такая клавиша будет удаляться из числа нажатых.

Затем в игровом цикле вам нужно будет проверять, нажата ли клавиша и в соответствии с полученной информацией двигаться вперёд или поворачиваться.

Вот пример того, что вы хотели достичь...
<div id="image" style="width: 50px; height: 25px; background: linear-gradient(to right, red, black);"></div>

<script>
	const pressedKeys = new Set();

	addEventListener("keydown", event => {
		pressedKeys.add(event.code);
	});

	addEventListener("keyup", event => {
		pressedKeys.delete(event.code);
	});

	const m = new DOMMatrix();

	let dt, lastT = performance.now();
	const image = document.getElementById("image");

	(function loop(t) {
		requestAnimationFrame(loop);

		dt = t - lastT;
		lastT = t;

		if(pressedKeys.has("KeyW") || pressedKeys.has("ArrowUp")) m.translateSelf(0.1 * dt);
		if(pressedKeys.has("KeyS") || pressedKeys.has("ArrowDown")) m.translateSelf(-0.1 * dt);
		if(pressedKeys.has("KeyD") || pressedKeys.has("ArrowRight")) m.rotateSelf(0.2 * dt);
		if(pressedKeys.has("KeyA") || pressedKeys.has("ArrowLeft")) m.rotateSelf(-0.2 * dt);

		image.style.transform = m;
	})(lastT);
</script>

Последний раз редактировалось Malleys, 30.04.2020 в 14:56.
Ответить с цитированием