Учебник Игры на JavaScript для начинающих
Привет! Если ты хоть раз думал «вот бы самому сделать игру, а не только играть» — этот курс для тебя. Мы начнём с самых азов: разберём, как браузер рисует картинку на canvas, как устроен игровой цикл и почему игры обновляются 60 раз в секунду. Никакого опыта не нужно — достаточно уметь немного писать на JavaScript.
По дороге ты соберёшь три настоящие игры: Понг с мячом и ракетками, Змейку, которая растёт от еды, и платформер с прыжками, гравитацией и камерой, бегущей за героем. Главным героем всех примеров будет наш цыплёнок — ты научишь его бегать, прыгать, собирать монетки и убегать от врагов.
В конце ты соберёшь собственную аркаду из кусочков, сделанных по ходу курса, и выложишь её в интернет, чтобы друзья могли поиграть. Поехали — твоя первая игра уже ближе, чем кажется!
Курс «Игры на JavaScript» состоит из 10 разделов и 40 уроков: Основы игрового движка, Движение и управление, Первая игра — Понг, Коллизии, Змейка, Платформер, Графика и звук, Архитектура игры, Геймдизайн и баланс и Релиз. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Основы игрового движка
- Как делают игры: игровой цикл и FPS
Что такое игровой цикл и FPS, почему игра обновляется 60 раз в секунду и из каких трёх шагов состоит каждый кадр любой игры.
- Canvas и контекст 2D
Подключаем элемент canvas, получаем контекст 2D через getContext и делаем первый шаг к рисованию игровой графики на JavaScript.
- Рисуем спрайты и фигуры
Учимся рисовать прямоугольники, круги и загружать картинку-спрайт цыплёнка на canvas — базовый набор команд для любой игровой графики.
- requestAnimationFrame: сердце игры
Запускаем настоящий игровой цикл через requestAnimationFrame, очищаем кадр и двигаем цыплёнка по экрану — оживляем картинку.
- Как делают игры: игровой цикл и FPS
2 Движение и управление
- Состояние игрока и обновление
Храним координаты и скорость цыплёнка в объекте state и обновляем их каждый кадр — основа движения любого игрового объекта.
- Управление с клавиатуры
Ловим нажатия клавиш через события keydown и keyup и учим цыплёнка двигаться стрелками или WASD без рывков и залипаний.
- Мышь и тач-управление
Получаем координаты мыши и касаний на canvas, переводим их в систему холста и ведём цыплёнка за пальцем или курсором.
- Дельта-время: плавность на любом FPS
Считаем дельта-время между кадрами и умножаем на него скорость, чтобы цыплёнок двигался одинаково и на 30, и на 144 FPS.
- Состояние игрока и обновление
3 Первая игра — Понг
- Понг: мяч и ракетки
Начинаем игру Понг: рисуем две ракетки и мяч, задаём им состояние и заставляем мяч лететь по экрану — каркас первой игры.
- Отскоки и столкновения мяча
Учим мяч отскакивать от стен и ракеток в Понге: меняем знак скорости при ударе и делаем отскок зависимым от точки попадания.
- Счёт и UI
Добавляем в Понг счёт: считаем голы, рисуем цифры на canvas методом fillText и показываем игроку текущий результат матча.
- Простой ИИ-противник
Делаем компьютерного соперника в Понге: ракетка-бот следует за мячом по вертикали, а ограничение скорости даёт ему честный шанс проиграть.
- Понг: мяч и ракетки
4 Коллизии
- AABB: прямоугольные столкновения
Разбираем AABB — проверку пересечения двух прямоугольников по осям: четыре сравнения координат, на которых держатся столкновения в играх.
- Круговые столкновения
Проверяем столкновение двух кругов по расстоянию между центрами и сумме радиусов — точный способ для мячей, монеток и круглых врагов.
- Реакция на столкновение
Что делать после удара: выталкивать объекты из пересечения, останавливать или отражать движение, чтобы цыплёнок не проваливался сквозь стены.
- Оптимизация: пространственная сетка
Когда объектов сотни, проверять всех со всеми дорого: разбиваем мир на сетку ячеек и сравниваем только соседей — ускоряем коллизии.
- AABB: прямоугольные столкновения
5 Змейка
- Сетка и движение змейки
Строим Змейку на сетке клеток: храним тело как список сегментов и двигаем змейку по шагам, добавляя голову и убирая хвост.
- Еда, рост и счёт
Добавляем в Змейку еду в случайной клетке: при поедании змейка растёт, счёт увеличивается, а новая еда не появляется на теле.
- Проигрыш и рестарт
Завершаем Змейку: проигрыш при ударе о стену или о собственное тело, экран Game Over и рестарт игры по нажатию клавиши.
- Сетка и движение змейки
6 Платформер
- Гравитация и прыжок
Начинаем платформер: добавляем цыплёнку гравитацию, вертикальную скорость и прыжок по нажатию — он падает и подпрыгивает как настоящий.
- Платформы и приземление
Делаем платформы, на которые цыплёнок приземляется: проверяем коллизию сверху, останавливаем падение и разрешаем прыжок только с земли.
- Камера за героем
Делаем камеру, которая следует за цыплёнком: сдвигаем всю сцену через translate, чтобы герой оставался в центре большого уровня.
- Тайловые уровни
Описываем уровень массивом чисел и рисуем его из тайлов: меняешь карту в коде — меняется уровень, без перерисовки картинок вручную.
- Сбор предметов и враги
Оживляем уровень: цыплёнок собирает монетки и теряет жизнь от врагов, а прыжок на врага сверху его побеждает — почти готовый платформер.
- Гравитация и прыжок
7 Графика и звук
- Спрайт-листы и анимация персонажа
Анимируем цыплёнка: вырезаем кадры из спрайт-листа методом drawImage и переключаем их по таймеру, чтобы получить бег и прыжок.
- Тайлсеты и параллакс
Делаем красивый фон: рисуем уровень из тайлсета и добавляем параллакс — дальние слои движутся медленнее, создавая ощущение глубины.
- Звук и музыка в игре
Добавляем звук: проигрываем эффекты прыжка и монетки через Audio и запускаем фоновую музыку, не забывая про разрешение от браузера.
- Частицы и эффекты
Делаем сочные эффекты: система частиц для искр от монеток и облачка пыли при прыжке — много мелких спрайтов с короткой жизнью.
- Спрайт-листы и анимация персонажа
8 Архитектура игры
- Игровые состояния
Наводим порядок: разделяем игру на состояния меню, игра, пауза и Game Over и переключаемся между ними по одному правилу.
- Сущности и компоненты (ECS лайт)
Упрощаем код большой игры: описываем объекты как сущности с компонентами-данными вместо длинных классов — лёгкая версия ECS.
- Загрузка ресурсов и прелоадер
Делаем так, чтобы картинки и звуки загрузились до старта: считаем готовые ресурсы и показываем экран загрузки с прогрессом.
- Сохранение прогресса
Сохраняем рекорд и прогресс игрока в localStorage, чтобы лучший счёт цыплёнка не пропал после закрытия вкладки браузера.
- Игровые состояния
9 Геймдизайн и баланс
- Что делает игру весёлой: кор-луп
Разбираем кор-луп — главную петлю действий, ради которой в игру хочется играть снова: цель, действие, награда и снова цель.
- Сложность и кривая обучения
Как настроить сложность, чтобы игра не была ни скучной, ни злой: плавная кривая обучения, поток и постепенный рост вызова для игрока.
- Очки, комбо и обратная связь
Добавляем игре сочную обратную связь: очки, комбо, всплывающие цифры и встряску экрана, чтобы каждое действие игрока чувствовалось приятно.
- Плейтест и итерации
Как проверять игру на живых игроках: смотреть, где они застревают, собирать обратную связь и улучшать игру шаг за шагом, не влюбляясь в первую идею.
- Что делает игру весёлой: кор-луп
10 Релиз
- Адаптив и мобильное управление
Готовим игру к телефону: подгоняем canvas под размер экрана и добавляем экранные кнопки и тач-джойстик, чтобы играть было удобно пальцами.
- Производительность и профилирование
Учим игру не тормозить: находим узкие места через профайлер браузера и убираем лишние рисования, чтобы держать стабильные 60 FPS.
- Финальный проект: своя аркада
Собираем финальную аркаду про цыплёнка из готовых кусков курса: меню, уровни, счёт, звук и сохранение рекорда — твоя законченная игра.
- Публикация игры на itch.io
Выкладываем готовую игру в интернет: упаковываем проект, заливаем на itch.io и оформляем страницу, чтобы друзья могли сыграть по ссылке.
- Адаптив и мобильное управление