JS + Phaser пишем игру с Дино (часть 3) 🦖
В прошлой части мы с вами научили нашего Дино прыгать и пригибаться, а так же настроили плавный старт игры, если вы это пропустили, то советую вернуться к части 2.
Код, который уже готов живет тут.
В этой части мы с вами разберемся с тем, как добавить препятствия в нашу игру, научимся создавать дополнительные объекты!
Заготовка к созданию врагов
Для начала объявим переменную, которая будет отвечать за время респауна, пока скажем, что она равно 0, чтобы в другой части кода это изменять:
create() { // Оставшийся код функции this.respawnTime = 0; }
Дальше давайте создадим пустую группу физических объектов, в которую мы в дальнейшем будем помещать наши препятствия:
create() { // Оставшийся код функции this.obsticles = this.physics.add.group(); }
Ну что же, теперь нужно написать функцию, которая как раз будет отвечать за создание препятствий:
placeObsticle() { }
Для начала объявим количество препятствий, которые мы хотим создать, думаю оптимально будет сделать максимальное количество 7, чтобы создать, например 6 кактусов и 1го птиродактеля. Еще надо бы сделать рандомную дистанцию между ними, но так, чтобы Дино физически мог пройти игру:
placeObsticle() { const obsticleNum = Math.floor(Math.random() * 7) + 1; const distance = Phaser.Math.Between(600, 900); }
Нам нужно где-то вызывать функцию создания препятствий, а самое подходящее место - это функция update()
, давайте допишем туда следующий код:
update() { // Оставшийся код функции // delta - время, которое прошло с момента прошлого фрейма this.respawnTime += delta * this.gameSpeed * 0.08; if (this.respawnTime >= 1500) { this.placeObsticle(); // после того как создадим препятствие, // надо бы обнулить таймер до следующей пачки this.respawnTime = 0; } }
Сейчас у вас код будет ругаться, на то, что delta
не объявлена, на самом деле она может появиться в качестве параметров функции update()
, так что давайте это тоже добавим:
update(time, delta) { // код функции }
Больше кактусов и птеродактилей
Давайте вернемся к функции placeObsticle()
и начнем там создавать наших врагов, напишем обработчик так, чтобы когда obsticleNum > 6
, мы будем создавать 1го птеродактиля, а если меньше то кактусы:
placeObsticle() { // Получим ширину и высоту из конфигов игры const { width, height } = this.game.config; const obsticleNum = Math.floor(Math.random() * 7) + 1; const distance = Phaser.Math.Between(600, 900); let obsticle; if (obsticleNum > 6) { // Птеродактиль может лететь на разной высоте const enemyHeight = [50, 70]; obsticle = this.obsticles.create(width + distance, height - enemyHeight[Math.floor(Math.random() * 2)], `enemy-bird`) .setOrigin(0, 1); // Дальше мы с вами создадим эту анимацию obsticle.play('enemy-dino-fly', 1); obsticle.body.height = obsticle.body.height / 1.5; } else { // Если вы посмотрите в нашу статику, // то там есть 6 разных вариантов отрисовки кактусов, // именно поэтому картинка спрайта obsticle-${obsticleNum} obsticle = this.obsticles.create(width + distance, height, `obsticle-${obsticleNum}`) .setOrigin(0, 1); obsticle.body.offset.y = +10; } }
Если вы сейчас запустите игру, то вы не сможете увидеть наши препятствия, нам для начала нужно научить их передвигаться:
update(time, delta) { // Остальной код функции Phaser.Actions.IncX(this.obsticles.getChildren(), -this.gameSpeed); }
Давайте наконец-то запустим нашу игру:
Давайте еще научим нашего претодактиля красиво летать, для этого создадим для него анимацию:
initAnims() { // Оставшийся код функции this.anims.create({ key: 'enemy-dino-fly', frames: this.anims.generateFrameNumbers('enemy-bird', {start: 0, end: 1}), frameRate: 6, repeat: -1 }); }
На этом я закончу третью часть из цикла статей по созданию игры с Дино, надеюсь вам было интересно и вы попробовали сами с нуля создать свою игру!
Вы можете найти код для этого урока тут