Введение
Phaser — это движок для разработки мобильных и десктопных HTML5 игр, базирующийся
на библиотеке PIXI.js. Поддерживает рендеринг в Canvas и WebGL, анимированные
спрайты, частицы, аудио, разные способы ввода и физику объектов. Исходники доступны
как для просмотра, так и для свободной модификации. Он создан Ричардом Дейви
(Richard Davey), известному благодаря активному участию в сообществе программистов,
использующих Flixel framework. Ричард не скрывает, что вдохновлялся Фликселем,
поэтому некоторые вещи в Фазере будут знакомы опытным флешерам. Первая версия
нового движка вышла 13 сентября этого года, сейчас ведется не только активное развитие
библиотеки, но и написание документации, поэтому в данный момент уроков по ней,
мягко говоря, немного. Что, по моему скромному мнению, следует исправлять, и прямо
сейчас.
Чтобы убедиться, что все настроено правильно, можно запустить небольшое приложение-
пример Hello Phaser. Создайте папку hellophaser в директории вашего веб-сервера,
предназначенной для сайтов, и скопируйте туда три файла из папки Docs/Hello Phaser:
Запустите свой любимый браузер и откройте URL со скопированными файлами (в моем
случае http://localhost:8888/hellophaser/). Если все хорошо, вы увидите вращающийся
симпатичный логотип, такой как на скриншоте ниже:
Разработка игры
Теперь можно приступать к разработке нашей первой игры. Создайте для нее папку
phaser-pong на вашем веб-сервере и скопируйте туда файл phaser.js из папки build с
исходниками фреймворка. Также создайте в ней папку assets, где мы будем хранить все
ресурсы, относящиеся к игре, и файл index.html (собственно, здесь и будет наша игра).
Скопируйте в папку assets изображения шарика, ракетки и фона. Можно взять следующие
файлы (в качестве фона я взял звездное небо из примеров Фазера), а можно нарисовать
что-то свое. Главное — это убедиться, что вы загружаете в игру нужные картинки с
корректными именами и подходящими размерами. Также не стоит выбирать слишком
большие изображения, с их отрисовкой могут возникнуть проблемы. Поэтому перед
использованием фотографии своего кота уменьшите ее до, скажем, 480х640 (разрешение
нашей игры), и все будет хорошо.
function update () {
}
</script>
Откройте в браузере адрес новой игры (у меня это http://localhost:8888/phaser-pong/) и вы
увидите ее окно с нарисованным фоном
Игровые объекты
return bet;
}
Метод создает спрайт с указанными координатами и добавляет его в игру. Поле anchor
отвечает за точку отсчета координат спрайта, устанавливаем его по центру изображения
ракетки. body содержит в себе элементы для работы с физикой. Здесь мы ограничиваем
движение ракетки пределами игрового пространства, задаем силу «отскока» и
указываем, что при столкновении с объектами ракетка не будет отлетать в сторону.
Добавим два вызова этой функции в create(), сразу после создания фона. Ракетки будут
добавлены в игру после фонового изображения, поэтому мы будем их видеть на экране:
playerBet = createBet(game.world.centerX, 600);
computerBet = createBet(game.world.centerX, 20);
Аналогичным образом создадим шарик, дописав следующий код сразу после вызовов
функции createBet() в create():
ball = game.add.sprite(game.world.centerX, game.world.centerY,
'ball');
ball.anchor.setTo(0.5, 0.5);
ball.body.collideWorldBounds = true;
ball.body.bounce.setTo(1, 1);
В результате увидим, что в нашей игре появились две ракетки и мячик, пока
неподвижные:
Логика
function releaseBall() {
if (!ballReleased) {
ball.body.velocity.x = ballSpeed;
ball.body.velocity.y = -ballSpeed;
ballReleased = true;
}
}
Функция проверяет, что шарик еще не запущен, и в таком случае задает ему скорость с
помощью поля velocity.
Вызов функции повесим на нажатие кнопки мышки, написав следующую строку в create():
game.input.onDown.add(releaseBall, this);
Вся суть игры заключается в отбивании шарика ракетками, поэтому нужно организовать
проверку столкновений шарика с ракетками. К счастью, в Фазере уже есть
соответствующий функционал, поэтому нам достаточно его использовать.
Допишем следующие три строки в конец update():
//Проверяем и обрабатываем столкновения мячика и ракеток
game.physics.collide(ball, playerBet, ballHitsBet, null, this);
game.physics.collide(ball, computerBet, ballHitsBet, null, this);
Осталось только добавить проверку на пропущенный гол. Если кто-то его пропустил,
ставим шарик в изначальную позицию по центру поля.
function checkGoal() {
if (ball.y < 15) {
setBall();
} else if (ball.y > 625) {
setBall();
}
}
function setBall() {
if (ballReleased) {
ball.x = game.world.centerX;
ball.y = game.world.centerY;
ball.body.velocity.x = 0;
ball.body.velocity.y = 0;
ballReleased = false;
}
Естественно, игре не хватает еще многого, как минимум подсчета очков и определения
победителей. Но мне кажется, что для введения в разработку с Phaser достаточно
показанных вещей. Движок поддерживает много других классных функций, которые я
собираюсь показать на примере новой игры, чуть более сложной и непосредственно
относящейся к Хабру, чтобы было интереснее.
Стей тьюнед.
Полезные ссылки:
1. Англоязычное введение в Фазер
2. Форум, посвященный движку
3. Твиттер Ричарда Дейви