Skip to content

Tutorial Maze_ru

Gabe1290 edited this page Sep 10, 2026 · 3 revisions

Руководство: Создание Игры-Лабиринта

Select your language / Choisissez votre langue / Wählen Sie Ihre Sprache:

English | Français | Deutsch | Italiano | Español | Português | Slovenščina | Українська | Русский


Введение

В этом руководстве вы создадите Игру-Лабиринт, где игрок перемещается по коридорам к выходу, избегая препятствий и собирая монеты. Этот классический тип игры идеально подходит для изучения плавного движения, обнаружения столкновений и дизайна уровней.

Что вы узнаете:

  • Плавное движение игрока с вводом с клавиатуры
  • Обработка столкновений со стенами
  • Обнаружение цели (достижение выхода)
  • Собираемые предметы
  • Простая система таймера

Сложность: Начинающий Пресет: Средний пресет (действие Execute Code, использованное для таймера, не входит в пресет для начинающих)


Шаг 1: Понять Игру

Правила Игры

  1. Игрок перемещается по лабиринту с помощью клавиш со стрелками
  2. Стены блокируют движение игрока
  3. Собирайте монеты для очков
  4. Достигните выхода, чтобы завершить уровень
  5. Пройдите лабиринт как можно быстрее!

Что Нам Нужно

Элемент Назначение
Игрок Персонаж, которым вы управляете
Стена Твёрдые препятствия, блокирующие движение
Выход Цель, завершающая уровень
Монета Собираемые предметы для очков
Пол Визуальный фон (необязательно)

Шаг 2: Создать Спрайты

Все спрайты стен и пола должны быть 32x32 пикселя для создания правильной сетки.

2.1 Спрайт Игрока

  1. В Дереве Ресурсов щёлкните правой кнопкой на Sprites и выберите Create Sprite
  2. Назовите его spr_player
  3. Нажмите Edit Sprite, чтобы открыть редактор
  4. Нарисуйте маленького персонажа (круг, человека или форму стрелки)
  5. Используйте яркий цвет, например синий или зелёный
  6. Размер: 24x24 пикселя (меньше стен для более лёгкой навигации)
  7. Нажмите OK для сохранения

2.2 Спрайт Стены

  1. Создайте новый спрайт с именем spr_wall
  2. Нарисуйте твёрдый узор кирпича или камня
  3. Используйте серые или тёмные цвета
  4. Размер: 32x32 пикселя

2.3 Спрайт Выхода

  1. Создайте новый спрайт с именем spr_exit
  2. Нарисуйте дверь, флаг или яркий маркер цели
  3. Используйте зелёные или золотые цвета
  4. Размер: 32x32 пикселя

2.4 Спрайт Монеты

  1. Создайте новый спрайт с именем spr_coin
  2. Нарисуйте маленький жёлтый/золотой круг
  3. Размер: 16x16 пикселей

2.5 Спрайт Пола (Необязательно)

  1. Создайте новый спрайт с именем spr_floor
  2. Нарисуйте простой узор плитки пола
  3. Используйте светлый нейтральный цвет
  4. Размер: 32x32 пикселя

The Sprite Editor with spr_player open (24x24), origin centered; spr_player, spr_wall, spr_exit, spr_coin and spr_floor in the resource tree


Шаг 3: Создать Объект Стены

Стена блокирует движение игрока.

  1. Щёлкните правой кнопкой на Objects и выберите Create Object
  2. Назовите его obj_wall
  3. Установите спрайт на spr_wall
  4. Поставьте галочку "Solid"
  5. События не нужны

obj_wall's Object Events panel: empty -- Solid checked is all it needs


Шаг 4: Создать Объект Выхода

Выход завершает уровень, когда игрок его достигает.

  1. Создайте новый объект с именем obj_exit
  2. Установите спрайт на spr_exit

Событие: Collision with obj_player

  1. Add Event → Collision → obj_player
  2. Add Action: OutputShow Message
    • Message: You Win!
  3. Add Action: RoomNext Room (или Restart Room для одного уровня)

Текст Show Message — фиксированная строка, он не может содержать живое значение, например прошедшее время. Таймер остаётся видимым в HUD (Шаг 7) вплоть до победы, так что игрок уже видел своё время.

obj_exit's Object Events panel: a Collision with obj_player event holding Show Message and Next Room


Шаг 5: Создать Объект Монеты

Монеты добавляют к счёту при сборе.

  1. Создайте новый объект с именем obj_coin
  2. Установите спрайт на spr_coin

Событие: Collision with obj_player

  1. Add Event → Collision → obj_player
  2. Add Action: ScoreSet Score
    • New Score: 10
    • Поставьте галочку "Relative" для добавления 10 очков
  3. Add Action: InstanceDestroy Instance
    • Applies to: Self

obj_coin's Object Events panel: a Collision with obj_player event holding Set Score (Relative) and Destroy Instance


Шаг 6: Создать Объект Игрока

Игрок плавно двигается с помощью клавиш со стрелками.

  1. Создайте новый объект с именем obj_player
  2. Установите спрайт на spr_player

6.1 Движение

Добавьте четыре события Keyboard (held) и одно событие No Key, каждое с действием MoveSet 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

6.2 Остановка у Стен

Событие: Collision with obj_wall

  1. Add Event → Collision → obj_wall
  2. Add Action: MoveStop Movement

Здесь не нужен ручной код для проверки позиции. Цикл движения этого движка уже не даёт экземпляру зайти в твёрдый объект до отрисовки кадра (obj_wall — Solid), поэтому игрок на самом деле никогда не перекрывается со стеной — событие столкновения выше просто сбрасывает оставшуюся скорость, чтобы игрок не "давил" дальше в неё.

obj_player's Object Events panel: Keyboard (held) with four Set Speed actions, Keyboard <No Key> with two, and Collision with obj_wall (Stop Movement)


Шаг 7: Создать Контроллер Игры

Контроллер игры управляет таймером и отображает информацию.

  1. Создайте новый объект с именем obj_game_controller
  2. Спрайт не нужен

Событие: Create — запускает таймер с помощью ControlExecute Code (действие Execute Code в этом проекте выполняет настоящий Python, а не GameMaker Language):

self.timer = 0.0

Событие: Step — увеличивает его каждый кадр:

self.timer += 1.0 / game.fps

Событие: Draw — строит HUD с помощью настоящих команд очереди отрисовки. Добавьте три действия DrawDraw Text:

Действие Draw Text Текст Позиция
1. Score: X 10, Y 10
2. Time: X 10, Y 30
3. Coins: X 10, Y 50

а затем сразу после них три действия DrawDraw 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 добавьте ещё одно действие ControlExecute 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).

obj_game_controller's Object Events panel: Create and Step (each an Execute Code action) plus Draw (three Draw Text, one Execute Code, three Draw Variable -- seven actions), with no sprite set


Шаг 8: Спроектируйте Свой Лабиринт

  1. Щёлкните правой кнопкой на Rooms и выберите Create Room
  2. Назовите её room_maze
  3. Установите размер комнаты (например, 640x480)
  4. Включите "Snap to Grid" и установите сетку на 32x32

Размещение Объектов

Постройте свой лабиринт по этим рекомендациям:

  1. Создайте границу — Окружите комнату стенами
  2. Постройте коридоры — Создайте пути через лабиринт
  3. Разместите выход — Поставьте его в конце лабиринта
  4. Разбросайте монеты — Разместите их вдоль путей
  5. Разместите игрока — Рядом с входом
  6. Добавьте контроллер игры — Где угодно (он невидим)

Пример Макета Лабиринта

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 = Монета    . = Пусто

The Room Editor for room_maze: a full slate wall border with maze corridors, the blue player at the top-left entrance, four gold coins along the paths, the green exit at the bottom-right, and the obj_game_controller marker on a corridor cell


