-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial Maze_ru
Select your language / Choisissez votre langue / Wählen Sie Ihre Sprache:
English | Français | Deutsch | Italiano | Español | Português | Slovenščina | Українська | Русский
В этом руководстве вы создадите Игру-Лабиринт, где игрок перемещается по коридорам к выходу, избегая препятствий и собирая монеты. Этот классический тип игры идеально подходит для изучения плавного движения, обнаружения столкновений и дизайна уровней.
Что вы узнаете:
- Плавное движение игрока с вводом с клавиатуры
- Обработка столкновений со стенами
- Обнаружение цели (достижение выхода)
- Собираемые предметы
- Простая система таймера
Сложность: Начинающий Пресет: Средний пресет (действие Execute Code, использованное для таймера, не входит в пресет для начинающих)
- Игрок перемещается по лабиринту с помощью клавиш со стрелками
- Стены блокируют движение игрока
- Собирайте монеты для очков
- Достигните выхода, чтобы завершить уровень
- Пройдите лабиринт как можно быстрее!
| Элемент | Назначение |
|---|---|
| Игрок | Персонаж, которым вы управляете |
| Стена | Твёрдые препятствия, блокирующие движение |
| Выход | Цель, завершающая уровень |
| Монета | Собираемые предметы для очков |
| Пол | Визуальный фон (необязательно) |
Все спрайты стен и пола должны быть 32x32 пикселя для создания правильной сетки.
- В Дереве Ресурсов щёлкните правой кнопкой на Sprites и выберите Create Sprite
- Назовите его
spr_player - Нажмите Edit Sprite, чтобы открыть редактор
- Нарисуйте маленького персонажа (круг, человека или форму стрелки)
- Используйте яркий цвет, например синий или зелёный
- Размер: 24x24 пикселя (меньше стен для более лёгкой навигации)
- Нажмите OK для сохранения
- Создайте новый спрайт с именем
spr_wall - Нарисуйте твёрдый узор кирпича или камня
- Используйте серые или тёмные цвета
- Размер: 32x32 пикселя
- Создайте новый спрайт с именем
spr_exit - Нарисуйте дверь, флаг или яркий маркер цели
- Используйте зелёные или золотые цвета
- Размер: 32x32 пикселя
- Создайте новый спрайт с именем
spr_coin - Нарисуйте маленький жёлтый/золотой круг
- Размер: 16x16 пикселей
- Создайте новый спрайт с именем
spr_floor - Нарисуйте простой узор плитки пола
- Используйте светлый нейтральный цвет
- Размер: 32x32 пикселя
![]()
Стена блокирует движение игрока.
- Щёлкните правой кнопкой на Objects и выберите Create Object
- Назовите его
obj_wall - Установите спрайт на
spr_wall - Поставьте галочку "Solid"
- События не нужны

Выход завершает уровень, когда игрок его достигает.
- Создайте новый объект с именем
obj_exit - Установите спрайт на
spr_exit
Событие: Collision with obj_player
- Add Event → Collision → obj_player
- Add Action: Output → Show Message
- Message:
You Win!
- Message:
- Add Action: Room → Next Room (или Restart Room для одного уровня)
Текст Show Message — фиксированная строка, он не может содержать живое значение, например прошедшее время. Таймер остаётся видимым в HUD (Шаг 7) вплоть до победы, так что игрок уже видел своё время.

Монеты добавляют к счёту при сборе.
- Создайте новый объект с именем
obj_coin - Установите спрайт на
spr_coin
Событие: Collision with obj_player
- Add Event → Collision → obj_player
- Add Action: Score → Set Score
- New Score:
10 - Поставьте галочку "Relative" для добавления 10 очков
- New Score:
- Add Action: Instance → Destroy Instance
- Applies to: Self

Игрок плавно двигается с помощью клавиш со стрелками.
- Создайте новый объект с именем
obj_player - Установите спрайт на
spr_player
Добавьте четыре события Keyboard (held) и одно событие No Key, каждое с действием Move → Set Horizontal/Vertical Speed:
| Событие | Действие |
|---|---|
| Keyboard (held) → Right Arrow | Set Horizontal Speed на 4
|
| Keyboard (held) → Left Arrow | Set Horizontal Speed на -4
|
| Keyboard (held) → Down Arrow | Set Vertical Speed на 4
|
| Keyboard (held) → Up Arrow | Set Vertical Speed на -4
|
| Keyboard: No Key | Set Horizontal Speed на 0 и Set Vertical Speed на 0
|
Событие: Collision with obj_wall
- Add Event → Collision →
obj_wall - Add Action: Move → Stop Movement
Здесь не нужен ручной код для проверки позиции. Цикл движения этого
движка уже не даёт экземпляру зайти в твёрдый объект до отрисовки
кадра (obj_wall — Solid), поэтому игрок на самом деле никогда не
перекрывается со стеной — событие столкновения выше просто сбрасывает
оставшуюся скорость, чтобы игрок не "давил" дальше в неё.

Контроллер игры управляет таймером и отображает информацию.
- Создайте новый объект с именем
obj_game_controller - Спрайт не нужен
Событие: Create — запускает таймер с помощью Control → Execute Code (действие Execute Code в этом проекте выполняет настоящий Python, а не GameMaker Language):
self.timer = 0.0Событие: Step — увеличивает его каждый кадр:
self.timer += 1.0 / game.fpsСобытие: Draw — строит HUD с помощью настоящих команд очереди отрисовки. Добавьте три действия Draw → Draw Text:
| Действие Draw Text | Текст | Позиция |
|---|---|---|
| 1. | Score: |
X 10, Y 10
|
| 2. | Time: |
X 10, Y 30
|
| 3. | Coins: |
X 10, Y 50
|
а затем сразу после них три действия Draw → Draw Variable, чтобы показать живые значения рядом с каждой подписью:
| Действие Draw Variable | Переменная | Позиция |
|---|---|---|
| 1. | score |
X 70, Y 10
|
| 2. | self.timer |
X 70, Y 30
|
| 3. | (см. ниже) | X 70, Y 50
|
Встроенного счётчика "оставшихся монет", на который могла бы указывать Draw Variable, нет — прямо перед действиями Draw Variable добавьте ещё одно действие Control → Execute Code, чтобы вычислить его в переменную экземпляра, которую Draw Variable затем сможет прочитать:
self.coins_left = sum(
1 for inst in game.current_room.instances
if inst.object_name == 'obj_coin'
)(затем установите поле Variable 3-го действия Draw Variable на self.coins_left).

- Щёлкните правой кнопкой на Rooms и выберите Create Room
- Назовите её
room_maze - Установите размер комнаты (например, 640x480)
- Включите "Snap to Grid" и установите сетку на 32x32
Постройте свой лабиринт по этим рекомендациям:
- Создайте границу — Окружите комнату стенами
- Постройте коридоры — Создайте пути через лабиринт
- Разместите выход — Поставьте его в конце лабиринта
- Разбросайте монеты — Разместите их вдоль путей
- Разместите игрока — Рядом с входом
- Добавьте контроллер игры — Где угодно (он невидим)
W W W W W W W W W W W W W W W W W W W W
W P . . . . W . . . . . . . W . . . . W
W . W W W . W . W W W W W . W . W W . W
W . W . . . . . . . . . . . . . . W . W
W . W . W W W W W . W W W W W W . W . W
W . . . W . . . . . . . . C . W . . . W
W W W . W . W W W W W W W . . W W W . W
W C . . . . W . . . . . W . . . . . . W
W . W W W W W . W W W . W W W W W W . W
W . . . . . . . . C . . . . . . . . . W
W . W W W W W W W W W . W W W W W W . W
W . . . . . . . . . . . W . . . . . . W
W W W W W W W W W W W . W . W W W W . W
W . . . . . . . . . . . . . W . C . E W
W W W W W W W W W W W W W W W W W W W W
W = Стена P = Игрок E = Выход C = Монета . = Пусто

- Нажмите Run или F5 для тестирования
- Используйте клавиши со стрелками для навигации по лабиринту
- Собирайте монеты для очков
- Найдите выход, чтобы победить!
Создайте простого патрулирующего врага:
- Создайте
spr_enemy(красный цвет, 24x24) - Создайте
obj_enemyсо спрайтомspr_enemy
Событие: Create — Add Action: Move → Start Moving Direction
(Directions: right, Speed: 2)
Событие: Collision with obj_wall — Add Action: Move → Reverse Horizontal (разворачивает врага, когда тот задевает стену — код не нужен; вместе со встроенным твёрдым столкновением из Шага 6.2 враг никогда не сможет пройти сквозь стену)
Событие: Collision with obj_player — Add Action: Room → Restart Room
В событии Create для obj_game_controller добавьте Score →
Set Lives (Value: 3).
В событии Collision with obj_player для obj_enemy замените
Restart Room на два действия: Score → Set Lives (Value:
-1, отмечено Relative), затем Move → Jump to Start
Position (применено к игроку через Applies to: Other), чтобы
игрок возрождался, а не перезапускал весь лабиринт.
Добавьте obj_game_controller ещё одно событие: Other Events →
No More Lives — оно срабатывает автоматически, как только жизни
достигают 0, поэтому проверять это вручную не нужно. Добавьте
Output → Show Message (Game Over!), затем Room →
Restart Game.
- Создайте
obj_key— при столкновении сobj_player: Set Variable (Variable:global.has_key, Value:true, Scope:global), затем Destroy Instance (self). - Создайте
obj_locked_doorс отмеченным Solid. Добавьте ему событие Step с Control → Test Variable (Variable:global.has_key, Value:true, Scope:global) → Instance → Destroy Instance (self) — дверь исчезает (и перестаёт блокировать) сразу после того, как ключ подобран.
- Создайте дополнительные комнаты (
room_maze2,room_maze3) - В
obj_exitиспользуйте действие Next Room вместо Restart Room
Добавьте звуки для:
- Сбора монет
- Достижения выхода
- Касания врагов (если добавлены)
- Фоновая музыка
| Проблема | Решение |
|---|---|
| Игрок проходит сквозь стены | Проверьте, что у obj_wall отмечен "Solid" |
| Игрок застревает в стенах | Убедитесь, что спрайт игрока меньше промежутков между стенами |
| Монеты не исчезают | Проверьте, что событие столкновения уничтожает Self, а не Other |
| Таймер не работает | Убедитесь, что контроллер игры размещён в комнате |
| Движение кажется дёрганым | Настройте значение скорости в действиях Set Horizontal/Vertical Speed (попробуйте 3-5) |
Поздравляем! Вы создали игру-лабиринт! Вы узнали:
- Плавное движение — Проверка состояния нажатых клавиш для непрерывного движения
- Встроенное твёрдое столкновение — Стены автоматически блокируют движение, когда отмечены как Solid, без ручного кода для проверки позиции
- Собираемые предметы — Создание предметов, увеличивающих счёт и исчезающих
- Система таймера — Отслеживание времени с помощью переменных экземпляра
- Дизайн уровней — Создание проходимых макетов лабиринтов
- Гонка со Временем — Добавьте таймер обратного отсчёта. Достигните выхода до истечения времени!
- Идеальный Счёт — Требуйте собрать все монеты перед открытием выхода
- Случайный Лабиринт — Исследуйте процедурную генерацию лабиринтов
- Туман Войны — Показывайте только область вокруг игрока
- Миникарта — Отображайте маленький обзор лабиринта
- Руководства — Больше игровых руководств
- Средний пресет — Обзор пресета, необходимого для этого руководства
- Руководство: Pong — Создайте игру на двух игроков
- Руководство: Breakout — Создайте игру с разбиванием кирпичей
- Руководство: Sokoban — Создайте головоломку с перемещением ящиков
- Справочник Событий — Полная документация событий