Как сделать игру марио самому

4 способа сделать игру Mario на вашем компьютере

Пока существовал Интернет, были игры от Марио, сделанные фанатами. Из сложных пользовательских игр

кроссоверы с другими персонажами Nintendo

возможно, на Земле нет игр, которые вдохновили бы столько фанатских творений, как Марио.

Такого рода вдохновение — именно то, что Nintendo надеется использовать в Super Mario Maker, своей новой игре для Wii U, которая позволит вам создавать свои собственные уровни.

Но вот в чем дело: Super Mario Maker — не первый создатель уровня Mario. Несколько фанатских инструментов позволяют вам делать то же самое прямо на вашем компьютере. Есть, конечно, не одобренные Nintendo, но все же это весело. Вот несколько стоит проверить.

Super Mario NES Builder: воссоздайте оригинал

После 30 долгих лет, оригинальный Super Mario Bros остается культовым и не может быть улучшен. С Super Mario NES Builder у вас есть шанс попробовать.

Super Mario NES Builder — это созданная фанатами программа, которую вы можете использовать для создания собственных уровней Mario в стиле первой игры Super Mario. Еще лучше: он поставляется с полным воссозданием этой оригинальной игры, так что вы можете использовать эти оригинальные уровни в качестве отправной точки, что может быть полезно, если вы точно знаете, с чего начать.

Как и все, что позволяет людям создавать вещи в Интернете, по крайней мере один человек использовал это программное обеспечение, чтобы предложить:

Если вам нужно вдохновение, вы найдете несколько наборов уровней от других поклонников на веб-сайте программы. Дайте нам знать, какой вам нравится больше, хорошо?

Mario Builder: еще много чего

Mario Builder похож на Super Mario NES Builder, но содержит больше… вещей. Вы найдете элементы из нескольких разных игр Mario, все в одном месте, что позволит вам создать хаос, который соответствует духу Mario Maker на Wii U.

Вокруг этой игры есть специальное сообщество, так что вы найдете много помощи и идей.

Лунная магия: взломать оригинальный мир Супер Марио

Взлом ROM, для меня, является загадкой. Тратить время на изучение кода древних игр, чтобы вы могли создавать свои собственные уровни, — это героический уровень усилий, но люди делают это. Другие люди тратят еще больше времени на создание инструментов, облегчающих взлом, и Lunar Magic — один из таких инструментов.

Этот инструмент, впервые выпущенный в 2000 году, был обновлен совсем недавно, в 2012 году, и даже включает в себя встроенный эмулятор для тестирования ваших творений. Поскольку это полноценный ROM-хакер, вы можете создавать всевозможные вещи, которые некоторые другие не могут.

Если вы когда-либо хотели создать свой собственный взгляд на Super Mario World, это инструмент, который вы должны использовать.

К сожалению, невозможно найти легальные ПЗУ для коммерческих игр в Интернете, поэтому эта программа совершенно бесполезна. (Не спрашивайте в комментариях: я не могу вам помочь. Если бы был какой-то механизм, способный выполнять поиск в Интернете, вы могли бы найти такие вещи самостоятельно).

Редактор Реджи-уровня: создай свой собственный уровень Wii

Если вы фанат Mario и имеете Wii, вам нужно сыграть в Newer Super Mario Bros, самую лучшую фанатскую игру для Wii

, Это полный взлом Nintendo New Super Mario Bros Wii с полным набором уровней (некоторые из которых конкурируют с собственными Nintendo).

Эта игра и многие другие хаки Mario были созданы с использованием редактора уровней Реджи, который является удивительно полным инструментом для создания собственных уровней в New Super Mario Bros.

Вам понадобится розничная копия New Super Mario Bros для Wii, чтобы использовать Reggie или играть в любые игры, созданные с его помощью. Вам также необходимо изменить Wii для HomeBrew

для того, чтобы играть в игры на своем Wii, что является удивительно безболезненным процессом.

Что бы вы положили на свой уровень Марио?

это долго, но это также ряд безумно популярных игр. Как давний поклонник Nintendo, я надеюсь, что Super Mario Maker станет большим хитом для компании — хотя бы потому, что это будет означать бесконечный поток новых уровней Mario для владельцев Wii U.

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

Я хочу знать: какой уровень вы создадите? Давайте поговорим подробнее в комментариях ниже.

Источник

Пишем игру-клон Super Mario Brothers (часть 1)

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самомуДля многих из нас Super Mario Brothers была первой игрой, которая по-настоящему завораживала своим игровым процессом.
Интуитивное управление SMB и великолепный дизайн уровней от Nintendo заставляли проводить часы напролет в виртуальной вселенной сантехника и его напарника.

В этом чудесном туториале от Джейкоба Гандерсена мы создадим собственный платформер; но, так как главным героем будет Коала, мы назовем нашу игру «Super Koalio Brothers!» ;]
Также, чтобы упростить механику, мы забудем о движущихся врагах. Вместо них мы будем использовать шипованные блоки, встроенные в пол. Это позволит нам полностью сконцентрироваться на сердце платформера — физическом движке.

Внимание! Под катом невероятное количество переведенного текста, картинок, кода (код не переведен) и руководство по созданию собственного физического движка!

Этот туториал заранее подразумевает, что Вы знакомы с основами программирования на Cocos2D. Иначе, я настоятельно рекомендую сначала ознакомиться с парой-тройкой начальных уроков на сайте Рея.

Начнем

Для начала скачайте стартовый проект для этого туториала. Распакуйте его, откройте в Xcode, запустите. На экране эмулятора должно появится нечто подобное:

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

Все правильно — просто скучный пустой экран! :] Мы полностью его заполним по мере прохождения туториала
В стартовый проект уже добавлены все необходимые картинки и звуки. Пробежимся по содержимому проекта:

Основы физических движков

Платформеры оперирут на основе физических движков, и в этом туториале мы напишем собственный физический движок.
Есть две причины, по которым нам нужно написать собственный движок, а не брать те же Box2D или Chipmink:

Создание физического движка

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

Загрузка TMXTiledMap

Я предполагаю, что вы знакомы, как работают карты типа Tile Maps. Если нет, то я советую прочесть о них в этом туториале.
Давайте взглянем на уровень. Запустите ваш Tiled map editor (загрузите, если вы не сделали этого раньше) и откройте level1.tmx из папки вашего проекта. Вы увидите следующее:

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

Если вы посмотрите на боковую панель, вы увидите, что у нас есть три разных слоя:

Мы добавили локальную переменную map класса CCTMXTiledMap для работы с ячеистыми картами в наш головной класс.
Далее мы поместим ячеистую карту на наш слой прямо во время инициализации слоя. Добавим следующее в метод init:

Во-первых, мы добавили задник (CCLayerColor) цвета синего неба. Следующие две строки кода это просто подгрузка переменной map (CCTMXTiledMap) и добавление ее на слой.

Далее, в GameLevelLayer.m импортируем Player.h:

Все еще в GameLevelLayer.m добавим следующую локальную переменную в секцию @ interface :

Далее добавим Коалу на уровень следующим кодом в методе init:

Этот код загружает спрайт-объект Коалы, задает ему позицию и добавляет его на объект нашей карты.
Вы спросите, зачем добавлять объект коалы на карту, вместо того, чтобы просто добавить его напрямую на слой? Все просто. Мы хотим непосредственно контролировать какой слой будет перед Коалой, а какой за ней. Так что мы делаем Коалу ребенком карты, а не главного слоя. Мы хотим, чтобы Коала была спереди, так что даем ей Z-порядок, равный 15. Так же, когда мы прокручиваем карту, Коала все еще находится на той же позиции, относительно карты, а не главного слоя.
Отлично, давайте попробуем! Запустите ваш проект и вы должны увидеть следующее:

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

Выглядит как игра, но Коалио игнорирует гравитацию! Пришло время опустить его с небес на землю — при помощи физического движка :]

Ситуация с гравитацией Коалио

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому
Чтобы создать симуляцию физики, можно написать сложный набор разветвляющейся логики, который бы учитывал состояние Коалы и применял бы к ней силы, отталкиваясь от полученной информации. Но этот мир сразу станет слишком сложным — a реальная физика ведь так сложно не работает. В реальном мире гравитация просто постоянно тянет объекты вниз. Так, мы добавляем постоянную силу гравитации и применяем ее к Коале каждый шаг программы.
Другие силы тоже не просто отключаются и включаются. В реальном мире сила действуюет на объект пока другая сила не превзойдет или не будет равной первой.
Например, сила прыжка не отключает гравитацию; она какое-то время превосходит силу гравитации, до тех пор, пока гравитация вновь не прижмет Коалу к земле.
Вот так моделируется физика. Вы не просто решаете, применять или не применять гравитационную силу к Коале. Гравитация существует всегда.

Играем в бога

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому
В логике нашего движка заложено, что если на объект действует сила, то он будет продолжать двигаться пока другая сила на превзойдет первую. Когда Коалио спрыгивает с уступа, он продолжает двигаться вниз с определенным ускорением, пока не встретит препятствие на своем пути. Когда мы двигаем Коалио, он не перестанет двигаться, пока мы не перестанем применять на него силу движения; трение будет действовать на Коалио, пока тот не остановится.
По мере создания физического движка вы увидите, как настолько простая игровая логика помогает решать сложные физические задачи, такие как: ледяной пол или падение со скалы. Эта поведенческая модель позволяет игре изменяться динамически.
Так же такой ход конем позволит нам сделать имплементацию проще, так как нам не нужно постоянно спрашивать состояние нашего объекта — объект просто будет следовать законам физики из реального мира.
Иногда нам нужно играть в бога! :]

Законы планеты Земля: CGPoint’ы и Силы

Давайте обозначим следующие понятия:

Обратите внимание: если что-либо из вышенаписанного вводит вас в заблуждение, то прекрасный человек, Daniel Shiffman написал великолепный туториал на тему векторов, который полностью объясняет действия сил над структурами, которые мы используем.

Давайте начнем с гравитацией. Напишем цикл run, в котором мы будем применять силы. Добавьте в метод init файла GameLevelLayer.m следующий код прямо перед закрытием условного блока if:

Далее добавьте новый метод в класс:

Далее откройте Player.h и измените его, чтобы он выглядил так:

Добавьте следующий код в Player.m:

Давайте пройдемся по коду выше ступень за ступенью

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

Уууууупс — Коалио падает сквозь пол! Давайте это починим.

Удары в ночи – определение столкновений

Определение столкновений это основа любого физического движка. Есть множество различных видов определения столкновений, от простого использования рамок изображений, до комплексных столкновений 3D объектов. К счастью для нас, платформер не требует сложных структур.
Чтобы определять столкновения Коалы с объектами, мы будем использовать TMXTileMap для ячеек, которые непосредственно окружают Коалу. Далее, используя несколько встроенных в iOS функций мы будем проверять пересекает ли спрайт Коалы спрайт какой-либо ячейки.
Функции CGRectIntersectsRect и CGRectIntersection делают такие проверки очень простыми. CGRectIntersectsRect проверяет, пересекаются ли два прямоугольника, а CGRectIntersection возвращает прямоугольник пересечения.
Во-первых, нам нужно определить рамку нашей Коалы. Каждый загруженный спрайт имеет рамку, которая является размером текстуры и к которой можно получить доступ при помощи параметра с именем boundingBox.
Зачем определять рамку, если она уже есть в boundingBox? Текстура обычно имеет вокруг себя прозрачные края, которые мы совсем не хотим учитывать при определении столкновений.
Иногда нам не нужно учитывать даже пару-тройку пикселей вокруг реального изображения спрайта (не прозрачного). Когда марио врезается в стену, разве он чуть-чуть касается ее, или его нос слегка утопает в блоке?
Давайте попробуем. Добавьте в Player.h:

И добавьте в Player.m:

CGRectInset сжимает CGRect на количество пикселов из второго и третьего аргументов. В нашем случае, ширина нашей рамки столкновений будет на шесть пикселов меньше — три пиксела с каждой стороны.

Поднятие тяжестей

Пришло время поднимать тяжести. («Эй, ты сейчас назвал меня толстым?» — говорит Коалио).
Нам потребуется ряд методов в нашем GameLevelLayer для определения столкновений. В частности:

Первый метод возвращает нам координаты ячейки, находящейся на координатах в пикселях, которые мы передаем в метод. Чтобы получить позицию ячейки, мы просто делим координаты на размер ячеек.
Нам нужно инвертировать координаты высоты, так как координаты системы Cocos2D/OpenGL начинаются с левого нижнего угла, а системные координаты начинаются с левого верхнего угла. Стандарты — ну разве это не круто?
Второй метод делает все наоборот. Он умножает координату ячейки на размер ячеек и вовзращает CGRect данной ячейки. Опять же, нам нужно развернуть высоту.
Зачем нам добавлять единицу к y-координате высоты? Запомните, координаты ячеек начинаются с нуля, так 20 ячейка имеет реальную координату 19. Если мы не добавим единицу к высоте, точка будет 19 * tileHeight.

Я окружен ячейками!

Теперь перейдем к методу, который определяет окружающие Коалу ячейки. В этом методу мы создадим массив, который и будем возвращать. Этот массив будет содержать GID ячейки, координаты ячейки и информацию о CGRect этой ячейки.
Мы организуем этот массив в порядке приоритета, в котором мы будем определять столкновения. Например, мы ведь хотим определять столкновения сверху, слева, справа, снизу перед тем, как определять диагональные. Также, когда мы определим столкновение Коалы с нижней ячейкой мы выставляем флаг касания земли.
Добавим этот метод в GameLevelLayer.m:

Пфф — целая туча кода. Не беспокойтесь, мы детально по нему пройдемся.
Но перед этим заметьте, что у нас есть три слоя на нашей карте.
Наличие разных слоев позволяет нам по-разному определять столкновения для каждого слоя.

1. Для начала мы получаем координаты ячейки для ввода (которыми и будут координаты Коалы).
2. Далее, мы создаем новый массив, который будет возвращать информацию о ячейке.
3. Далее, мы запускаем цикл 9 раз — так как у нас есть 9 возможных ячеек перемещения, включая ячейку, в которой коала уже находится. Следующие несколько строк определяют позиции девяти ячеек и сохраняют из в переменной tilePos.

Обратите внимание: нам нужна информация только о восьми ячейках, так как нам никогда не придется определять столкновения с ячейкой, на которой коала уже находится.
Мы всегда должны ловить этот случай и перемещать Коалу в одну из ячеек вокруг. Если Коалио находится внутри твердой ячейки, значит больше половины спрайта Коалио вошло внутрь. Он не должен двигаться так быстро — как минимум, в этой игре!
Чтобы легче оперировать над этими восьми ячейками, просто добавим ячейку Коалио по началу, а в конце ее удалим.

4. В четвертой секции мы вызываем метод tileGIDAt:. Этот метод возвращает GID ячейки на определенной координате. Если на полученных координатах нет ячейки, метод возвращает ноль. Далее мы будем использовать ноль в значении «не найдено ячейки».
5. Далее мы используем вспомогательный метод, чтобы вычислить CGRect для ячейки на данных Cocos2D координатах. Полученную информацию мы сохраняем в NSDictionary. Метод возвращает массив из полученных NSDictionary.
6. В шестой секции мы убираем ячейку Коалы из массива и сортируем ячейки в приоритетном порядке.
Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому
Часто, в случае определения столкновений с ячейкой под Коалой, мы так же определяем столкновения с ячейками по-диагонали. Смотрите рисунок справа. Определяя столкновения с ячейкой под Коалой, веделенной красным, мы так же определяем столкновения с блоком #2, выделенным синим.
Наш алгоритм определения столкновений будет использовать некоторые допущения. Эти допущения верны скорее для прилегающих, нежели для диагональных ячеек. Так что мы постараемся избегать действий с диагональными ячейками настолько, насколько это возможно.
А вот и картинка, которая наглядно показывает нам порядок ячеек в массиве до и после сортировки. Можно заметить, что верхняя, нижняя, правая и левая ячейки обрабатываются в первую очередь. Зная порядок ячеек, вам будет легче определять, когда Коала касается земли или летает в облаках.
Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

7. Цикл в секции семь позволяет нам следить за ячейками в реальном времени. Так, мы можем точно знать, что все идет по плану.

Мы почти готовы к следующему запуску нашей игры! Однако все еще нужно сделать пару вещиц. Нам нужно добавить слой walls как переменную в класс GameLevelLayer так, чтобы мы смогли ее использовать.

Внутри GameLevelLayer.m осуществите следующие изменения:

Запускайте! Но, к сожалению, игра крашится. Мы видим в консоли нечто следующее:

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

Сначала мы получаем информацию о позициях ячеек и значения GID (хотя в основном нули, так как сверху пустая местность).
В конце, все крашится с ошибкой «TMXLayer: invalid position». Такое происходит, когда в метод tileGIDat: передается позиция, которая находится вне краев карты.
Мы избежим этой ошибки чуть позже — но сначала, мы собираемся изменить существующее определение столкновений.

Отбираем привилегии Коалы назад

До этого момента Коала сама обновляла себе позицию. Но сейчас мы забираем у нее эту привилегию.

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

