Играем в браузере
Всеволод Шмыров
Кто я такой?
• Меня зовут Сева
Кто я такой?
• Меня зовут Сева
• Разработчик интерфейсов в Яндексе
Кто я такой?
• Меня зовут Сева
• Разработчик интерфейсов в Яндексе
• В прошлом flash-разработчик игр
Кто я такой?
• Меня зовут Сева
• Разработчик интерфейсов в Яндексе
• В прошлом flash-разработчик игр
• Игры - мое хобби
Почему такая тема?
• Внешние плагины вымирают
Почему такая тема?
• Внешние плагины вымирают
• Больше возможностей в браузерах
Что будет в докладе?
• WEB-спецификации
Что будет в докладе?
• WEB-спецификации
• Живые примеры!
Что будет в докладе?
• WEB-спецификации
• Живые примеры!
• Совсем чуть-чуть кода
Что будет в докладе?
• WEB-спецификации
• Живые примеры!
• Совсем чуть-чуть кода
• 2D
Немного теории
Game loop
requestAnimationFrame (RAF)
function tick (timestamp) {
/* recalculate & redraw */
requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
Example time!
clck.ru/B9LbZ
requestAnimationFrame
// ...
gameObject.update(
timestamp - lastTimeValue
);
// ...
requestAnimationFrame
// ...
position[0] += (timeDelta * speed) *
direction[0];
// ...
Графика
HTML & CSS
• position: absolute
• image & background-image: url()
• transform & filters
• transition & animation
CSS трансорфмации
transform: scaleY(0.5);
transform: rotate(45deg);
requestAnimationFrame
animation: play 0.5s steps(6) infinite;
Example time!
clck.ru/B9Lbu
Canvas
• "Честный" API отображения графики
• Больший контроль
Dirty Rectangles
Dirty Rectangles
Canvas буфер
Несколько слоев
WebGL
• Низкоуровневое API работы с графикой
• 3D в браузере
2D через WebGL
Активные области
SVG
• Подходит для любого DPR
SVG
• Подходит для любого DPR
• Меньший объем данных
SVG
• Подходит для любого DPR
• Меньший объем данных
• Невысокая производительность
Растрезация вектора
Растрезация вектора
Example time!
clck.ru/B9LcG
Fullscreen API
• Разворачивает элемент во весь экран
Fullscreen API
• Разворачивает элемент во весь экран
• Различия в реализации
Fullscreen API
• Разворачивает элемент во весь экран
• Различия в реализации
• Только по действию пользователя
Управление
Управление
• Клавиатура и мышь
Управление
• Клавиатура и мышь
• Сенсорные касания
Управление
• Клавиатура и мышь
• Сенсорные касания
• Геймпад
Сенсорные касания
Touch Events Pointer Events
Example time!
clck.ru/B9LcY
Gamepad API
• Получение состояние геймпадов
Gamepad API
• Получение состояние геймпадов
• Нажатие кнопок, положение стиков
Gamepad API
• Получение состояние геймпадов
• Нажатие кнопок, положение стиков
• Странный интерфейс
Example time!
clck.ru/B9Lcn
Gamepad API
var gp = navigator.getGamepads()[0];
var button0 = gp.buttons[0]; /* 0-16 */
var axe0 = gp.axes[0]; /* 0-3 */
PointerLock API
• Никак не связан с Pointer Events
PointerLock API
• Никак не связан с Pointer Events
• Очень похож на Fullscreen API
PointerLock API
• Никак не связан с Pointer Events
• Очень похож на Fullscreen API
• Но работает с курсором
Звук
Звук
var audio = new Audio("sound_asset.mp3");
audio.play();
Звук
var audio = new Audio("sound_asset.mp3");
audio.play();
Звук
// Текущее положение в аудиофайле
myaudio.currentTime
// Громкость
myaudio.volume
Звук
// Текущее положение в аудиофайле
myaudio.currentTime
// Громкость
myaudio.volume
Example time!
clck.ru/B9LdR
Web audio API
• API для обработки потокового звука
Web audio API
• API для обработки потокового звука
• Позволяет генерировать звук
Web audio API
• API для обработки потокового звука
• Позволяет генерировать звук
• Очень большая спецификация
Данные
Данные
• Локальные хранилища
– localStorage, indexedDB
• Обращение к серверу
– XHR, fetch
Данные
• Локальные хранилища
– localStorage, indexedDB
• Обращение к серверу
– XHR, fetch
slither.io
Web Socket
• Постоянное соединение
Web Socket
• Постоянное соединение
• Двухсторонняя связь
Web Socket
• Постоянное соединение
• Двухсторонняя связь
• Множество готовы решений
Будущее
А что дальше?
• Web animation API
• WebRTC
• Payment Request API
• Web VR API
• Bluetooth API
Спасибо за внимание!
Полезные материалы
Примеры из доклада
clck.ru/B9L9v
vsesh.me

Playing in the browser