@zlodiak

Правильно ли организовано отслеживание событий клавиатуры?

Я написал простейшую систему на классах. Суть её в том, что при помощи нажатия на клавиши курсора, возможно передвигать игрока по игровому полю. Тут живой пример.

Проблема в том, что я не уверен в том, что правильно с точки зрения архитектуры организовал отслеживание событий клавиатуры. А конкретно метод player.trackMovies()

С одной стороны сущность клавиатуры не относится напрямую к сущности игрока. Но с другой стороны мне показалась дикой мысль создавать отдельный класс для неё(потому что в этом случае он использовался бы не как класс, а как обычный контейнер. Функция)

Посоветуйте пожалуйста как построить более прозрачную архитектуру с учётом того, что дальше игра будет развиваться хотя бы до уровня дендиевских танчиков

Вот класс игрока:
class Player {

	constructor(initObj) {
		this.color = initObj.color;
		this.sideSize = initObj.sideSize;
		this.speed = initObj.speed;
		this.xCoord = initObj.xCoord;
		this.yCoord = initObj.yCoord;
		this.canvas = initObj.canvas;

		this.trackMovies();
	}

	render(ctx) {
    ctx.fillStyle = this.color;
    ctx.fillRect(this.xCoord, this.yCoord, this.sideSize, this.sideSize);
	}

	trackMovies() {
		Rx.Observable.fromEvent(document, 'keydown').map(
			e => {
		  	const coords = { x: 0, y: 0 }
				if (e.keyCode == 37) { coords.x -= (this.xCoord <= 0) ? 0 : this.speed; }
				if (e.keyCode == 38) { coords.y -= (this.yCoord <= 0) ? 0 : this.speed; }
				if (e.keyCode == 39) { coords.x += (this.xCoord + this.sideSize >= this.canvas.width) ? 0 : this.speed;	}
				if (e.keyCode == 40) { coords.y += (this.yCoord + this.sideSize >= this.canvas.height) ? 0 : this.speed; }
				return coords;
			}
		)
		.startWith({ x: 0, y: 0 })
		.subscribe(coords => {
			this.xCoord += coords.x;
			this.yCoord += coords.y;
		});	
	}

}
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
У вас прямо в обработчике события клавиши идет проверка координат, скорости, вот это всё. Оно конечно работает, но при росте проекта скорее всего придется переделывать - обработку клавиш отдельно, скорость и границы поля - отдельно. Тем более, что проверка границ нужна будет и для NPC-противников.

С другой стороны - не стоит сильно увлекаться оверинжинирингом и создавать 50 классов там, где вся логика укладывается в десяток строк.

Прикиньте прямо сейчас как вы планируете развивать игру, как можно максимально "отвязать" компоненты друг от друга.

Ну и по мелочи - я бы вынес номера кнопок в конфиг, ибо сегодня у вас стрелки, завтра wasd, а послезавтра в это вообще с тачскрина управляется.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы