Найти в Дзене
NoraDev

Проблема создания игр. Часть 2 - "Только код - только хардкор"

Предисловие Если Вы не прочитали предыдущую часть - то прошу ознакомиться с ней по этой ссылке. Там я кратко рассказал, как начал создавать первые игры на конструкторах и показал что у меня получилось (из того, что сохранилось, конечно ;) ) Как ни парадоксально, но кодом я написал игр больше, чем создал в конструкторах (закончил, правда, не все, но это другая история xD ). Вся суть в том, что когда я начал осваивать для себя такую обширную тему, как "Программирование" - мой азарт увеличился. Я осознал, что я могу написать все что угодно и ничто меня не ограничивает (кроме характеристик ПК, конечно :) ) и "я пошел в разнос". Чего и на чем я только не программировал? Языков уйма: Delphi/Pascal (ABC Pascal, FreePascal, Turbo Pascal), C/C++ (GNU GCC и G++/C++ Builder/Turbo C++ 3.0/Microsoft Visual C++/Qt GUI), C# (NET. Framework/Mono), Python (2.x/3.x), Java, JavaScript, QBasic/VBasic (Под Windows и DOS). Как изучал новый язык - так сразу начинал писать на нем игры. Скриншотов, материалов
Оглавление

Предисловие

Если Вы не прочитали предыдущую часть - то прошу ознакомиться с ней по этой ссылке. Там я кратко рассказал, как начал создавать первые игры на конструкторах и показал что у меня получилось (из того, что сохранилось, конечно ;) )

Как ни парадоксально, но кодом я написал игр больше, чем создал в конструкторах (закончил, правда, не все, но это другая история xD ).

Вся суть в том, что когда я начал осваивать для себя такую обширную тему, как "Программирование" - мой азарт увеличился. Я осознал, что я могу написать все что угодно и ничто меня не ограничивает (кроме характеристик ПК, конечно :) ) и "я пошел в разнос".

Чего и на чем я только не программировал? Языков уйма: Delphi/Pascal (ABC Pascal, FreePascal, Turbo Pascal), C/C++ (GNU GCC и G++/C++ Builder/Turbo C++ 3.0/Microsoft Visual C++/Qt GUI), C# (NET. Framework/Mono), Python (2.x/3.x), Java, JavaScript, QBasic/VBasic (Под Windows и DOS).

Как изучал новый язык - так сразу начинал писать на нем игры. Скриншотов, материалов (*.bmp файлов, файлов проектов, исходного кода), gif анимаций, видеозаписей и прочего у меня накопилось столько, что начало напоминать "старый сундук без ручки" (Да, "и выкинуть жалко, и нести уже не удобно"). Все это по распихано по OneDrive, Google Drive, Яндекс диску, перепискам в соц. сетях, на жестком диске и даже сервере.

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

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

Напрягает и тот факт, что если я сажусь за чужую игру - в голове "плюс-минус" начинаю разбираться как реализована та или иная механика. И в какой-то момент загораюсь желанием создания чего-то, а игра "удачненько дропается" и больше я к ней не подхожу (Обычно, такие признаки называют игровой импотенцией, и наступают они после 30 лет, но программирование сломало все уже к 17-18 годам. В общем - у меня профессиональная деформация восприятия игр ;) ).

С данной ситуацией я совершенно отстал от игровой индустрии. Меня не заинтересовывали "прям" новые игры и я не следил за "мейнстримом". Да что уж там, я GTA IV - месяца 2 назад попробовал поиграть (Мне 27 "годиков" так-то, игра вышла очень давно, 2008 год аж! xD), но мы отвлеклись. Поговорим о том, что я создавал и на чем.

Для того, чтобы статья не показалась Вам слишком "душной", некоторые части ее я помечу так:

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

Borland Delphi, C++ Builder, Lazarus и Паскали, -"мать их"

Язык Pascal давно мертв, как и почившая компания Borland с ее Delphi.

В сообществе программистов считается "зашкваром" использование Pascal, Delphi и даже C++ Builder, но я порой "грешу" этим, скрывать не буду. xD

Уж очень я полюбил среду разработки Borland как первую в моей жизни.
Она приносит мне удовольствие и расслабляет после тяжелого дня. :)
Да и я не работаю программистом (от того я и "Nora Dev"), а программирую чисто для себя или когда кто-то попросит меня что-то "сбацать".

Первые игры были написаны как раз таки на Borland Delphi 7 и Borland C++ Builder 6. Давайте на них и глянем.

Игра Uix

Вот например, пусть и не самый первый проект (Не законченный. Да что уж там - я явно свернул куда-то не туда и Вы поймете почему xD ), но экземпляр интересный - Uix (версий было несколько, это же первая).

Создал я Uix на Borlnad C++ Builder 6.0.

На самом деле - это первый мой опыт перехода с Delphi на C++. Я до последнего недоумевал, почему код практически тот же, что на Delphi - я могу использовать в C++. В чем же тогда разница?

Я бы не опытен и библиотека визуальных компонентов сбила меня с толку, но тем не менее - минимально с C++ я познакомился тут.

Замысел был в том, чтобы сделать мультиплеерную игру в стиле JRPG используя TCP/IP сокеты.

Если "Марию" (см. тут) я рисовал как первого JRPG персонажа, то персонажи из этой игры - были второй "пробой пера", давайте я Вам их покажу (не судите строго, итак испытываю "испанский стыд" xD).

Мои JRPG персонажи.
Мои JRPG персонажи.

Что интересно, первыми были нарисованы предпоследний и 5-й персонажи, так как они создавались для другой программы и потом были перенесены сюда, но об этом в 3-й части статей. ;)

Рисование некоторых персонажей (в ускоренном режиме) для Uix игр (как я уже говорил - их было несколько) я даже записал и выложил в YouTube, правда сейчас эти видео скрыты, но я все равно дам Вам ссылки на них, если очень интересно ;)

В видео персонажи, что на рисунках - тоже были нарисованы мной. В последнем видео я и вовсе беру игру про "Марию" (из первой части этих статей) и начинаю адаптировать ее под этот "тайлсет". Это очень смешно выглядит сейчас. xD

Думаю, рисунки, что были на видео - тоже стоит показать (кроме второго, у меня он не сохранился).

Оба рисунка были нарисованы в Paint по пиксельно.

Да, я долбанутый человек, который часами вырисовывал каждый гребаный пиксель этих персонажей! И что Вы мне сделаете? xD

После ручного рисования я даже создал программу, которая генерировала персонажей (такой вот конструктор JRPG персонажей).

После того, как я запустил свой Uix 1 - решил проверить на компьютере друга. И тут я заметил очень неприятную особенность: код C++ Builder 6.0 требовал vcl60.bpl и rtl60.bpl библиотеки в системе, которые поставлялись со средой разработки (Тогда я не знал, что библиотеки можно зашить в приложение - выключив динамическую линковку в проекте) и естественно у других людей его не было в наличии.

Огорчившись данным явлением - я решил перенести код на Delphi.

Как Вы уже, наверное, поняли - в Uix 1.0 не было игры. Я там создал: плеер; сервер TCP/IP; терминал; браузер, редактор html страниц, но не игру. Получилась мини оболочка наподобие Windows.

Потому я и сказал, что свернул - куда-то не туда. Ооооочень куда-то не туда ;)

Затем я начал переписывать игру целиком, так и вышел Unix 2.0, который Вы можете посмотреть на следующих "скриншотах".

Uix 2.0 я пытался допилить до состояния игры, даже попробовал сделать конструктор уровней.

Конструктор уровней Uix, который можно вызвать только через терминал Uix
Конструктор уровней Uix, который можно вызвать только через терминал Uix

