Первая игра: пошагово
Рабочий эталон — examples/canvas-demo: состояние сеанса, цель, десять попаданий, подсчёт и итог.
Шаг 1. Представление
Откройте index.html через локальный HTTP-сервер. Canvas имеет логические размеры 960×540, но масштабируется CSS. Измените рисунок в draw(), не меняя правила подключения. Размер полотна контроллера берётся из target_profile, а не из пикселей Canvas.
Шаг 2. Состояние
Кнопка нового сеанса создаёт новый mock-клиент и удаляет старые подписки. session.start задаёт отсчёт; пока отсчёт не закончился, попадания не учитываются. Пауза останавливает игровой таймер, но SDK продолжает heartbeat. Потеря связи переводит интерфейс в остановленное состояние.
Шаг 3. Попадание и завершение
Обработчик проверяет активность, countdown и shot_id, преобразует координату, затем начисляет очки. После десятого события отправляет один session.complete. duration_ms считает активное игровое время без паузы. Счёт и количество событий передаются целыми числами.
Шаг 4. Ваша механика
Заменяйте resolve score и отрисовку, но сохраняйте защиту от двойного результата, dispose подписок и реакцию на остановку. Проверьте паузу перед первым попаданием, в середине отсчёта и перед последним выстрелом. Учебный пример не содержит калибровку или управление лицензией.