Если Коала будет самостоятельно обновлять свою позицию, то в конце концов она начнет скакать как бешеная! А мы же этого не хотим, нет?
Так что Коала требует дополнительной переменной desiredPosition, при помощи которой она будет взаимодействовать с GameLevelLayer.
Мы хотим, чтобы класс Коалы самостоятельно высчитывал свою следующую позцию. Но GameLevelLayer должен перемещать Коалу в желаемую позицию только после проверки ее на валидность. То же самое применимо и к циклу определения столкновений — мы не хотим обновлять реальный спрайт до того, как все ячейки были проверены на предмет столкновений.
Нам нужно поменять несколько вещей. Сначала, добавьте следующее в Player.h

И синтезируйте добавленное в Player.m:

Теперь, измените метод collisionBoundingBox в Player.m, чтобы он выглядел так:

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

Обратите внимание: Есть множество различных способов вычисления рамок столкновений. Вы можете написать код, похожий на тот, что уже имеется в классе CCNode, но наш нынешний способ гораздо проще, несмотря на некоторую неочевидность.

Далее, осуществите следующие изменения в методе update так, чтобы он обновлял desiredPosition заместо текущей позиции:

Давайте начнем определять столкновения!

Пришло время для серьезных свершений. Мы собираемся собрать все вместе. Добавьте следующий метод в GameLevelLayer.m:

Отлично! Давайте посмотрим на код, который мы только что написали.

1. Сначала мы получаем набор ячеек, окружающих Коалу. Далее мы проходимся циклом по каждой ячейке из этого набора. Каждый раз, когда мы проходимся по ячейке, мы проверяем ее на предмет столкновений. Если произошло столкновение, мы меняем desiredPosition у Коалы.
2. Внутри каждой петли цикла, мы сначала получаем текущую рамку Коалы. Каждый раз, когда определяется столкновение, переменная desiredPosition меняет свое значение на такое, при котором столкновения больше не происходит.
3. Следующий шаг это получение GID, который мы хранили в NSDictionary, который может являться нулем. Если GID равен нулю, то текущая петля завершается и мы переходим к следующей ячейке.
4. Если в новой позиции находится ячейка, нам нужно получить ее CGRect. В ней может быть, а может и не быть столкновения. Мы осуществляем этот процесс при помощи следующей строчки кода и сохраняем в переменную tileRect. Теперь, имея CGRect Коалы и ячейки, мы можем проверить их на предмет столкновения.
5. Чтобы проверить ячейки на предмет столкновения, мы запускаем CGRectIntersectsRect. Если произошло столкновение, то мы получим CGRect, описывающий CGRect пересечения при помощи функции CGRectIntersection().

Остановимся подумать на дилеммой.

Довольно интересный случай. Нам нужно додуматься как правильно определять столкновения.
Можно подумать, что лучший способ двигать Коалу — двигать ее в противоположную сторону от столкновения. Некоторые физические движки и вправду работают по этому принципу, но мы собираемся применить решение по-лучше.
Подумайте: гравитация постоянно тянет Коалу вниз в ячейки под ней, и эти столкновения происходят постоянно. Если вы представите Коалу, движущуюся вперед, то, в то же время, Коалу все еще тянет вниз гравитацией. Если мы будем решать эту проблему простым изменением движения в обратную сторону, то Коала будет двигаться вверх и влево — а ведь нам нужно нечто иное!
Наша Коала должна смещаться на достаточное расстояние, чтобы все еще оставаться над этими ячейками, но продолжать двигаться вперед с тем же темпом.
Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому
Та же проблема произойдет, если Коала будет скатываться вниз по стене. Если игрок будет прижимать Коалу к стене, то желаемая траектория движения Коалы будет направлена диагонально вниз и в стену. Просто обратив направление, мы заставим Коалу двигаться вверх и от стены — опять, совсем не то! Мы то хотим, чтобы Коала оставалась вне стены, но все еще спускалась вниз с тем же темпом!
Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому
Так что, нам нужно решить, когда работать со столкновениями вертикально, а когда горизонтально, и обрабатывать оба действия взаимоисключающе. Некоторые физические движки постоянно обрабатывают сначала первое событие, а потом второе; но мы-то хотим сделать решение по-лучше, основываясь на позиции ячейки Коалы. Так, например, когда ячейка прямо под Коалой, мы хотим, чтобы определитель столкновений возвращал Коалу вверх.
А что если ячейка диагональна позиции Коалы? В этом случае мы используем CGRect пересечения, чтобы понять, как мы должны двигать Коалу. Если ширина этого прямоугольника больше высоты, то возвращать Коалу нужно вертикально. Если высота больше ширины, то Коала должна смещаться горизонтально.
Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому
Этот процесс будет работать правильно до тех пор, пока скорость Коалы и скорость смены кадров будут в пределах определенных рамок. Чуть позднее мы научимся избегать случаев, когда Коала падает слишком быстро и проскакивает через ячейку вниз.
Как только мы определили, как двигать Коалу — вертикально или горизонтально, мы используем размер CGRect пересечения для определения, насколько нужно сместить Коалу. Смотрим на ширину или высоту соответственно и используем эту велечину как дистанцию смещения Коалы.
Зачем же проверять ячейки в определенном порядке? Вам всегда нужно сначала работать с прилегающими ячейками, а потом с диагональными. Ведь если вы захотите проверить на столкновение ячейку справа снизу от Коалы, то вектор смещения будет направлен вертикально.
Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому
Однако все еще есть шанс, что CGRect столкновения будет вытянутым вверх, когда Коала чуть-чуть касается ячейки.
Посмотрите на рисунок справа. Синяя область вытянута вверх, потому что прямоугольник столкновения — это лишь малая часть общего столкновения. Однако если мы уже решили проблему с ячейкой прямо под Коалой, то нам уже не нужно определять столкновения с ячейкой снизу справа от Коалы. Так мы и обходим появившиеся проблемы.

