Я делаю псевдографическую консольную песочницу, но зачем?
Мини-предисловие: я одновременно хвастаюсь показываю, какую я классную херню написал и прошу небольшой помощи. Я пытаюсь писать эту игру для попыток самообучения программированию, не более того. Я не претендую на создание "великой игры и что б корованы грабить", просто в процессе написания требуется знать всё больше и больше, а это полезно. Пишу на PascalABC.NET;
Посмотрите на скриншот с последней версией игры. Не знаю, что видите вы, но я вижу бородатого зеленоглазого гнома, озеро с песчаным дном, на чернозёмном берегу которого произрастает роща деревьев. В чём смысл игры? Вид сбоку, мы управляем квадратом с буквами PL(ayer), можем ломать и строить(блоков всего 7, воздух, вода, песок, камень, земля, бревно и листва), падать и немного-карабкаться, есть примитивная физика игрока и текуче-сыпучих блоков (песок и вода). В сочетании с консольностью звучит неплохо.
Но только звучит. А на деле - управление только с клавиатуры, карабкаться можно только на одиночные ступеньки (но падать куда угодно), строить и ломать по принципу и расстоянию хода короля - тоже с клавиатуры. Из меня плохой геймдизайнер и многие решения выглядят спорными. Например сейчас я пытаюсь понять, добавит ли крафт и другие выживальческие штуки интереса и разнообразия игре. Но что я точно понял - так это то, что делать игру с нуля интересно, что это побуждает изучать странные вещи, о которых я бы даже не подумал, вроде клеточного автомата для генерации пещер сейчас и целой кучи алгоритмов, которые я планирую внедрить в генерацию карты позже.
Кстати о карте - примерно так выглядит сейчас её левая четверть. Другие выглядят также, но не суть:
И вот так она выглядела немного раньше (ВК замымилил, а оригинала не осталось, уж извините):
Теперь о истории "проекта". Я сидел себе дома, заканчивал школу, гонял Инвокера в дотке, как вдруг решил стать программистом. И что дальше, я выбрал Си, Плюсы, Шарп, может быть Джаву или Питона? Нет, я выбрал ПаскальАБЦНЕТ. Он проще и именно его нам показывали в школе. Сначала я открыл для себя массивы и понял, что они могут быть многомерными. А многомерный массив это фактически готовая карта из блоков, которую можно легко рисовать прямо в консоли. Почему в консоли? Графика была (и есть) для меня слишком сложной, а консоль и легче и необычнее. На любое "что это за говно"? можно смело отвечать "Дева Мария, да это консольная, мать её, песочница! Ты много выдел консольных песочниц до этого момента? ". И все такие сразу "Вааааау, это консольное говно!".
Так вот. Как только я подумал эту мысль, то сразу осознал, что вполне себе могу двигать "камеру" по массиву при помощи того, что я назвал "корректирующая переменная", вроде поправки на ветер. Фактически, в этот момент графический движок был готов. Примерно так игра выглядела при первом запуске (Я, шарп, МОГ ДВИГАТЬСЯ! Ю-ХУ!)
Потом я подумал: я что, грёбаный супермен в вакуме? Почему я летаю сквозь статичные блоки? И добавил физику. Всё просто. Посмотрите на свой нумпад. Пусть цифра 5 это блок.
Если 5 это физичный блок, а в 1, 2 или 3 пустота - они падают туда. Ну и твёрдые блоки стали непроходимыми, игрок, кстати, тоже падает - но только вниз.
Окей, но чего то не хватает "песочнице". Точно, ведь в песочнице люди СТРОЯТ, а у меня карта каждый запуск генерируется новая... Значит, нужны сохранения. Ну тут всё просто, записываем массив мира в .txt. Однако прочитать карту обратно в тот раз у меня не получилось.
И тогда я впервые подумал о цветовой псевдографике. 16 цветов консоли. Вышло примерно это:
Это чудо я назвал Teminer color. Раз уж зашла речь о названиях, то они просто отражают суть игры. Te(xt)Miner, Pic(ture)Miner.
На самом деле мир был таким же, как на прошлом скриншоте. Но так как эту версию я уже научил кушать сохранения, то она загрузила карту последней версии, просто не отображая неизвестные её блоки дерева. Минусы? Это 800 вызовов отрисовки символа с цветным фоном за кадр! Чтобы было понятнее, это около 1ФПС при разрешении 41*21 в консоли. Играть в это невозможно и я забросил эту ветвь.
Но душа просила графики и я её таки сделал.
По сути, это просто графическая оболочка ветви $Teminer color$. В коробке сверху явно видно, что вода лежит неравномерно. Это норма, у меня физика такая. Она ещё и в соединённых сосудах не уравновешивается.
Где-то в этот момент я понял, что программист из меня, как из карпа самолёт и решил отдохнуть. Но проснувшись некоторое время назад я получил, словно молнию, острую мысль: "чувак, ты делаешь консольную игру, не отвлекайся на графику! Лучше использую оптимизацию!". Это было круто. Коротко о оптимизации: я теперь не рисую 800 вокселей ка отдельные слова. Я объединяю рядом стоящие одинаковые блоки из одной строки в одно слово. Как не трудно догадаться, в чистой воде ФПС вырос в ~40 раз, а в земляных рандомных недрах остался почти на том же уровне.
"С такой оптимизацией грех играть на такой карте" - подумал я и переделал генератор. Теперь он делает каменную часть карты, при помощи клеточного автомата строит пещеры, засыпает сверху землю и даёт ей физические свойства на время генерации (в игре земля не-физична), заливает сверху воду, добавляет на дно луж песочек и садит деревья на землю.
И ещё я попытался сделать меню. Оно условно работает. В смысле, оно есть при запуске, но выход из мира закрывает игру. Зато теперь можно создавать миры и загружать их. Это кое-что новое и интересное.
Но одновременно с этим код игры стал занимать 830 строк и я в нём окончательно запутался. Чую, что около сотни строчек - это редуценты от чего-то старого. Структура кода - говно. Использование возможностей даже PascalABC.NET на уровне "он пытается испечь пирог, починить монитор и забить гвоздь двадцатку с помощью кувалды". Параллельно я начал изучать Джаву. Сложно для меня с моей памятью. Я банально не могу запомнить синтаксис сложнее базовых операторов. Поэтому игру пишу именно с их помощью. А учитывая то, что писать то я её начал как раз для изучения всего сложнее базы... всё очень плохо, да.
В планах:
Крафт, больше блоков и плюшки выживания (вероятно для реалтайма можно использовать многопоточность, но я не уверен)
Сетевая игра (для изучения сокетов и вообще полезная вещь)
Новый генератор мира и улучшенная физика(изучение полезных и не очень математических алгоритмов)
И, разумеется, сразу две ветви:
1) Рефакторинг кода в паскале, больший уровень абстракции, ибо сейчас для маленького изменения требуется переписать изрядный кусок кода (развитие способности продумывать структуру проекта)
2) Перенос игры в её графической ипостаси на Джаву, там разбиение на части вроде не только проще, но и абсолютно необходимо из идеологии языка (изучение Джавы)
Да, и я буду благодарен за любую критику (но не говнометание) и советы. Советы как по игре в частности, так и по становлению программистом в целом. Если кому то интересно взглянуть на исходники, вот .pas (ну и всё остальное) файлы. Там же лежит гуглдок с кодом последней версии игры для тех, кому охота взглянуть на почти-псевдокод паскаля, но лень его устанавливать