Я написал простейшую систему на классах. Суть её в том, что при помощи нажатия на клавиши курсора, возможно передвигать игрока по игровому полю. Тут
живой пример.
Проблема в том, что я не уверен в том, что правильно с точки зрения архитектуры организовал отслеживание событий клавиатуры. А конкретно метод 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;
});
}
}