Создайте копию flappy Bird с помощью TypeScript и Pixi.js

Онлайн демонстрационная ссылка и репозиторий кода (160 строк кода TypeScript).

Эта статья о том, что я узнал, создав небольшой проект, изучая Машинопись и Pixi.js и получая удовольствие.

Прежде чем говорить о деталях реализации, вот мои два цента о TypeScript и Pixi.js.

Первое преимущество TypeScript обеспечивает строгую проверку типов, приведенный ниже код является примером:

Если нам повезет, мы можем найти опечатку с locale на этапе разработки, но иногда ошибки такого рода незаметно переносятся в основную ветку кодовой базы и тратят много времени на отладку в производственная среда.

Второе преимущество TypeScript - облегчение страданий от разработки незнакомой мне библиотеки javascript, очень часто я очень беспокоюсь о том, использую ли я правильные подписи, и трачу много времени на проверку документов.
Теперь я могу полагаться на то, что говорит мне TypeScript:

Pixi.js - это легкая 2D-библиотека.

Первое преимущество - это оболочка WebGL (короче говоря, WebGL позволяет нам рендерить графику напрямую с помощью графического процессора), она позволяет нам использовать WebGL, не беспокоясь о WebGL API. (В моей последней статье WebGL и Image Filter 101 я упоминал о мощи WebGL, и мы должны предоставить много шаблонного кода, чтобы заставить WebGL работать, поскольку это низкоуровневый API).

Второе преимущество - это объединение всех видов 2D-контента (изображения, текста, фигур) в «Sprite», мы можем применять преобразование и добавлять интерактивность к этому контенту таким же образом с помощью простого в использовании API.
Мы также можем группировать различный контент с помощью контейнеров и быстро использовать пакетные эффекты.

Изображение летящей птицы

Чтобы начать использовать Pixi.js, вы можете начать с включения скрипта ниже в свой HTML-файл (или npm install pixi.js, если в вашем проекте есть инструменты для создания пакетов):
<script src='https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.5.4/pixi.min.js'></script>

Начнем с создания сцены. После этой настройки любые изменения, происходящие внутри контейнера сцены, можно отобразить с помощью renderer.render(stage).

const renderer = PIXI.autoDetectRenderer(512, 512);
document.body.appendChild(renderer.view);
const stage = new PIXI.Container();

Чтобы создать летающую птицу, я нашел эти активы по этой ссылке (пожалуйста, используйте атлас текстур, если у вас намного больше изображений в вашем проекте, который также хорошо поддерживается Pixi.js).

Затем я создал «Спрайт» и обновил текстуру спрайта с помощью интервального таймера.

С помощью приведенного ниже кода вы получите анимированную птицу, похожую на летающую.

В reset мы используем x и y для управления положением.
Если у вас есть speedX и speedY, вы также можете обновить ориентацию птицы с помощью this.sptire.rotation=Math.atan(speedY / speedX).

Теперь у нас есть птица, и мы можем применить к ней различные преобразования; вы можете попробовать добавить новое поле speedY в Bird класс и обновить положение птицы, обновляя y каждый draw спрайта на основе этого поля.

Раздирающие трубки

Как я упоминал ранее, при использовании Pixi.js все виды 2D-контента (изображения, текст, фигуры) можно рассматривать как «спрайты», для трубки я просто рисую несколько прямоугольников.

Pixi.js предоставил API двухмерного рисования с PIXI.Graphics, например, для рисования «трубы» и ее перемещения по горизонтали:

const tube = new PIXI.Graphics();
tube.beginFill(0xffffff);
//drawRect(x, y, width, height)
tube.drawRect(100, 0, 50, 120);
tube.drawRect(100, 200, 50, 512);
tube.endFill();
tube.x = 200;
stage.addChild(tube);
renderer.render(stage);

И класс лампы, который я сделал, выглядит так:

Проверка столкновения

После того, как у нас есть движущиеся объекты (трубы и птица), мы можем рассматривать их как прямоугольники.
Если у нас есть их крайняя левая верхняя точка, ширина и высота (x1, y1, w1, h1 и x2, y2, w2, h2), то мы можем проверить, сталкиваются ли два прямоугольника друг с другом:

if((x1 + w1 < x2) || (x2 + w2 < x1) || (y1 + h1 < y2) || (y2 + h2 < y1))
  No collision

Итак, это практически все, что нужно для создания простой копии в виде птицы.

Спасибо за чтение :)