Гид по технологиям

Механика прыжков в платформере на Python (Arcade)

5 min read Разработка игр Обновлено 04 Jan 2026
Прыжки в платформере на Python (Arcade)
Прыжки в платформере на Python (Arcade)

Марио стоит на деревянном полу, руки подняты

В платформерах механика прыжков определяет ощущение игры — от плавности до сложности. На Python с библиотекой Arcade можно быстро прототипировать разные виды прыжков и тестировать, что лучше подходит для вашей игры.

О чём эта статья

Здесь вы найдёте готовые примеры и объяснения:

  • как настроить простую сцену с платформой и гравитацией;
  • как добавить одиночный и двойной прыжок;
  • как сделать переменную высоту прыжка и воздушный рывок;
  • рекомендации по балансу, обратной связи и отладке.

Важно: все примеры минималистичны — они показывают идею. В реальной игре добавляйте спрайты, анимации и обработку столкновений более аккуратно.

Быстрая настройка

Убедитесь, что pip установлен, затем установите модуль arcade:

pip install arcade

Кодовые примеры в статье можно использовать как отправную точку и дорабатывать под конкретную архитектуру проекта.

Создание простой игры

Ниже простой пример: игрок, гравитация и одна статичная платформа. Создайте файл simple-game.py и вставьте код:

import arcade  
  
SCREEN_WIDTH = 800  
SCREEN_HEIGHT = 600  
PLAYER_RADIUS = 20  
PLATFORM_WIDTH = 200  
PLATFORM_HEIGHT = 20  
GRAVITY = 0.5  
blue = arcade.color.BLUE  
green = arcade.color.GREEN  
  
classGameWindow(arcade.Window):  
def__init__(self):  
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "Jumping Mechanics")  
self.player_x = SCREEN_WIDTH // 2  
self.player_y = SCREEN_HEIGHT // 2  
self.player_dy = 0  
self.platform_x = SCREEN_WIDTH // 2  
self.platform_y = SCREEN_HEIGHT // 4  
  
defon_draw(self):  
arcade.start_render()  
  
arcade.draw_circle_filled(self.player_x, self.player_y,   
PLAYER_RADIUS, blue)  
  
arcade.draw_rectangle_filled(self.platform_x, self.platform_y,   
PLATFORM_WIDTH, PLATFORM_HEIGHT, green)  
  
defon_update(self, delta_time):  
self.player_dy -= GRAVITY  
self.player_y += self.player_dy  
dist = PLAYER_RADIUS + self.platform_y + PLATFORM_HEIGHT / 2  
  
if self.player_y < dist:  
self.player_y = dist  
self.player_dy = 0  
  
game = GameWindow()  
arcade.run()

При запуске игрок упадёт на платформу и остановится на её поверхности.

Простая сцена: платформа и игрок, стоящий на ней

Добавление простого прыжка

Добавим обработку нажатия клавиши вверх и проверку соприкосновения с платформой. Создайте jump.py и обновите логику:

classGameWindow(arcade.Window):  
def__init__(self):  
# ...  
  
defon_key_press(self, key, modifiers):  
on_ground =  PLAYER_RADIUS + self.platform_y + PLATFORM_HEIGHT / 2  
  
if key == arcade.key.UP and self.player_y == on_ground:  
self.player_dy = 10  
  
defon_update(self, delta_time):  
self.player_dy -= GRAVITY  
self.player_y += self.player_dy  
dist = PLAYER_RADIUS + self.platform_y + PLATFORM_HEIGHT / 2  
  
if self.player_y < dist:  
self.player_y = dist  
self.player_dy = 0  
self.jump_count = 0

Совет: сравнение координат напрямую (==) удобно в простых примерах, но в реальных проектах лучше сравнивать с допуском (погрешностью) из-за числовых ошибок.

Добавление двойного прыжка

Чтобы разрешить второй прыжок в воздухе, отслеживайте количество совершённых прыжков. В файле double-jump.py добавьте счётчик:

classGameWindow(arcade.Window):  
def__init__(self):  
self.jump_count = 0# Track the number of jumps  
  