Назад к коду!

Вернемся к монструозному методу checkForAndResolveCollisions:

6. Шестая секция позволяет нам получить индекс текущей ячейки. Мы используем индекс ячейки чтобы получать позицию ячейки. Мы собираемся оперировать над прилегающими ячейками индивидуально, смещая Коалу, вычитая или добавляя длину или высоту столкновения. Довольно просто. Однако как только дело доходит до диагональных ячеек, мы собираемся применять алгоритм, описаный в предыдущей секции.
7. В седьмой секции мы определяем, какая наша область столкновения: широкая или вытянутая вверх? Если широкая — работаем вертикально. Если индекс ячейки больше 5, то двигаем Коалу вверх. Если область вытянута вверх — работаем горизонтально. Действуем по похожему принципу порядка индексов ячейки. В конце мы присваиваем Коале полученую позицию.

Этот метод — мозг нашей системы определения столкновений.

Давайте используем все имеющиеся знания на практике! Измените метод update (все еще в GameLevelLayer:)

Также вы можете удалить или закомментировать блок getSurroundingTilesAtPosition:forLayer:

Запускаем! Удивлены результатом?

Как сделать игру марио самому. Смотреть фото Как сделать игру марио самому. Смотреть картинку Как сделать игру марио самому. Картинка про Как сделать игру марио самому. Фото Как сделать игру марио самому

Пол останавливает Коалио, но тот тут же в него утопает! Почему?
Можете догадаться, что мы упустили? Помните — каждый шаг игры мы добавляем силу гравитации к скорости Коалы. Это обозначает, что Коала постоянно ускоряется вниз.
Мы постоянно добавляем скорость к траектории Коалы вниз, пока она не становится размером с ячейку — мы перемещаемся сквозь целую ячейку за один шаг, что и вызывает проблемы (помните, мы недавно об этом говорили).
Как только мы засекаем столкновение, нам нужно обнулять скорость коалы в направлении ячейки, с которой столкнулись! Коала перестала двигаться, так что и скорость должна с ней считаться.
Если мы этого не осуществим, то у нас будет довольно странное поведение игры. Как мы уже заметили ранее, нам нужен способ определять, касается ли Коала земли, чтобы Коала не смогла прыгать еще выше. Мы выставим этот флажок прямо сейчас. Добавьте следующие строки в checkForAndResolveCollisions:

Каждый раз, когда под Коалой есть ячейка (либо прилегающая, либо диагональная), мы выставляем значение переменной p.onGround равное YES и обнуляем скорость. Также, если под Коалой есть прилегающая ячейка, мы обнуляем его скорость. Это позволит нам правильно реагировать на текущую скорость Коалы.
Мы выставляем значение переменной onGround равное NO в начале цикла. В этом случае, у onGround будет значение YES только тогда, когда мы обнаружим столкновение Коалы с ячейкой под ней. Мы можем использовать эту особенность для того, чтобы определять может Коала прыгать или нет в текущий момент времени.
Добавьте следующий код в загаловочный файл (и затем синтезируйте все необходимое в исполнительном) в Player.h:

Запускаем! Все работает так, как и задумывалось? Да! О, этот великолепный день! Ура!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *