Программист
0,0
рейтинг
28 ноября 2012 в 14:10

Разработка → Как начать писать игры из песочницы tutorial

Оригинал: Starting out on Game Programming

Путь в индустрию игровых разработок не близок. Эта статья призвана помочь понять с чего лучше начать это путешествие.

Вы только что закончили ваш первый курс по С++ и хотите начать делать игры. Кто-то указал вам на этот сайт и вы, возможно, поэкспериментировали немного с руководством. Вы изучили несколько лаконичных примеров, но не нашли руководства о том, как сделать целую игру. И на то есть причина.

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



Выбор проекта


Итак, с чем же начать? Проще ответить с чего начинать не стоит, а именно с больших проектов, типа полноценной 3D FPS, MMO или даже длинного платформера 16-битной эпохи. Самая распространенная ошибка начинающих разработчиков это начать с большого проекта основанного на Крутой Идее или взять проект, который кажется простым, и закончить с полузаконченной кучей спагетти-кода. Поначалу следует создавать небольшие проекты.

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

Поэтому помните: не подлетайте слишком близко к солнцу на ваших новых программистких крыльях.

Принимая во внимание все выше написанное, вот пара советов с чего начать.


Графика и обработка событий


Если вы никогда не программировали ничего связанного с графикой или GUI, вам следует начать с чего то маленького, чтобы «обмочить ноги». Моим первым проектом были крестики-нолики, так что даже у меня было скромное начало. Пара идей для первого проекта:
  • Симулятор однорукого бандита

  • Black Jack

  • Крестики-нолики

  • Четыре в ряд



Цель вашего первого проекта перейти от консольной разработки к разработки событийных графических приложений. Он так же научит вас фундаментальным основам игровой логики и архитектуры. Я рекомендую что-нибудь пошаговое, потому что игры с движением это совсем другой зверь.

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

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

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


Синхронизация, движение, столкновения, анимация


Теперь, когда вы наигрались с графикой, пора заняться чем-нибудь в реальном времени. Вот пару предложений:
  • Duck Hunt

  • Pong

  • Space Invaders

  • Galaga

  • Тетрис



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

Duck Hunt и Pong — хорошие проекты для тех, кто уже имеет опыт в программировании графики и событий. В них есть простое обнаружение столкновений и все важные основы игр в реальном времени.

Space Invaders и Galaga — хороший выбор для второго/третьего проекта. В них есть уровни, поэтому вам нужно будет узнать как передвигаться от уровня к уровню, при помощи конечного автомата. Вы можете прочитать про конечные автоматы здесь(англ.). Игры в стиле «перестреляй их всех» так же требуют создать простые шаблоны поведения для врагов, что является шагом в сторону искусственного интеллекта.

Тетрис хорош для второго/третьего проекта. В нем совсем немного логики нужной для создания игры-головоломки. Это игра приличного размера, так что вам придется научиться разделять вашу программу на несколько исходных файлов, о чем вы можете больше прочитать здесь(англ.). Не недооценивайте Тетрис. Я недооценил и только посмотрите на это жуткое месиво в коде Lazy Blocks.


Переинженеринг


Типичная ошибка новичка это попытка сделать Самую Лучшую Игру Всех Времен, заканчивающаяся переинженерингом. То есть когда он пытается написать самую лучшую игру/движок и это все заканчивается тем, что используется только маленькая часть того что было понаписано.

Когда я был начинающим я переинженерил AI для крестиков-ноликов. Я хотел сделать игру с непобедимым AI. Мне удалось достигнуть этого, запрограммировав компьютер на знание всех возможных ловушек. Звучит круто не правда ли? Это заняло почти 40 000 тысяч строк в основном скопированного кода и месяц моего свободного времени.
Позже я выучил структуры данных и узнал про алгоритм Минимакс, который при меньшем размере кода не только делал нужное, но еще и делал это лучше.

Так что учитесь на моих ошибках и не будьте излишне амбициозны. Концентрируйтесь на обучении тому как делать игры, а не просто делайте их.


Планирование, анализ столкновений, физика, уровни, искусственный интеллект






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

До сих пор, вы, вероятно, программировали как придется. Это закончится на этом этапе. В реальном мире большинство процессов разработки завершается до того, как будет написана первая строчка кода. Ничто не может быть хуже, чем осознание того, что для того чтобы добавить в вашу игру то, что вы хотите, вам придется выкинуть весь написанный код, потому что вы не спланировали все заранее. Теперь, когда у вас есть опыт создания игр, вы знаете из чего состоит процесс разработки. Теперь вы можете планировать игры, перед тем как начинать их делать.

Теперь про вашу следующую игру. Break Out и Puzzle Bobble хороши для третьего проекта, потому что они включают в себя продвинутое распознавание столкновений и физику. Физика важна, поскольку дает игре реалистичное ощущение. Даже в Super Mario Brothers есть ощущение гравитации и инерции. Бильярд отличный проект для тех, кто хочет напрячь извилины физикой.

В играх типа бильярда вам нужно не только обнаруживать столкновения, но и обрабатывать их в определенном порядке. Обработка столкновений разительно отличается от их обнаружения. Хотя создание бильярда или 2D платформера может показаться простым делом, анализ столкновений в правильном порядке — запутанный процесс, и не должен быть недооценен.

Break out и Puzzle Bobble так же включают дизайн уровней и требуют загрузки и освобождения их ресурсов. Хорошим опытом будет создание редактора уровней для игры. Редакторы позволяют вам легко создавать уровни и не вынуждают впаивать их в приложение. У меня есть статья(англ.) про создание редактора уровней.

Так же вы возможно хотите попрактиковаться в написании искусственного интеллекта (AI). Один из вариантов — вернуться к крестикам-ноликам или четырем в ряд и написать непобедимый AI. Теперь вы уже должны знать структуры данных и сможете использовать знания о деревьях для использования алгоритма Минимакс. С этим алгоритмом вы можете просчитать все возможные исходы крестиков-ноликов и создать непобедимый AI. Забавно расстраивать им своих друзей. Так же вы возможно захотите сделать разные уровни сложности. Игра не приносит радости, если в нее нельзя выиграть.

Pac Man — отличный способ попрактиковаться в написании AI. Нужно будет знать структуры деревьев/графов и алгоритмы поиска, типа A*, для того чтобы призраки могли пройти через лабиринт. Так же нужно будет сделать чтобы призраки работали в команде. Все это пригодится когда вы будете делать игры со сложным AI, типа стратегий в реальном времени. Об основах AI можно прочитать тут(англ.).


Платформеры, Action/Adventure, RPG, RTS, движки






Теперь, когда вы получили опыт создания хорошо спланированной игры, вы готовы к созданию Action/Adventure/Платформера. Это будет кульминация графики, движения, анимации, анализа/обнаружения столкновений, физики, AI, программной архитектуры и всего остального, что вы изучите к этому моменту. Тем кто более амбициозен, можно предложить сделать стратегию в реальном времени(RTS) или ролевую игру(RPG). Будьте осторожны, потому что RPG и RTS действительно огромные проекты.

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

RTS также сложны архитектурно, а так же требуют много AI. Вам нужно будет делать поиск пути для юнитов, получение ими команд, разное поведение в зависимости от полученных команд. Если вы никогда до этого не делали AI, будет лучше начать с клона Pac Man'а для начала.

Вероятно вам впервые придется делать движок для вашей игры. Чего следует избегать, так это создания универсального движка. Создавая движок не пытайтесь сделать его подходящем для любой игры. Если ваша игра требует x, y и z, делайте движок который умеет x, y и z. Движки создают исходя из того что нужно для конкретной игры, а не из того что любой игре может потенциально понадобится.

Другая распространенная среди новичков ошибка — это попытка создать движок в качестве первого проекта. И обычно это универсальный движок. Вам не нужен движок с фантастической графикой для создания Pong'а или Space Invaders. Программируя, легко закопаться в деталях. Концентрируйтесь на общей картине и завершайте свои игры.


Сеть


Кажется все хотят сделать следующую большую MMO. Создание онлайн игр не то, во что можно быстро вникнуть. Я понял это когда попытался сделать онлайн покер сразу после завершения крестиков-ноликов.

Добавление сети значительно усложняет игру. Когда один игрок что-то делает, вы должны послать информацию об этом всем остальным. Это все равно что если бы ваша правая рука не знала о том, что делает левая. Так же вам придется выбирать между загрузкой сервера и тем что он может контролировать. Чем больше делает серверная часть, тем меньше возможностей жульничать у клиента, но это также означает большую нагрузку на сервер. Для action и других игр с высоким темпом геймплея, вам придется беспокоится о сетевой задержке и потере пакетов.

Вам следует полностью закончить хотя бы одну хорошо спланированную игру, перед тем как пробовать делать сетевую игру. В качестве первого сетевого проекта, попробуйте сделать что-нибудь, что не критично к скорости. Например простой чат-сервер/клиент будет хорошей практикой. Так же можно вернуться к крестикам-ноликам/четырем в ряд и добавить в них возможность играть в по сети. Как вариант попробуйте сделать сетевую карточную или настольную игру.

После того как ваш первый сетевой проект готов, попробуйте сделать что-нибудь в реальном времени. В вашем первом сетевом приложении вы, вероятно, использовали TCP, чтобы быть уверенным в том, что данные которые вы принимаете доходят в том порядке, в котором вы их посылали. Для игр в которых происходит много действий, задержки создаваемые TCP вероятно будут слишком велики, так что вам придется использовать UDP. UDP не гарантирует порядок доставки как и саму доставку вообще. Так как UDP не делает дополнительных проверок целостности он быстрее. Вам придется пожертвовать легкостью использования TCP, в обмен на скорость UDP и необходимость самостоятельной проверки целостности данных при создании игры.


3D игры


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

Хорошая новость в том, что если вы уже сделали 4 или 5 игр, вы уже знаете основы необходимые для создания игры. Вы уже хорошо знакомы с процессом разработки и знаете свои возможности как программиста. Неважно трехмерный шутер или двухмерный, он по прежнему шутер. 2D RPG или 3D RPG по прежнему RPG.

Не считайте это оправданием пропустить 2D и сразу перейти к 3D. Прежде чем научиться бегать, нужно научиться ходить.


Быстрый способ


Говорите, что вы учитесь быстрее если сразу возьметесь за дело и будете просто писать вашу 3D MMOFPSRTSRPG и научитесь тому, что нужно по мере необходимости? Чтож, вот пару советов, которые вам помогут:
  1. Идите на местный рынок
  2. Купите целую рыбину. Рекомендую взять лосося или треску, хотя и сом тоже подойдет. Форель, кстати, тоже довольно эффективна
  3. Идите домой и включите компьютер
  4. Запустите вашу любимую IDE
  5. Теперь возьмите купленную рыбу и влупите себе по голове
  6. Повторите пункт 5, пока мысли о быстром способе не покинут вас

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


Путешествие начинается


Теперь, чтобы у вас было общее понимание того что же все-таки делать, пора начать заниматься игроделом. Я не ожидаю что вы будете следовать этому руководству слово в слово. Все учатся по разному и с разной скоростью. Если вы что-то и должны были вынести из этой статьи, так это три вещи:
  1. Выберите свой темп
  2. Доделывайте игры до конца
  3. Концентрируйтесь на обучение, а не просто на создании

Удачи вам на пути разработки игр!
@TatriX
карма
30,0
рейтинг 0,0
Программист
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (51)

  • –16
  • +70
    Без этой картинки никак

    image
    • –3
      На самом то деле, университетское образование и есть то самое «ошибка начинающих разработчиков это начать с большого проекта основанного на Крутой Идее». Что человек, получивший тонну знаний по получении диплома сможет построить космический корабль или написать халфлайф. Самыми эффективными являются знания, полученные в процессе, который эти знания запросит к получению.
      • 0
        Более того, я считаю что так и только так можно получить нужные знания и опыт. Но в действительности базис все равно необходим.
        • 0
          Но качественно войти в сознание основа может только при желании и понимании, хотя бы общем, какой смысл это всё имеет.
    • 0
      Картинка не отображается.
      • 0
        11 месяцев спустя…
        • 0
          Часто посты задним числом читаешь, но узнать, что тут происходило, все равно хочется.
          • 0
  • +11
    Совет про «Быстрый способ» надо запомнить, он годится далеко не только для программирования игр…
    • 0
      не только свежая рыба, даже тушка замороженного гуся вполне подойдет
      • +1
        Впрочем можно и кирпичём. Дёшево и сердито.
        • +1
          Кто сказал «Кирпич»?

  • +24
    Вы забыли самый главный совет: перестаньте тупить в инете и начните уже писать хоть что-нибудь!
    • +3
      Дисклеймер: Внимание, представленная ниже ссылка ни коим образом не оскорбляет никого из участников, а так же не несет в себе цели скомпрометировать автора (меня). Данная ссылка представлена для ознакомления, и не является матом.

      Пиши код, блин
      • +2
        «Дисклеймер»… мда…
  • +1
    Хочется увидеть примеры Ваших игр.
    P.s. я сам сейчас обучаю людей делать игры — и веду их примерно по тому же пути что и вы описали.
    • +3
      Игры автора оригинального текста.

      Что касается моих игр, я сам только учусь.
      В сети есть только кривенькая поделка в стиле бомбермена на js.
      • 0
        сколько всего уровней то? или они рандомно генеряться и сколько угодно?
        • +2
          Генерятся рандомно, и с каждым уровнем врагов все больше.
    • +1
      Нашел еще недотетрис на div'ах.
      • –1
        А почему «кривенькая поделка» и «недотетрис» если в соответствии с п. 2 «Доделывайте игры до конца»?
        Нарушаем!))
        • 0
          Они в общем-то завершены.
          Просто качество их реализации оставляет желать лучшего.
          Хотя, учитывая что это не продукты для широкой аудитории, а просто, в случае бомбермена, упражнение на прочитанный мануал по канвасу, а в случае тетриса — реализация идеи, что каждый программист должен написать свой тетрис, то уровень меня вполне удовлетворил.
  • +1
    Статья, все-таки, является частным случаем изучения программирования на конкретных примерах, в данном случае на играх.
    Другими словами, если взглянуть ширЕе, то посыл должен звучать так:
    1. Поставленные задачи должны быть реальными и востребованными, а не браться из воздуха, только ради отработки какой либо технологии или алгоритма. (пусть будет тетрис, пакман, пид-регулятор в цистерне, идеальный раскрой листовой заготовки, но не минимакс сам-по-себе).

    Все остальное про доделывание до конца, и обломовскую демагогию — верно. Программирование — это опыт, опыт и еще раз опыт, будь ты хоть физик, хоть лирик.
  • +3
    Быстрый способ — до слез!
  • +1
    Рекомендую взять курс An Introduction to Interactive Programming with Python.
    В рамках курса за восемь недель надо написать несколько игр, начиная с консольных (Rock-Paper-Scissors-Lizard-Spock, Guess the Number) и переходя к графическим (Stopwatch Game, Pong, Memory, Blackjack и RiceRocks).
  • +1
    А я начинал с гоночек на паскале) Впринципе идея почти таже что и в тетрисе… Делал еще в школе, так что исходники безвозвратно потеряны, но спагетти конечно были и очень длинными, я тогда еще не знал, что такое ООП и паттерны…
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Ссылку плз!
      Или хотя бы скриншот.
      • НЛО прилетело и опубликовало эту надпись здесь
  • +7
    Это заняло почти 40 000 тысяч строк в основном скопированного кода и месяц моего свободного времени.
    Примерно лет в 9 сделал свои первые крестики-нолики на чём сумел — в PowerPoint из сотен документов и тучи гипперссылок между ними. Человек всегда ходил первым, комп всегда играл линейно и сводил игру в ничью или выигрывал, если человек ошибался. Помнится, дядя-нефтянник сильно удивился, когда я его попросил поиграть в мою собственноручно созданную «игру» =)
    • 0
      А зачем нам знать, что ваш родственник нефтянник?! =)
      • +1
        Просто дядя в технике не очень понимал, и потому ему показалось, что я сделал что-то очень сложное, сделав такую вот «игру».
        • –1
          Вы так и не ответили на мой вопрос.
          • +1
            Вам конечно же совсем это не нужно, и особой причины, почему бы мне стоило упомянуть это тоже не было. Просто я запомнил дядю именно как нефтяника, приезжавшего со смены раз в полтора месяца, и подумал, что это может вызвать некоторый ассоциативный процесс, который бы дополнил картину происходящего в голове у тех, кто прочтет мой маленький комментарий.
            Я удовлетворил ваше любопытство?
  • +2
    Забавно, но я многое упустил. Можно сказать 1-я моя игра, это браузерная онлайн игра в Вконтакте. Делал 2 месяца, скоро будет ей год.

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

    И еще. Если сделали игру, то надо ее улучшать, обновлять. Онлайн игра никогда не может быть закончена. Если она закончена, то она потерпела фиаско.
  • +5
    Блин, как же грустно. Вы не поверите, но статья закончилась ровно на том, что я уже сделал, а читал с таким интересом, ожидая, что и для себя что-то новое найду :(
    • +7
      Что, правда написали свой Варкрафт и не знаете, куда двигаться дальше?
      • +2
        Что значит «свой»? Я его и написал.
        • 0
          Тогда я вам помогу, пишите четвертый )
  • +1
    Где ж вы были год назад?) Мне б эту статью туда и столько времени не было бы потрачено…
    • 0
      Не переживайте, вы еще очень молоды и у вас еще все впереди :)
  • +1
    И никогда не забывайте, что все знания, выстраданные из муки игрового творчества, не пропадут даром.
  • +1
    В пэкмене нет никакого выдающегося AI, пруфлинк.
    • +4
      Посмотрел линк, там как раз описаны достаточно выдаюшиеся идеи, при том, что они очень просты в восприятии, на этом конкретном примере. Идея различий в алгоритмах, когда один «призрак» идет на текушую позицию, другой предсказывает дальнейшее развитие событий, а третий рандомит, это может быть стояшей идеей для многих ситуаций, которая далеко не для каждого очевидна.
      • +2
        это может быть стоящей идеей для многих ситуаций
        Примером чего является одна из карикатур нынешней осени:

        [Free Pussy Riot! Заебали!]
  • +3
    Я думал я один такой, кхм, маньяк, который в школе все ходы крестиков-ноликов просчитал и в коде копипастил :) Ан нет — нас много!

    З.Ы. Вот только арканоид (на паскале) у мну был перед тестрисом (на экшнскрипте). Видимо поэтому я не стал геймдевом. Нарушил последовательность…
    • +1
      Да, таких довольно много. И самое печальное, что довольно увесистая часть так и остается на этом уровне… А потом смотришь исхода какой-нибудь игры и не веришь, что такое вообще возможно писать…
  • 0
    А мы с другом, в пору увечения тетрисареной (кстати сайт до сих пор открывается, может авторы на хабре, ау?), написали свой сетевой тетрис и проводили по нему чемп в общаге :)
  • 0
    А почему ни как перевод оформили?

    И еще нашел в FAQ'е у автора следующее:

    Q: Can I port your code to Java/Perl/Python/C or translate your tutorials to another language?
    A: No. From what I learned in my business law course, copyright law is sticky to say the least. If I do allow people to translate my tutorials who has rights to those translated tutorials is an complete mess. I'd rather just not deal with it

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