defon_key_press(self, key, modifiers):  
on_ground =  PLAYER_RADIUS + self.platform_y + PLATFORM_HEIGHT / 2  
  
if key == arcade.key.UP:  
if self.player_y == on_ground or self.jump_count < 2:  
self.player_dy = 10  
self.jump_count += 1  

Важно: счётчик нужно обнулять при касании земли. В примерах выше это делается в on_update при падении на платформу.

Переменная высота прыжка

Переменная высота прыжка позволяет игроку контролировать, насколько высоко он прыгает, удерживая кнопку. Пример в variable-jump.py:

GRAVITY = 0.5  
JUMP_POWER_INCREMENT = 0.2  
MAX_JUMP_POWER = 100  
  
classGameWindow(arcade.Window):  
def__init__(self):  
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "Jumping Mechanics")  
self.jump_pressed = False  
self.jump_power = 0  
  
defon_key_press(self, key, modifiers):  
on_ground =  PLAYER_RADIUS + self.platform_y + PLATFORM_HEIGHT / 2  
  
if key == arcade.key.UP and self.player_y == on_ground:  
self.jump_pressed = True  
  
defon_key_release(self, key, modifiers):  
if key == arcade.key.UP:  
self.jump_pressed = False  
  
defupdate_jump_power(self):  
# Increase the jump power while the jump button is held  
if self.jump_pressed:  
self.jump_power += JUMP_POWER_INCREMENT  
  
if self.jump_power > MAX_JUMP_POWER:  
self.jump_power = MAX_JUMP_POWER  
else:  
if self.jump_power > 0:  
self.jump_power -= 1  
  
defon_update(self, delta_time):  
self.player_dy -= GRAVITY  
dist = PLAYER_RADIUS + self.platform_y + PLATFORM_HEIGHT / 2  
  
if self.player_y == dist and self.jump_power > 0:  
self.player_dy = self.jump_power  
  
self.player_y += self.player_dy  
self.update_jump_power()

Примечание: порог и инкременты настраивайте экспериментально — для «чувства» управления важны маленькие шаги настройки.

Воздушный рывок (air dash)

Air dash даёт дополнительную мобильность в воздухе. Пример в air-dash.py:

AIR_DASH_DISTANCE = 100  
MAX_AIR_DASHES = 2  
  
classGameWindow(arcade.Window):  
def__init__(self):  
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "Jumping Mechanics")  
self.on_ground = False  
self.air_dashes = 0  
self.can_air_dash = True  
  
defon_key_press(self, key, modifiers):  
if key == arcade.key.UP and self.on_ground:  
self.player_dy = 10  
elif key == arcade.key.UP and \  
self.air_dashes < MAX_AIR_DASHES and \  
self.can_air_dash:  
self.player_dx = AIR_DASH_DISTANCE    
self.air_dashes += 1  
self.can_air_dash = False  
  
defon_update(self, delta_time):  
self.player_dy -= GRAVITY  
self.player_y += self.player_dy  
  
dist = PLAYER_RADIUS + self.platform_y + PLATFORM_HEIGHT / 2  
  
if self.player_y <= dist:  
self.player_y = dist  
self.player_dy = 0  
self.on_ground = True  
else:  
self.on_ground = False  
  
self.player_x += self.player_dx  
  
if self.player_x < PLAYER_RADIUS:  
self.player_x = PLAYER_RADIUS  
self.player_dx = 0  
elif self.player_x > SCREEN_WIDTH - PLAYER_RADIUS:  
self.player_x = SCREEN_WIDTH - PLAYER_RADIUS  
self.player_dx = 0  
  
if self.on_ground:  
self.air_dashes = 0  
self.can_air_dash = True

Игрок выполняет воздушный рывок вдали от платформы

Air dash может ломать баланс, если дистанция и перезарядка не откалиброваны — используйте ограничения и визуальную подсказку перед рывком.

Лучшие практики и рекомендации

Баланс высоты и продолжительности прыжка

  • Начинайте с небольших значений скорости и gravity (например, GRAVITY = 0.5, стартовый дельта-скорость прыжка 8–12).
  • Тестируйте прыжки в контексте уровней — слишком высокий прыжок упрощает прохождение, слишком низкий делает платформы недостижимыми.
  • Подбирайте значения под темп вашей игры: аркадный стиль требует более «отрывистых» прыжков, симулятор — более «тяжёлой» физики.

Визуальная и звуковая обратная связь

  • Добавьте анимацию отталкивания и приземления, частицы пыли при касании земли и короткие звуки прыжка/приземления.
  • Малые звуковые и графические эффекты делают прыжок более «весомым».

Точные пересчёты и устойчивость столкновений

  • Избегайте проверки равенства координат (==) для определения, на земле ли игрок. Лучше использовать диапазон погрешности: abs(player_y - ground_y) < eps.
  • Для спрайтов используйте встроенные механизмы Arcade для столкновений (arcade.check_for_collision_with_list) или собственные AABB/OTV-алгоритмы.

Тестирование и отладка

  • Разрабатывайте набор простых уровней для тестов: широкая платформа, узкая платформа, движущаяся платформа, стены.
  • Задайте тест-кейсы: прыжок с полной и короткой задержкой, двойной прыжок сразу после первого, попытка air dash в стену.

Когда это не работает или противопоказано

  • Если ваша игра рассчитана на точный тайминг (изометрические пазлы), сложные механики как двойной прыжок или air dash могут размыть дизайн.
  • В проектах с реалистичной физикой переменная высота прыжка может казаться нелогичной; выбирайте механику, исходя из жанра.

Альтернативные подходы

  • Использовать физический движок (Box2D/pybox2d) для реалистичных столкновений и отклонений.
  • Переключиться на спрайтовую платформу с преднастроенными коридорами движения (lane-based), где прыжок ограничен заранее определёнными позициями.

Набор правил-эвристик для настройки прыжков

  • Эвристика 1: время в воздухе должно соответствовать скорости уровня. Для медленной игры время полёта выше.
  • Эвристика 2: добавьте «время мягкой земли» — короткий интервал (~0.1 с), когда игрок всё ещё может прыгнуть, даже если чуть коснулся края.
  • Эвристика 3: когда ввод противоречив (удар по клавише в момент касания), отдайте преимущество игроку — это улучшает отзывчивость.

Чеклист перед выпуском

  • Проверить касания краёв платформ с разной скоростью падения.
  • Убедиться, что двойной прыжок нельзя выполнить бесконечно.
  • Добавить аудио/визуальные подсказки для air dash.
  • Протестировать на разных разрешениях и соотношениях сторон.

Краткое руководство по отладке

  1. Включите отладочный вывод позиции и скорости игрока.
  2. Прогоняйте сценарии: быстрый прыжок, медленный прыжок, прыжок у стены.
  3. Исправляйте погрешности сравнения координат и коллизий.

Глоссарий (одно предложение для каждого термина)

  • Гравитация — постоянное смещение вертикальной скорости вниз, моделирует притяжение;
  • Air dash — однократный горизонтальный рывок в воздухе, даёт мобильность;
  • Переменная высота прыжка — механика, где длительность удержания кнопки влияет на силу отталкивания;
  • Double jump — разрешение на совершение второго прыжка без касания земли.

Итог

Прыжки задают характер платформера. Начните с простой физики и постепенно добавляйте возможности: двойной прыжок, переменную высоту и air dash. Тестируйте на уровнях, давайте игроку визуальную и звуковую обратную связь и аккуратно балансируйте параметры, чтобы механика ощущалась отзывчивой и справедливой.

Важно: применяйте описанные примеры как отправную точку — интеграция в реальный проект обычно требует доработки столкновений, анимаций и управления вводом.

Ключевые выводы:

  • Настройте базовую физику и точную проверку контакта с землёй;
  • Используйте счётчики и флаги для контроля двойных прыжков и air dash;
  • Дорабатывайте обратную связь игрока (звук, частицы, анимация);
  • Тестируйте на разнообразных уровнях и устройствах.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство