О чем этот пример
При разработке игр часто возникает необходимость контролировать скорость реакции на ввод игрока. Например, чтобы персонаж перемещался с фиксированным интервалом при удержании клавиши, а не "телепортировался" каждый кадр. Встроенный метод `checkDown` из Phaser 3 позволяет легко реализовать такую задержку, улучшая игровой процесс и давая разработчикам точный контроль над перемещением объектов. Эта статья покажет, как использовать этот метод на практике.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
player;
cursors;
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('block', 'assets/sprites/block.png');
}
create ()
{
this.cursors = this.input.keyboard.createCursorKeys();
this.player = this.add.image(400, 300, 'block');
}
update ()
{
// Horizontal movement every 250ms
if (this.input.keyboard.checkDown(this.cursors.left, 250))
{
this.player.x -= 32;
}
else if (this.input.keyboard.checkDown(this.cursors.right, 250))
{
this.player.x += 32;
}
// Vertical movement every 150ms
if (this.input.keyboard.checkDown(this.cursors.up, 150))
{
this.player.y -= 32;
}
else if (this.input.keyboard.checkDown(this.cursors.down, 150))
{
this.player.y += 32;
}
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
backgroundColor: '#0072bc',
scene: Example
};
const game = new Phaser.Game(config);
Суть метода `keyboard.checkDown()`
Основной инструмент для решения задачи — метод this.input.keyboard.checkDown(). В отличие от простой проверки состояния клавиши, этот метод учитывает время, прошедшее с момента последнего успешного срабатывания.
Метод принимает два аргумента: объект клавиши и время задержки в миллисекундах. Он возвращает true только в том случае, если клавиша нажата И с момента последнего возврата true для этой же клавиши прошло больше указанного времени.
if (this.input.keyboard.checkDown(this.cursors.left, 250))
{
// Код выполнится не чаще, чем раз в 250 мс
}
Настройка сцены и создание контролов
Перед использованием ввода необходимо подготовить сцену. В методе preload() загружается спрайт, а в create() инициализируются курсорные клавиши и создается игровой объект.
Курсорные клавиши (cursors) — это специальный объект, содержащий ссылки на четыре клавиши-стрелки. Он создается один раз и используется для проверки ввода в каждом кадре.
create ()
{
this.cursors = this.input.keyboard.createCursorKeys();
this.player = this.add.image(400, 300, 'block');
}
Реализация перемещения с разной скоростью
Логика перемещения помещается в метод update(), который вызывается на каждом кадре игры. Здесь применяется метод checkDown с разными задержками для горизонтального и вертикального движения, что делает управление более гибким.
Персонаж будет двигаться по горизонтали каждые 250 мс, а по вертикали — каждые 150 мс. Это наглядно демонстрирует, как можно задавать разную "скорость" реакции для разных действий.
update ()
{
// Движение по горизонтали каждые 250 мс
if (this.input.keyboard.checkDown(this.cursors.left, 250))
{
this.player.x -= 32;
}
else if (this.input.keyboard.checkDown(this.cursors.right, 250))
{
this.player.x += 32;
}
// Движение по вертикали каждые 150 мс
if (this.input.keyboard.checkDown(this.cursors.up, 150))
{
this.player.y -= 32;
}
else if (this.input.keyboard.checkDown(this.cursors.down, 150))
{
this.player.y += 32;
}
}
Что попробовать дальше
Метод keyboard.checkDown() — это простой и мощный способ ввести квантованное управление в вашу игру. Он идеально подходит для пошаговых перемещений, скорострельности оружия с ограниченным темпом или любых действий, которые не должны повторяться каждый кадр. Для экспериментов попробуйте привязать задержку к характеристикам персонажа (например, скорость атаки) или сделать её динамической, изменяющейся в ходе игры.