Шаг 9: Протестируйте Свою Игру!

  1. Нажмите Run или F5 для тестирования
  2. Используйте клавиши со стрелками для навигации по лабиринту
  3. Собирайте монеты для очков
  4. Найдите выход, чтобы победить!

Улучшения (Необязательно)

Добавить Врагов

Создайте простого патрулирующего врага:

  1. Создайте spr_enemy (красный цвет, 24x24)
  2. Создайте obj_enemy со спрайтом spr_enemy

Событие: Create — Add Action: MoveStart Moving Direction (Directions: right, Speed: 2)

Событие: Collision with obj_wall — Add Action: MoveReverse Horizontal (разворачивает врага, когда тот задевает стену — код не нужен; вместе со встроенным твёрдым столкновением из Шага 6.2 враг никогда не сможет пройти сквозь стену)

Событие: Collision with obj_player — Add Action: RoomRestart Room

Добавить Систему Жизней

В событии Create для obj_game_controller добавьте ScoreSet Lives (Value: 3).

В событии Collision with obj_player для obj_enemy замените Restart Room на два действия: ScoreSet Lives (Value: -1, отмечено Relative), затем MoveJump to Start Position (применено к игроку через Applies to: Other), чтобы игрок возрождался, а не перезапускал весь лабиринт.

Добавьте obj_game_controller ещё одно событие: Other EventsNo More Lives — оно срабатывает автоматически, как только жизни достигают 0, поэтому проверять это вручную не нужно. Добавьте OutputShow Message (Game Over!), затем RoomRestart Game.

Добавить Ключи и Запертые Двери

  1. Создайте obj_key — при столкновении с obj_player: Set Variable (Variable: global.has_key, Value: true, Scope: global), затем Destroy Instance (self).
  2. Создайте obj_locked_door с отмеченным Solid. Добавьте ему событие Step с ControlTest Variable (Variable: global.has_key, Value: true, Scope: global) → InstanceDestroy Instance (self) — дверь исчезает (и перестаёт блокировать) сразу после того, как ключ подобран.

Добавить Несколько Уровней

  1. Создайте дополнительные комнаты (room_maze2, room_maze3)
  2. В obj_exit используйте действие Next Room вместо Restart Room

Добавить Звуковые Эффекты

Добавьте звуки для:

  • Сбора монет
  • Достижения выхода
  • Касания врагов (если добавлены)
  • Фоновая музыка

Устранение Неполадок

Проблема Решение
Игрок проходит сквозь стены Проверьте, что у obj_wall отмечен "Solid"
Игрок застревает в стенах Убедитесь, что спрайт игрока меньше промежутков между стенами
Монеты не исчезают Проверьте, что событие столкновения уничтожает Self, а не Other
Таймер не работает Убедитесь, что контроллер игры размещён в комнате
Движение кажется дёрганым Настройте значение скорости в действиях Set Horizontal/Vertical Speed (попробуйте 3-5)

Что Вы Узнали

Поздравляем! Вы создали игру-лабиринт! Вы узнали:

  • Плавное движение — Проверка состояния нажатых клавиш для непрерывного движения
  • Встроенное твёрдое столкновение — Стены автоматически блокируют движение, когда отмечены как Solid, без ручного кода для проверки позиции
  • Собираемые предметы — Создание предметов, увеличивающих счёт и исчезающих
  • Система таймера — Отслеживание времени с помощью переменных экземпляра
  • Дизайн уровней — Создание проходимых макетов лабиринтов

Идеи для Вызовов

  1. Гонка со Временем — Добавьте таймер обратного отсчёта. Достигните выхода до истечения времени!
  2. Идеальный Счёт — Требуйте собрать все монеты перед открытием выхода
  3. Случайный Лабиринт — Исследуйте процедурную генерацию лабиринтов
  4. Туман Войны — Показывайте только область вокруг игрока
  5. Миникарта — Отображайте маленький обзор лабиринта

Смотрите Также

Clone this wiki locally