Я использую Ланс для игры, где игровая зона представляет собой мозаичную карту. Когда игрок нажимает клавишу со стрелкой влево, его персонаж должен переместить одну плитку влево и т. Д. Я попробовал два подхода, см. Ниже, но ни один из них не сработал.
Можно ли изменить какой-либо подход для работы с движением на основе плиток? Или нужен третий подход? Или Ланс не подходит для такой игры?
Подход 1 : регулировка положения игрока непосредственно при нажатии клавиши. Из моего класса GameEngine:
if (inputData.input == 'left') {
player.position.x -= 32;
player.angle = 180;
}
Хотя это хорошо работает для одиночного игрока, в мультиплеере это не так. Когда игрок A движется, его позиция не обновляется на экране игрока B.
Подход 2 : установка состояния игрока при нажатии клавиши:
if (inputData.input == 'left') {
player.state = 'walkLeft';
}
Затем добавьте обработчик postStep
в общий класс GameEngine. (Добавление его в Player не сработало). Этот код поворачивает игрока (на много шагов) лицом на 180 градусов, а затем ускоряет игрока в этом направлении:
onPostStep(event) {
let players = this.world.queryObjects({instanceType: Player});
players.forEach(player => {
if (player.state == 'walkLeft') {
if (Math.abs(player.angle - 180) > 2)
player.turnLeft(2);
}
else {
player.accelerate(1);
player.state = '';
}
}
})
}
При таком подходе, если игрок нажимает левую клавишу со стрелкой, его угол сначала изменяется, как и ожидалось, но ускорение и движение ошибочно. Кроме того, позиция игрока А на экране экрана отличается от позиции игрока Б.
Демо Spaaace является основой для моего проекта, поэтому в моем проекте используется тот же изгиб, физический движок и т. Д.