JS + Phaser пишем игру с Дино (часть 5) 🦖
В прошлой части мы с вами добавили коллизии, а так же разобрались с тем, как создать кнопку для перезапуска игры, если вы это пропустили, то советую вернуться к части 4.
Код, который уже готов живет тут.
Просто бегать - это слишком скучно, поэтому я хочу добавить в игру счет, а в месте с ним и некоторый соревновательный эффект!
Отображаем счет
Первое что нам нужно сделать - это добавить новое поле в наш класс, давайте объявим его в методе create()
:
create() { this.score = 0; // Остальной код фукнции }
Теперь мы с вами сможем как-то считать очки, которые получит игрок, но так же нам нужно и отображать эти данные, поэтому в этой же функции надо создать текстовый спрайт:
create() { // Остальной код фукнции this.scoreText = this.add.text(width, 0, "00000", { fill: "#535353", font: '900 35px Courier', resolution: 5 }).setOrigin(1, 0); }
Текстовый спрайт принимает следующие параметры:
- Координату x своего положения
- Координату y своего положения
- Стартовое значения (взяли '00000' - как в оригинале игры)
- Конфигурацию для текста: цвет, стиль шрифта, разрешение.
Как видите теперь у нас появился счет:
Считаем победные очки
Нам нужно где-то считать победные очки, для этого давайте создадим отдельную функцию handleScore()
и проинициализируем ее в методе create()
:
create() { // Остальной код фукнции this.handleScore(); }
handleScore() { this.time.addEvent({ delay: 1000/10, loop: true, callbackScope: this, callback: () => { // 1 if (!this.isGameRunning) { return; } // 2 this.score++; this.gameSpeed += 0.01 // 3 const score = Array.from(String(this.score), Number); for (let i = 0; i < 5 - String(this.score).length; i++) { score.unshift(0); } // 3 this.scoreText.setText(score.join('')); } }) }
- Если игра не идет, то мы ничего не считаем
- Если все же идет, то прибавляем счет и увеличиваем скорость игры
- Так как отображение - это 5ти значное число, то приводим к такому виду
- Изменяем нам текстовый спрайт на новое значение
Запоминаем лучший результат
Давайте добавим нашей игре немного памяти и начнем запоминать лучший счет игрока, для этого создадим еще один текстовый спрайт:
create() { // Остальной код фукнции this.highScoreText = this.add.text(0, 0, "00000", { fill: "#535353", font: '900 35px Courier', resolution: 5 }).setOrigin(1, 0); }
Кстати, я так подумала, давайте пока не начнется игра не будем показывать счет, поэтому для двух наших текстовых спрайтов по дефолту определим .setAlpha(0)
:
create() { // Остальной код фукнции this.scoreText = this.add.text(width, 0, "00000", { fill: "#535353", font: '900 35px Courier', resolution: 5 }).setOrigin(1, 0).setAlpha(0); this.highScoreText = this.add.text(0, 0, "00000", { fill: "#535353", font: '900 35px Courier', resolution: 5 }).setOrigin(1, 0).setAlpha(0); }
Логично, что когда начнется игра нам нужно вызвать у спрайта со счетом setAlpha(1)
, сделаем это в момент начала игры (в методе initStartTrigger()
):
initStartTrigger() { const { width, height } = this.game.config; this.physics.add.overlap(this.startTrigger, this.dino, () => { // Остальной код колбека const startEvent = this.time.addEvent({ delay: 1000/60, loop: true, callbackScope: this, callback: () => { // Остальной код колбека // Запустим игру if (this.ground.width >= 1000) { this.ground.width = width; this.isGameRunning = true; this.dino.setVelocityX(0); // Сюда добавим появление спрайта со счетом this.scoreText.setAlpha(1); startEvent.remove(); } } }); }, null, this); }
А вот когда произойдет коллизия нам бы сбросить счет, поэтому надо тоже добавить такую обработку в метод initColliders()
:
initColliders() { this.physics.add.collider(this.dino, this.obsticles, () => { this.physics.pause(); this.isGameRunning = false; this.anims.pauseAll(); this.dino.setTexture('dino-hurt'); this.respawnTime = 0; this.gameSpeed = 20; this.gameOverScreen.setAlpha(1); // Сюда добавим обнуление счета this.score = 0; }, null, this); }
Осталось добавить отображение и расчет лучшего забега, добавим это тоже в функцию initColliders()
:
initColliders() { this.physics.add.collider(this.dino, this.obsticles, () => { // Вычистлим позицию где отрисовать счет this.highScoreText.x = this.scoreText.x - this.scoreText.width - 20; // Получим предыдущее максимальное значение const highScore = this.highScoreText .text.substr(this.highScoreText.text.length - 5); // Сравним текущее с предыдущим и определим новое значение const newScore = Number(this.scoreText.text) > Number(highScore) ? this.scoreText.text : highScore; // Добавим максимальный счет на сцену this.highScoreText.setText('Top: ' + newScore); this.highScoreText.setAlpha(1); // Остальной код функции }, null, this); }
На этом я закончу пятую часть из цикла статей по созданию игры с Дино, надеюсь вам было интересно и вы попробовали сами с нуля создать свою игру!
Вы можете найти код для этого урока тут