Играем в браузере

Обзорный доклад WEB-спецификаций, которые позволяют создавать игры в браузере

Играем в браузере

Всеволод Шмыров

WSD 28 января 2017

Кто я такой?

Почему такая тема?

Что будет в этом докладе?

Немного теории

Game loop

Anatomy of a video game

requestAnimationFrame (RAF)

            function tick (timestamp) {
              /* recalculate */
              /* redraw */
              requestAnimationFrame(tick);
            }
            requestAnimationFrame(tick);
        
Anatomy of a video game
Tick example

tick

            function tick (timestamp) {
              // ...
              circle.update((timestamp - lastTimeValue) / 1000);
              // ...
            }
            requestAnimationFrame(tick);
        

Circle.update

            // ...
            this._position[0] += (timeDelta * this._speed) * 
               this._direction[0];
            // ...
        

RAF в неактивной вкладке

            document.addEventListener('visibilitychange', function () {
                lastTimeValue = performance.now();
            });
        

Графика

DOM

Использование CSS трасформации

        transform: scaleY(0.5);
        transform: rotate(45deg);
    

Спрайтовая анимация на CSS

            animation: play 0.5s steps(6) infinite;
            /* Изменение свойства background-position в анимации */
        

Canvas

Dirty Rectangles

Dirty Rectangles

Canvas буфер

Несколько слоев

WebGL

Оптимизация 2D через WebGL

Пример NASA

Активные области

SVG

Растеризация вектора

vector

bitmap

Растеризация меток в API

<svg color="{color}"/>

Растеризация SVG

SVG
CANVAS
base64 / BLOB
background-image
Fullscreen example

Fullscreen API

Управление

Клавиатура & мышь

            elem.addEventListener('mousemove', function(event) {
                // do something awesome!
            });
        
Pointer Events example

Сенсорные касания

Сенсорные касания

Gamepad API

Gamepad example

Интерфейс Gamepad API

            var gamepad = navigator.getGamepads()[0];
            var button0 = gp.buttons[0]; /* 0-16 */
            var axe0 = gp.axes[0]; /* 0-3 */
        

Pointer Lock API

Pointer Lock API

            
                canvas.addEventListener('mousemove', function(event) {
                    // Смещение с предыдущего события
                    event.movementX;
                    event.movementY;
                });
            

Звук

Элемент audio

        var myaudio = new Audio("sound_asset.mp3");
        myaudio.play();
    

Элемент audio

        // Текущее положение в аудиофайле
        myaudio.currentTime
        // Громкость
        myaudio.volume
    
Panning example

Web Audio API

Данные

Сохранение игры

slither.io

Web Socket

Неявный Web Socket

Kinect driver
.air app
Web Socket
Pointer Events

Будущее

Будущие интересные спецификации

Спасибо за внимание!

Презентация и примеры
github.com/vsesh/wsd-28-01-2017

Всеволод Шмыров
vsesh.me