исходный код игры марио
Делаем игру Марио из Dendy на Scratch
Новый урок и рассказ о новой игре! Сегодня мы начнем программировать легендарную игру Марио на Скретч. Обратите внимание, что описание первой части программного кода для Mario Bros. будет координально отличаться от второй части игры. Сделано это для повторения пройденного материала и применения некоторых элементов на втором уроке по детскому программированию в Scratch. Вначале нужно загрузить спрайты — делаем это самостоятельно, без помощи пап, мам и учителей! Вторым шагом стараемся написать движения для Марио, гриба и врага самостоятельно и только если совсем все не получается читаем подготовленный материал. Что же надо реализовать:
Простая и динамичная игра, когда-то была суперхитом игровой приставки Dendy. Постарайтесь запрограммировать игру, в которую играли ваши родители! Показав ее папе или маме вы очень их порадуете, ведь в памяти оживут старые воспоминания. Так что программирование, даже детское может быть эмоциональным и захватывающим при правильной подачи. Ну а сейчас скачиваем спрайты и фон для будущей игры:
Когда графическая часть будет загружена на компьютер начинаем подгружать ее в среду разработки Scratch. Напоминаю, что загрузка персонажей и фона в среде разработки Скретч осуществляется через кнопку показану на фотографии ниже:
Пишем программный код для героя Марио
Чтобы заставить Марио двигаться мы будем использовать старые приемы:
Но на этом уроке объединим их в собственный блок, который условно назовем «Библиотека». Конечно данный пример очень прост, но он поможет юному программисту легче понять суть библиотек в программирование. Теперь немного теории:
Современные программы слишком сложные, чтобы создавать их с нуля, поэтому разработчики используют библиотеки — так код пишется гораздо быстрее.
Библиотека (англ. library) — это набор готовых функций, классов и объектов для решения каких-то задач.
Ну а теперь давайте познакомимся с модульным программированием на практике. Для особо любопытных будет полезна статья о разработке фонарика для смартфонов на базе Андройд в AppInvector (приступить к чтению урока). В этом уроке явным образом используется и подгружается библиотека — это уже по серьезному! Ну а мы продолжим создавать собственный набор программ для игры:
А теперь самое интересное — добавляем стандартный набор блоков Скретч для движения спрайта вправо-влево, но делаем это через условие: ЕСЛИ … ТО … ИНАЧЕ
Далее добавляем из раздела: Движение два блока:
Таким образом мы с вами получили первую команду в библиотеке под название Марио. Обычно библиотеки состоят из множества команд, которые вызываются по их названию, дальше я покажу как это выглядит. Если мы наполним героя Марио множествами команд и сделаем выгрузку в формате спрайта, то его вполне можно будет назвать библиотекой, ведь при загрузке в другой проект подгрузятся и все написанные команды. Конечно пример достаточно условный, но очень наглядный. Остается добавить цикл: Повторять всегда, чтобы движение работало на протяжениии всей игры, а не однократно и все — вызываем команду из библиотеки!
Теперь, чтобы заставить Марио двигаться не нужно добавлять множество блоков, достаточно разместить один блок вправо-влево:
Попробуйте сделать тоже самое, но только для программирования прыжка — делаем это самостоятельно и пользуемся подсказкой по ссылке вначале урока. Пишем код таким образом, чтобы прыжок был плавным, не дерганным! Должно получиться что-то такое:
САМОСТОЯТЕЛЬНАЯ РАБОТА:
Допиши программный код Скретч так, чтобы у Марио происходила смена костюмов и было видно, что герой движется.
Код для движения врага Марио
Теперь оживим первого врага Марио и сделаем это обычным способом:
Немного поясню написанное выше. Но вообще, если вы дошли до этого урока, то должны отлично разбираться в представленном коде. Его мы уже неоднократно писали, отличие заключается лишь в применении условия для взаимодействия врага с трубой. Но на всякий случай расскажу:
Надеюсь всем все понятно и можно продолжить дальше!
Программируем выползание цветка из трубы
САМОСТОЯТЕЛЬНАЯ РАБОТА:
Попробуйте сами написать код для выползания цветка из трубы, но только так, чтобы движение было плавным — как в прыжке (подсказка!). Не забудьте чтобы цветок-хищник ждал какое-то время. А лучше, чтобы время все время было случайным значением! И конечно, чтобы цветок прятался за трубу, делается это с помощью блока:
Пишем код для гриба дающего силу
Первым делом нужно реализовать код таким образом, чтобы цветок прятался за кирпиное препятствие. И конечно располагался в нужном месте. Делается это достаточно просто:
Теперь напишем условие, при котром Марио ударяет в гриб и он вылезает на поверхность, ну и конечно продолжает движение. но перед написанием этого года протестируем его работу по нажатию кнопки ПРОБЕЛ. И только потом поместим полученный результат внутрь условия взаимодействия Марио и Гриба.
Добавляем условие взаимодействия спрайтов в Скретч:
Переносим код движения внутрь условия. И наслаждаемся демонстрацией отработки кода во время прыжка Марио.
Я рекомендую сразу немного изменить код, ведь когда грип спрыгнет и столкнется с Марио мы наделим героя супер силой, а потому придется еще раз использовать код: КАСАЕТСЯ МАРИО. Поэтому опишем первое взаимодействие объектов через цвет шапочки героя:
Ну что ж, теперь нужно вернуться к Марио и сделать так, чтобы он не мог забежать за трубу, а только перепрыгнуть или запрыгнуть на нее и не мог зайти а край экрана слева.
В прошлом посте про тетрис, многие кто хотел бы в этом разобраться или просто учится писать на С++, использовать SFML, или просто интересуется для себя, жаловались, что видео ряд сильно ускорен, музыка достала, да и вообще.
Дубликаты не найдены
Лига программистов C/C++
43 поста 4.2K подписчиков
Правила сообщества
Соблюдайте правила Pikabu:
Помимо этого ЗАПРЕЩЕНО:
— Размещать в сообществе посты стиля «Подскажите как стать программистом», «Подскажите как удалить вирус», «Подскажите как установить программу», «Подскажите как починить монитор/телевизор/мышь/тостер/клавиатуру» или «Напишите за меня лабу в универ». Пожалуйста размещайте такие посты вне этого сообщества или в соответствующих для этого сообществах.
Я пробовал освоить эту либу освоить, но либо времени не хватало, либо знаний.
А тут человек может популярно всё объяснить, да ещё исходники скинуть.
Я с удовольствием посмотрю и поиграюсь с кодом
ты уже со второй строки пошёл в рекурсию
Кто целевая аудитория таких видосов
Те, кто не умеет ничего.
Это как смотреть на ютубе как чувак делает что то крутое и надеяться когда то по этому уроку что-нибудь сделать.
Эй! А финальная демонстрация?
Да, да, ждём исходники
Привет всем, кто следит за нашей игрой и тем кто случайно наткнулся на мой пост.
Из последнего, мы добавили немного стелса в игру и теперь, можете убивать новообращенных, незаметно подкрадываясь сзади. У игрока будет возможность оказывать как и открытое противостояния, так и скрыто убивать врагов если осталось мало припасов.
Интеллект у монстров получился довольно таки неплохо, по крайней мере я им доволен. Враги могут слышать вас, если вы шумите, так же если вы устройте перестрелку где то в радиусе слышимости монстров, можете не сомневаться, все они непременно сбегутся на огонек.
Работы еще предстоит много и мы все непременно постараемся довести до ума. Свет, шейдеры и эффекты на камере еще не настроены. Это будем подкручивать на финальной стадии разработки. Если кому то интересно, можно ознакомится с трейлерам игры. Из за смены названия проекта, пришлось перезолить его заново на Youtube и теперь он не доступен в моем предыдущим посту.
Unferat (пост 5)
Приветствую!
Моей игре исполнилось пол-года и я бы хотел поделиться мыслями и опытом, связанными с её поддержкой и продвижением. Кто не видел предыдущих постов, напомню: Унферат это симулятор некроманта, выполненный в духе старых рпг. Мрачная, жестокая и сложная игра с раскапыванием могил, темной оккультной магией и нестандартным подходом к сотворению заклятий.
Помимо стартового трафика есть и ютуберы, которые специализируются исключительно на формате новинок, снимая первую пенку. Запечатленные ими баги и личное мнение останутся там навсегда. Отзывы в духе «игра забагована» на вашей странице тоже редко кто изменит, даже если проблемы будут поправлены.
Мне повезло, Унферат вышел без заметных багов, но моя личная ошибка на тот момент была в скудной локализации (английский/русский), что негативно сказалось на проданных копиях. Сейчас дополнительные языки я прикрутил конечно, но релизный трафик частично упущен.
Буквально пару недель назад мне нечего было добавить в игру, а сейчас я пилю дополнение с мыслью «как же я раньше до этого не додумался», так что оставляйте пространство для маневра. Это легче, чем демонтировать и переписывать существующее тело игры в дальнейшем.
На скриншоте снизу видно что новую закладку заклинаний добавить толком некуда, придется частично перерисовывать, а немецкий вариант страницы еле-еле влазит в книгу по сравнению с китайской версией.
Отзывы на странице игры. Тут скорее благодарность, ибо я заметил что среди них есть пикабушники. Спасибо, народ! Инди-разработчики чуть ли не молятся на синенькие посты под игрой, это очень мощный мотивационный фактор для развития игры и себя, как специалиста.
Управление. Всегда найдется человек, у которого срабатывает двойной клик или вращение камеры ему нужно инвертировать, а есть староверы, «бегающие» на стрелочки. Всегда хочется в релиз поскорее, но поверьте, если ваша игра не платформер с Денди управлением, то лучше такие вещи предусмотреть заранее и сделать не только смену клавиш, но и расширенную возможность настройки управления. Игру вы пишете в первую очередь как продукт от которого игроки будут получать удовольствие и дополнительная настройка пойдет проекту только на пользу.
Деньги. Которые, как известно любят тишину, поэтому все кругом помалкивают.
Описывать доход, словно оголяться на публике, но по себе знаю что вопрос значимый для инди, так что вношу в общую копилку знаний.
Тут могу сказать что это первая игра из трех, которая принесла хоть какие-то деньги. Примерно получилось
250к за пол года продаж, хвастаться особо не чем (2 года разработки и поддержки игры). Но ради такого случая зарегался как самозанятый чтобы карту не заблокировали спать спокойно. Пока полет нормальный.
Full HD 4k rtx on GIF: =)
Всем спасибо за прочтение! Буду рад ответить на любые вопросы по игре в комментариях.
Былина о том, как мы с другом игру пилим. Теперь у AWAKENING появилась страница в Steam
Музыку для трейлера делал Alec Koff.
ВСЕМ ПРИВЕТ.
Давно не было постов, а все потому что последние пол года оказались для меня очень тяжелыми. Наверное старею, уже 32 или просто так совпало, что 2 раза за 6 месяцев лежал в больницах и еще пару раз болел дома, в том числе и вирусом «made in China». Ну не будем о грустном, считаю, что жаловаться на жизнь глупо, всегда найдется тот, кому гораздо хуже.
Сегодня я хочу поделиться с вами радостным событием, мы сделали большой шаг вперед, который приближает нашу игру к выходу на площадке Steam. Вы можете ознакомиться с трейлером и если вам будет интересно, то сможете прочитать о работе над проектом. Свой рассказ я разбил на категории для удобства и каждый сможет почитать то, что ему интересно.
До этого у меня были неоднократные попытки создавать команды и не одна из них не увенчалась успехом. Люди сначала с горящими глазами берутся за дело, а когда понимают, что для того, что бы создать игру нужно много сил и времени, и не факт что тебе за это заплатят, то их энтузиазм очень быстро сходит на нет. Как правило их упорства хватает на 1-2 месяца, а потом другие дела, лень, отговорки и они сливаются.
ДА НАЧНЕТСЯ РАЗРАБОТКА:
Когда я доделал The Story of Henry Bisop, то был уже готов делать что-то новое. Мы с Никитой неоднократно обсуждали создание большого проекта для Steam и вот пришло время погрузиться в совместную разработку. Мы составили план и краткий сценарий игры, потом расписали все подробно, что бы понимать сколько работы нам предстоит. В игре запланировано минимум 5+ часов геймплея, поэтому у нас очень большие локации, состоящие из участков города. Мы определились, что локаций будет 4 и поделили каждому по 2 на создание левел дизайна. Так же распределили все остальные обязанности, например я делаю искусственный интеллект, Никита делает инвентарь и т.п. Все это мы делаем сообща, что бы не возникало проблем при совмещении. Основное время уходит на создание сцен и написание кода. Мы хотим, чтобы игра получилась максимально атмосферной и для нас очень важно создать хорошо проработанные локации.
Создавая большую игру вдвоем, просто физически не хватит сил, чтобы самостоятельно сделать качественные модели для всей игры. Какие-то модели мы делаем сами, если нам подходит что-то из магазинов, то мы покупаем это и используем, при необходимости корректируем, модели и текстуры, что-то мы заказываем на фрилансе и все расходы делим пополам.
ОБ ИГРЕ:
Майор в отставке Шон Тернер возвращается домой с ежегодной встречи ветеранов войны в Ираке. Приехав в свой маленький провинциальный городок, Шон понимает, что за пару дней его отсутствия здесь произошло что-то ужасное. В этом месте больше нет людей, а пустынные улицы теперь наполняют жуткие твари, отдаленно напоминающие соседей, которые еще вчера мило улыбались Шону. Нужно как можно быстрее попасть домой, спасти жену, дочь и выбираться из этого ада. Но вскоре Шон поймет, что не все так просто и зло, с которым предстоит бороться гораздо страшнее, чем та война, в которой он принимал участие много лет назад.
ПЛАНЫ:
Честно сказать не знаю, как пойдет дальше, но пока по плану мы хотим сделать полостью рабочие 2 локации и всю механику. Сделать так, чтобы это была не сырая недоделка, а полноценные игровые локации и выложить игру в ранний доступ на Steam в начале весны. Возможно найдутся люди, которые захотят поиграть в нашу игру, а так же поделиться своим мнением, для нас это очень важно. Далее по плану, до конца лета завершить оставшиеся локации и выйти в релиз.
ПОДВЕДУ ИТОГ:
Благодаря прогрессу сейчас можно делать массу крутых вещей, о которых я и не мечтал будучи ребенком. Я помню, как впервые увидел игры на PS1 и подумал: «Это же как фильм, ничего себе, это походу предел технологий и лучше уже быть не может». Ps1 у меня никогда не было, зато она была у соседа, который очень любил выпить и он иногда давал мне её на денек поиграть в обмен на бутылку вина. Выходило гораздо дешевле, чем в игровом клубе)
Так вот к чему я. Сейчас технологии и интернет развились на столько, что позволяют создавать игры сидя у себя дома. В интернете полно информации, книг и видео уроков о создании игр и, при желании, практически любой может создавать игры и выкладывать их на всевозможные площадки. Нужны только упорство, желание и время. В интернете куча сообществ, где можно находить единомышленников, общаться или объединяться в небольшие команды. Главное самому быть упорным и найти такого же упорного товарища, а вместе и разработка веселее и процесс идет бодрее.
Пишем игру-клон Super Mario Brothers (часть 2)
Добро пожаловать во вторую часть из серии туториалов о том, как написать собственный платформер по типу Super Mario Brothers!
В первой части мы написали простой физический движок на основе Tiled Map.
Во второй (и последней) части мы научим Коалио двигаться и прыгать — самая веселая часть любого платформера!
Мы научимся отслеживать столкновения с опасностями на уровне, обрабатывать победу и поражение; добавим великолепные звуковые эффекты и музыку!
Вторая часть на порядок легче (и короче) первой — небольшой отдых после тяжелой работы в прошлый раз! Так что включайте свое кодо-кунг-фу и наслаждайтесь!
Двигаем Коалио
Движения у нас будут очень простыми: только бег вперед и прыжки — прямо как в 1-bit Ninja. Если игрок касается левой части экрана, Коалио бежит вперед. Если игрок касается правой части экрана, Коалио прыгает.
Вы все поняли правильно: Коалио не может двигаться назад! Настоящие Коалы на отступают назад от опасности!
Так как Коалио будет двигаться вперед, нам нужна переменная, которую можно будет использовать в классе Player для обновления позиции Коалы. Добавьте следующее в класс Player:
И синтезируем все в Player.m:
Теперь добавьте следующие методы обработки касаний в GameLevelLayer:
Код выше довольно прост для понимания. Если X-координата касания экрана меньше 240 (половины экрана), то мы присваиваем переменной forwardMarch значение YES. Иначе (если Х-координата больше 240) присваиваем значение YES переменной mightAsWellJump.
touchesMoved чуть более сложный метод. Нам нужно менять значение переменных только тогда, когда касание пересекает середину экрана. Так что мы должны учитывать еще и предыдущее касание — переменную previousTouch. Иначе говоря, мы просто проверяем с какой стороны произошло пересечение и меняем значения булевых переменных соответственно.
Мы хотим, чтобы, когда игрок переставал касаться определенной области экрана, выключались только нужные булевы переменные.
Однако стоит изменить еще несколько вещей для правильной обработки касаний. Добавьте следующую строку в метод init:
Нам нужно включить мультитач в AppDelegate.m (вдруг наш игрок захочет прыгать и двигаться вперед одновременно). Добавьте следующее перед строкой [director_ pushScene: [GameLevelLayer scene]];:
Теперь, когда у нас есть значение переменных в объекте класса Player, мы можем добавить немного кода в метод update, чтобы Коалио смог двигаться. Начнем с движения вперед. Измените метод update в Player.m на следующее:
Давайте разберем этот код шаг за шагом:
Далее мы заставим Коалу прыгать!
Прыжки это неотъемлемая часть любого платформера, которая приносит довольно много веселья. Мы должны удостовериться, что прыжок плавен и четко откалиброван. В этом туториале мы используем алгоритм прыжка из игры Sonic the Hedgehog, описанный здесь.
Добавим следующее в метод update перед строкой if (self.forwardMarch) < :
Если мы остановимся прямо сейчас и запустим проект, то мы получим классические прыжки в стиле Atari. Все прыжки будут одинаковой высоты. Мы применяем силу к Коале и ждем, пока гравитация ее преодолеет.
В современных платформерах у пользователей гораздо больше контроля над прыжками. Мы хотим контролируемые, абсолютно нереалистичные (но чертовски веселые) прыжки в стиле Mario Bros или Sonic.
Есть несколько способов добиться нашей цели, но мы возьмем за основу прыжки Sonic’а. Когда игрок перестает касаться экрана, сила прыжка начинает уменьшаться. Заменим код выше на следующее:
Этот код осуществляет еще один дополнительный шаг. Когда игрок перестает касаться экрана (значение self.mightAsWellJump становится NO), игра проверяет скорость Коалио, направленную вверх. Если эта величина больше, чем наш порог, то игра устанавливает значение порога переменной скорости.
Таким образом, при мгновенном касании экрана, Коала не прыгнет выше jumpCutoff, но при продолжительном нажатии на экран, Коала будет прыгать все выше и выше.
Запустите проект. Игра начинает походить на что-то стоящее! Сейчас вам, скорее всего, нужно протестировать приложение на реальном девайсе (если вы еще этого не сделали) для проверки работы обеих «кнопок».
Мы заставили Коалио бегать и прыгать, но он довольно быстро убегает за края экрана. Пришло время это починить!
Добавьте следующий сниппет из туториала по ячеечным картам в GameLevelLayer.m:
Этот код закрепляет экран за позицией игрока. В случае, если Коалио дойдет до конца уровня, экран перестает центроваться на Коале и закрепляет грань уровня за гранью экрана.
Стоит обратить внимание, что в последней строке мы двигаем карту, а не игрока. Это возможно потому, что игрок — это потомок карты. Так что, когда игрок двигается вправо, карта движется влево и игрок остается в центре экрана.
Для более подробного объяснения, посетите этот туториал.
Нам нужно добавить следующий вызов в метод update:
Запустите проект. Коалио может пробежать через весь уровень!
Агония поражения
Исхода игры два: либо победа, либо поражение.
Сначала разберемся со сценарием поражения. На нашем уровне есть опасности (hazards). Если игрок сталкивается с опасностью, игра заканчивается.
Так как опасности — это фиксированные ячейки, мы будем работать с ними, как с препятствиями из прошлого туториала. Однако вместо определения столкновений мы будем просто завершать игру. Мы на пути к успеху — осталось совсем чуть-чуть!
Добавьте следующий метод в GameLevelLayer.m:
Весь код выше должен быть вам знаком, так как он просто скопирован из метода checkAndResolveCollisions. Единственное нововведение — это метод gameOver. Мы посылаем ему 0, если игрок проиграл, и 1, если он победил.
Мы используем слой hazards, вместо слоя walls, так что нам нужно объявить переменную CCTMXLayer *hazards; в @ interface в начале исполнительного файла. Добавьте это в метод init (сразу после объявления переменной для слоя walls):
Единственная вещь, которую осталось сделать — это добавить следующий код в метод update:
Теперь, если игрок влетит в любую опасную ячейку со слоя hazards, мы вызовем gameOver. Этот метод просто отобразит кнопку «Restart» с сообщением о том, что вы проиграли (или выиграли — такое тоже случается):
Первая строка объявляет переменную gameOver. Мы будем использовать эту переменную для того, чтобы заставить метод update перестать осуществлять какие-либо изменения в позиции Коалио. Буквально через минутку мы это и осуществим.
Далее код создает текст (label) и придает ему значение won или lost. Также мы создаем кнопку «Restart».
Эти основанные на блоках методы объектов CCMenu довольно удобно использовать. В нашем случае мы просто заменяем наш уровень на его копию для того, чтобы начать уровень сначала. Мы используем CCAction и CCMove просто для того, чтобы красиво анимировать кнопочки.
Еще одна вещь, которую нужно сделать — это добавить булеву переменную gameOver в класс GameLevelLayer. Это будет локальная переменная, так как мы не будем ее использовать вне класса. Добавьте следующее в @ interface в начале файла GameLevelLayer.m:
Измените метод update следующим образом:
Запустите игру, найдите шипованный пол и прыгнете на него! Вы должны увидеть нечто подобное:
Только не надо повторять это слишком часто, а то могут появиться проблемы с защитниками животных! :]
Пропасть смерти
Теперь добавим сценарий падения в дырку между ячейками. В этом случае, мы просто завершаем игру.
Прямо сейчас при падении код скрашится с ошибкой «TMXLayer: invalid position». (Ужас!) Вот здесь нам и нужно вмешаться.
Добавьте следующий код в GameLevelLayer.m, в метод getSurroundingTilesAtPosition:, перед строкой tileGIDat:
Этот код запустит действие gameOver и предотвратит процесс создания массива ячеек. Нам также нужно предотвратить процесс прохода цикла через все ячейки в checkForAndResolveCollisions. Добавьте блок кода после строки NSArray *tiles = [self getSurroundingTilesAtPosition:p.position forLayer:walls ];:
Это предотвратит вызов цикла и ненужный краш игры.
Запустите игру прямо сейчас. Найдите пропасть, в которую можно прыгнуть, и… никаких вылетов! Игра работает так, как и задумывалось.
Победа!
Теперь, поработаем со случаем, когда наш Коалио выигрывает игру!
Все, что мы делаем — это следим за x-позицией нашей Коалы и показываем экран с победным сообщением, если она пересекает определенную метку. Длина этого уровня 3400 пикселов. Мы поставим победную метку на расстоянии 3130 пикселей.
Добавьте новый метод в GameLevelLayer.m и обновите метод update:
Запустите, попытайтесь выиграть. Если получится, то вы должны увидеть следующее:
Великолепная музыка и звуковые эффекты
Пришло время для великолепной музыки и звуковых эффектов!
Давайте начнем. Добавьте следующее в начало GameLevelLayer.m и Player.m:
Теперь добавьте следующую строку в метод init файла GameLevelLayer.
Мы только что подключили приятную игровую музыку. Спасибо Кевину из Incompetech.com за то, что он написал музыку (Brittle Reel). У него там целая туча лицензированной для CC музыки!
Теперь добавим звук прыжка. Перейдите в Player.m и добавьте следующее в код прыжка метода update:
И наконец, проиграем звук поражения, когда Коалио дотрагивается до опасной ячейки или падает в яму. Добавьте в метод gameOver файла GameLevelLayer.m следующее:
Запустите и насладитесь новыми приятными мелодиями.
Вот и все! Вы написали платформер! Вы великолепны!
А вот и исходный код нашего законченного проекта.