Основанное на плитках движение с игровым движком Lance? - PullRequest
2 голосов
/ 28 мая 2019

Я использую Ланс для игры, где игровая зона представляет собой мозаичную карту. Когда игрок нажимает клавишу со стрелкой влево, его персонаж должен переместить одну плитку влево и т. Д. Я попробовал два подхода, см. Ниже, но ни один из них не сработал.

Можно ли изменить какой-либо подход для работы с движением на основе плиток? Или нужен третий подход? Или Ланс не подходит для такой игры?

Подход 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 является основой для моего проекта, поэтому в моем проекте используется тот же изгиб, физический движок и т. Д.

1 Ответ

2 голосов
/ 29 мая 2019

Первый подход лучше. Игра Brawler из коллекции образцов делает именно то, что вы описываете. Вы можете посмотреть код BrawlerGameEngine.js в https://github.com/lance-gg/tinygames/tree/master/brawler

Убедитесь, что действие обрабатывается в методе GameEngine::processInput(inputData, playerId)

...