Но, как видно - получилось так себе. xD

Не смотря на передачу данных, сообщений по TCP/IP и анимацию персонажей - игрой Uix 2 так и не стала.

Кто бы, блин, сомневался? xD

После этого, я начал делать Uix 3.0. Он игрой тоже не стал, но я пытался заставить себя его допилить тем, что выкладывал процесс разработки на YouTube. Видео сейчас не доступны, но там такая "нудятина", что показывать это не вижу смысла. :)

Знали бы Вы - чего мне стоило восстановить Uix 3.0, чтобы показать Вам... В общем, совет дня - не называйте русскими буквами никакие файлы, которые участвуют в работе приложения, чтобы через 10 лет не встревать в аналогичную ситуацию, когда код есть, но он не пашет просто так! ;)

Как Вы уже, наверное, заметили в Unix 3.0 была возможность даже менять тему оформления.

Так и загнулся проект Uix с концами.

Но на этом написание кода не ограничилось.

Игра AniDroids

Вдохновленный все тем же Dwarf Fortress - я решил сделать игру наподобие - Kiberium (из первой части статей), но тут я уже стал играться с генератором случайных чисел.

Игра генерировала случайный остров, состоящий из областей с несколькими спрайтами (мини сцены).

Генерировался мир очень долго, программа при этом зависала и не отвечала. На генераторе вся игра и кончилась.

Если присмотритесь - то увидите, что я даже написал сообщение во время генерации мира: "Генерация мира не простой процесс, потому программа может зависнуть. Это не значит, что она "заглючила", просто она не успевает показать все и одновременно записывать Ваш мир в файл. Потому не пугайтесь. Когда все закончится - игра откликнется и покажет результаты!", правда - там написано это все очень безграмотно (тут я немного подправил текст. Считайте это "авторской версией") ;D

Однажды я решил возродить Uix, но сразу принялся за RPG составляющую, в которую входили элементы песочницы. Для разработки использовал Lazarus.

Новая попытка с Uix

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

Игра "Соланис расцветет"

Был и такой период - когда я увлекался играми для консоли (или терминала), потому на FreePascal я писал именно такие игры. В основном это были рогалики, но та, что я покажу сейчас - песочница с тем же генерируемым миром.

Забавно осознавать тот факт, что на тот момент - делая выполнение 4-х операций в одном цикле я считал их как 4 вычисления (или даже 4 потока). Программа быстрее не генерировала, но я думал иначе. Юность. :)

Задумка была интересной, учитывая, что консоль работала только пошагово (захватывая клавишу и только после нажатия ее - что-то происходило), ДНК я делать начал (рисунок 2), но самих существ "не завез". Игра скончалась быстрой смертью - я переустановил ОС и забыл сохранить исходник.

Да, я "долбаящер" в этом плане. Кто сносит ОС - не сохранив файлы? Может быть что-то хорошее бы и сделал. Но увы.

Это не последняя консольная игра, написанная на Pascal, и сейчас я расскажу о игре на Pascal ABC.

Игра "Ичи - жизнь коротка" (она же Dragon Night)

Как-то раз я посмотрел одно аниме "Пластиковые воспоминания". Тогда это аниме оставило на мне большое впечатление (сейчас я его смотреть не могу, слишком уж много там "стекла") и я начал делать игру на его основе. Игра - сплошной "испанский стыд". Даже тогда я осознавал это и не продолжил ее доделывать, но как "фанфик" - "почему бы и да"? xD

Игра повествует о роботе, который только начинает свою "жизнь". Замысел был странный и неоднозначный. В моей задумке было ограниченное время и заряд батареи персонажа, поэтому он мог бы что-то успеть сделать, а что-то нет. Ну и зарядку - никто не отменял. По той же задумке в определенные часы игрового времени - должны были происходить те или иные события. Мир должен был как бы "жить" в своем ритме. Некоторые события были бы судьбоносными, да и вариация взаимодействия позволяла бы нелинейно проходить игру. Но "словив испанский стыд" от своих же "реплик" (которые Вы, думаю, уже заметили на анимации xD ), что-то я проект забросил. К сожалению - *.pas файла у меня уже нет и думаю, возможно, даже к лучшему. xD

Почему к лучшему? Ну... тогда я только начинал писать код, мне было лет 16-17 и я не умел использовать циклы! Ну... как не умел... Я не знал о их существовании (Да, это тупо xD ) и по советам с форумов я использовал инструкцию goto, которая мало того, что создавала бесконечный цикл вместо while, так еще я умудрялся делать игру нелинейной за счет него! Представляете - какую паутину из кода я там написал? "Там черт ногу сломит". Легче переписать игру и забыть. :)

Игра SEKAI NO OWARI Level

К этой игре не было смысла прилагать анимацию или скриншоты (ритм-игра идет с музыкой), потому я записал видео геймплея.

Предыстория этой игры немного необычная. Был у меня как-то друг (общались по сети только), ну и он загорелся идеей тоже программировать. Я решил его научить программировать на Delphi 7. В качестве "демки" (чтобы он мог изучить код) - я создал эту игру (и да, она законченная). Игра маленькая, в ней всего один уровень. Слева движутся блоки и если блок касается нужной ячейки - надо нажать соответствующую клавишу (они обозначены в правом верхнем углу). За попадания получаешь очки, а блок пропадает (исключение - голубой блок, его можно нажать 2 раза).

Сейчас смотря на эту игру - видно, что графика глючная (прозрачность углов блоков исчезает), а блоки пропадают без эффектов, а порой и раньше нужного блока (даже если попадаешь).

Причина этому проста - я использовал TImage компоненты, и двигал их по экрану. Тогда я не знал, что в Bitmap есть Canvas и в нем можно рисовать эффективнее, быстрее и гармоничнее. ;)

Друг этот, на лето уехал в деревню (он был на 2 года младше меня) и больше не появлялся на связи. Не знаю что с ним приключилось. Может быть он просто на меня забил (если да - зла не держу), но игру он так и не увидел.

Попытка в будущем сделать игру с несколькими уровнями и редактором карт.
Попытка в будущем сделать игру с несколькими уровнями и редактором карт.

Тесты 3D на GL Scene

Есть некая библиотека, созданная для Delphi и Lazarus под названием GL Scene. Я просто на тот момент попытался перейти на 3D, но OpenGL для меня казался "лютым", а в DirectX я даже не смотрел (не помню почему) и я наткнулся на библиотеку GL Scene. Ну... не совсем на нее. История в какой-то мере повторяется, так как это была статья по созданию Minecraft, но уже в 3D и на Delphi 7. Я подумал - "во круть", я обязан попробовать. xD

Сейчас этот сайт я уже не найду (возможно он "ушел в историю"), но я помню что на скриншоте был "Стив" с переднего вида, паук, крипер и стояли они на небольшом кубическом участке из травы, земли и "бедрока".

Я скачал пример его, почитал статью. Открыл пример... и... мой комп решил послать эту игру на 3 буквы. Тогда у меня был нетбук, очень слабый и даже маленькая область этого примера нагружала процессор так, что даже повернуть камеру - было проблемой.

Но я все равно прошелся по области, попробовал что-то сломать и понял, что ломать блоки нельзя. Было немного разочарующе, но советы из кода помогли мне по делать другие 3D игрушки. xD

Игра Comsos

Игра Cosmos на Delphi 7
Игра Cosmos на Delphi 7

После того, как я наигрался с тестами - принялся писать осмысленную игру.

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

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

Стоит ли говорить, что игра зашла в тупик (вместе со мной)? :)

Игра (или даже локация) NoChessLogic City на Delphi с OpenGL

Эта игра является "нашлепком" на другую игру (ChessNoLogic), о которой я поведаю дальше. Суть была в том, что эта сцена должна была открываться при входе в город или в режиме битвы. Ландшафт считывался с файла bmp (рисунка), и в зависимости от яркости белого цвета - строил горы по диагонали. Так и получилось, что горы не ровные и угловатые.

А сколько времени я убил на то, чтобы не проваливаться в текстуры - ууу

Это был интересный опыт, но игра загнулась после "Нового года" (вместе с клавиатурой на планшете, что прискорбно).

Игра ChessNoLogic

Как я уже говорил - игра должна была иметь режим сражения и вхождения в город. NoChessLogic - это попытка создать что-то похоже на "Героев Меча и Магии 3", но играть бы приходилось за шахматные фигуры. Идей было много - но реализовать я их не смог. Кстати - тут я впервые программировал "туман войны" и это был хороший опыт. Игру я пытался еще перевести на Python и C++, но и эта версия (та, что на анимации и изображениях) - уже не первая. Первая была на Delphi 7.

Игра AstraAttack

AstraAttack на Embarcadero Rad Studio XE (по моему 8-й)
AstraAttack на Embarcadero Rad Studio XE (по моему 8-й)

Когда я узнал о Embarcadero и их Delphi XE, который может писать приложения под андроид - я очень заинтересовался этим и попробовал создать игру, которая работал бы и на Windows и на Android (Библиотека Firemonkey стремится к этому). Игра называлась AstraAttack. В ней должно было быть 2 расы "Астры" и Люди. Чем-то должна была напоминать Warcraft III, но с уклоном RPG составляющей. Героем нужно было бы управлять напрямую, а давать команды поселению - опосредованно.

Первая графическая игра на Pascal ABC.

Однажды я решил под засесть за Pascal ABC и начал писать игру про того же Ичи. Замысел был в том, чтобы он умер и очнулся механическим роботом. Сама игра заглохла на моменте - когда производительность Pascal ABC начала сильно проседать. Но игру я еще долго пытался создать на других языках. Переписывал даже на C++ с SDL1.2.

C/C++/C# "эволюшн"

На C++ с SDL1.2 я много чего программировал. Мне нравилось, что игры можно было компилировать как под Linux, так и Windows (даже портировались на Android). Но вот что очень не нравилось - это "дампы памяти", которые сложно было отследить. xD

Первые тесты C++ SDL1.2
Первые тесты C++ SDL1.2

Как я уже говорил - Life Quest я переписывал и на C++. Вот Вам та же игра, но на C++.

Life Quest C++ SDL 1.2
Life Quest C++ SDL 1.2

Так же баловался с редактором картинок, прям написал программу, которая генерировала попиксельный массив из кода C++ (она была и на Android портирована).

Matrix Editor
Matrix Editor

Следующая игра дальше заставки не ушла. Примечательна она тем, что однажды я запустил ее из под TTY (консольного режима Linux), что привело к очень забавному рисунку (рис. 2).

Neo Life была вдохновлена игрой Might & Magic 4. Мне хотелось создать 2D мир, в котором можно гулять как в 3D. Что-то даже получалось. Была смена времени суток и вид можно было менять на RogueLike (на картинках можно увидеть крестовину - это порт на Andoid).

До того, как заняться OpenGL на Delphi - я игрался с ним на C++ с FreeGLUT. Было интересно. Такой вот куб сделал, который потом использовал как логотип одной программы.

Еще один интересный экземпляр. Писал я его на C#. Задумка была в том, чтобы мы создавали мир по атомам, потому я собирался внести в игру всю таблицу Менделеева с описанием всех веществ. Слишком амбициозная идея была.

Python и PyGame

Python3 с PyGame тоже развлекли меня достаточно. Так я ресурсы Uix попытался использовать для отдельной игры про волшебницу.

Так же на Pygame попытался перенести ChessNoLogic.

ChessNoLogic Pygame
ChessNoLogic Pygame

Заключение

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