Приветы. В общем пишу я тут игру. Точнее не игру, а небольшой движок для игр на js. Не то чтобы я большой погромист, чтобы таким заниматься, но вот занялся вот. Почти год уже его мучаю, допиливаю, отпиливаю, подумываю бросить, но всё делаю дальше. Ну а раз уж это именно движок для игр, то параллельно с ним надо конечно делать игры. На много игорь я не цезарь, но парочку вот калякаю.
Первая, это была проба вообще сделать что-то тыкательное и хоть сколько-то законченное на вид, плюс разобраться с тем, как еще заливать игры на яндекс-игры, это - Ветви. Дзен, все дела, поиск спокойствия и красоты (по мере возможностей).
Про вторую игру собственно пост. Делаю ее тоже уже приличное время (относительно). Именно для проверки нагрузки на движок взял максимально паристый вариант стрелялки - плоская карта, много объектов. Оказалось что таки js для таких вариантов подходит оч не оч, по крайней мере в виде моего движка, и свыше 20-30 активных юнитов на поле, при моих мощностях старенького компа, оно уже не вытягивает без заметного падения фпс. Но по сути да и хрен с ним, для игры вполне можно обойтись таким количеством юнитов на поле. <s>или пиздовать на юнити</s>
(были и другие игры, но пока вообще не до них)
Про саму игру. Планируется ничего сверхкрутого, просто сносный пример простого 2.5D шутанчика. Лор: инопланегады сбили наш транспорт, надо спасти экипаж. Будет несколько уровней, где сложность постепенно растет. Конечно развивать можно что угодно и до бесконечности, но пока цели простые. Сейчас вариант тестовый, никаких уровней нет, можно просто ходить и стрелять собак, и отмечать гнезда с экипажем.
Для чего пост. Хочется, чтобы кто-то подписался тестить немного то что получается, кидать советы про ограбления караванов и т.п. Ну и вдруг кто-то найдется, кто сможет что-то полезного сказать по движку, обсудить там всякие методы и подходы, а то в одно лицо хоть и удобно, но есть и недостатки, глаза замыливаются, <s>хочется вдруг кричать заебало блять всё,</s> ну и в целом, я как выше сказал, таки любитель, и конечно еще есть куда расти.
Ссылка на тестовый варик игры: https://innercat.ru/nest/test.html
Ссылка на движок: https://github.com/jkn-code/MGM.js
Ссылка на дискорд: https://discord.gg/mzmgJqH6Vj там можно будет пообсуждать всякое, только там никого нет и он не настроен, это потом.
В комменты принимаются мнения, ругательства, похвальба, если есть чо.
Подробнее
гиф анимация,гифки - ПРИКОЛЬНЫЕ gif анимашки,gamedev,Игры,сделал сам,нарисовал сам, сфоткал сам, написал сам, придумал сам, перевел сам,много гифок,InnerCat,mgm.js,nests
Например в цикле отрисовки заменить проверку и присвоение флагов на переход к следующему элементу if (not ok) continue; и скипнуть все проверки ниже которые уже заведомо не if (ok).
Сделать отдельный режим отрисовки по целым пикселям для производительности и второй с дробными для качества. Я помню когда писал игру на js сглаживание для дробных пикселей пожирало производительность.
Надо проштудировать MDN на тему оптимизации, думаю там должны быть какие-нибудь перформанс типс.
По ок/не ок с флагами, это вроде не самое тяжкое место (если я правильно тебя понял). Проверки я так понял из ковыряний и тестов много не жрут, чуть больше жрут операции математики всякой (лучше проверить и сложить, чем сложить и проверить), но уж что жрет, так это циклы в циклах, там я как смог урезал. Это не исключает конечно, что при создании игры можно вешать на каждый хрен проверки на касание со всем сраным миром в каждый кадр. Но такая проблема уже везде, я думаю, не только тут.
Если объекты не часто меняются я бы распихал их по отдельным коллекциям и сделал бы для итерации по каждой коллекции свой метод. Отдельная коллекция для объектов с update, отдельная для anim и т.д. Но таким путем можно прийти к переписыванию всего под ECS архитектуру, это опасная дорожка))
По движкам ничего не скажу, чукча – не читатель, чукча – писатель, но вот что точно я бы сделал, так это разбил проект на отдельные классы (простите джаваскриптизеры, на прототипы/модули). Потом если нужно все можно склеить при помощи webpack обратно в один файл. Будет в разы проще вести разработку.
Сейчас проект сложно читать потому что все в одном файле, и жизненный цикл, и загрузка ресурсов.
На какие-то отдельные части разбить бы надо конечно. В будующем обязательно.
Игровая картинка своей атмосферой сильно напоминает постъядерные пустоши. Камни, сухие деревья и пепел летающий в воздухе. Хотя может по этим гадам уже били чем-то ядреным
Ну и по отношению к другим движкам, мне не понравилось что все они весьма заморочены, и хотелось сделать что-то по возможности предельно простое.
Что отметил для себя:
Отлично:
1. Гнезда хорошо выделяются, их легко отличать от остального ландшафта как визуально, так и геймплейно
2. Мобы быстрые, их много и заставляют отходить от гнезд, что играет на руку напряжению
3. Цветовая гамма бедная, но при этом хотя бы геймплейно обоснованая, все просто и хорошо работает с точки зрения восприятия игрока.
4. Спидбуст работает отлично, но, возможно, стоит потестить возможность проходить им сквозь коллизии, даст дополнительную маневренность игроку
Сомнительно:
За что хвалил, как грится. Цветовая гамма настолько бедная, что после двух-трех ранов все сливается в серую массу и ты перестаешь обращать какое-либо внимание на окружение, кроме геймплейных объектов (кровь, гнезда, и т.п.)
2. Не уверен, хорошо ли оставлять таймер захвата точки после того, как игрок отойдет, не завершив его. На мой взгляд, он должен сбрасываться, иначе теряется динамика и внутреннее ощущение прогрессии, но, мб, это чисто мои загоны
Плохо:
1. Гранаты. Их неудобно бросать, их индикатор работает странно, сложно попасть в группу врагов, если не приноровиться, хотя, по идее, геймплейно они должны быть в крайне ограниченном количестве и быть максимально удобными, так как это - способ засейвиться от наступающей волны.
2. Мобы. Застревают постоянно в текстурах, нет никакого импакта по ним, если попадаешь (даже звука), нет поощряющей механики (вроде станлока или замедления, или даже заметного звука смерти), порой игрок может быть не уверен, попадает ли он вообще. В иных толпах (я попытался побегать по гнездам и собрать побольше мобов), вообще непонятно, что происходит, мобы сливаются в сплошную тень, кек.
В общем, делай ищщо. Если понадобится лор, сюжет, текст, смело обращайся, денег не возьму)
По цветам да, хотелось сделать мрачное, но что бы не была тупо чб картинка, накатил цветной кровяки. Смотрится странно, сам пока не понял как отношусь, но это лучшее что смог изобразить по визуалу пока.
За тест и фидбек, и за спасение экипажа)
и намутить свою игру.
Я советую тебе для начала обратить внимание как минимум - на следующие вещи:
- TypeScript - он поможет со статичной типизацией, что очень упростит и разработку и поддержку кода, позволит отловить многие проблемы еще на этапе написания кода. Ну и де-факто - это уже стандарт индустрии и без него никуда
- Какой-нибудь сборщик - чаще всего на слуху webpack - но для небольшого проекта я бы посоветовал, например, Vite - он попроще в настройке, и в нем многие вещи есть 'из коробки', как поддержка SCSS модулей например и много другое
И больше внимания уделить архитектуре кода - разбить твой монолит на более атомарные структуры - по классам / модулям и так далее - поддержка файла в 2000 строк - это ад
В целом - если у тебя нет конкретной цели - а как у самурая - есть только путь - то можно фигачить и так
А если есть желание развиваться дальше в направлении фронта и улучшать свой проект - то то что я описал выше - это обязательный минимум.
Дальше можно было бы прикрутить react например для упрощения работы с DOM, прикрутить eslint, prettify для единого стиля кода, покрыть это тестами в jest и так далее
Ну и - не бойся врываться и учить / использовать новые фреймворки - это не так сложно как может показаться, особенно если хватает терпения и усидчивости
PS: ну и комменты к коммитам лучше писать осмысленные и на аглицком, вместо 'Туц туц' =)
Смысл сборщика пока не улавливаю, чел выше тоже упоминал. Как и разбиение класса на файлы. Чтобы потом собирать их обратно сборщиком. Я понимаю смысл, но мне оно походу не надо. Одна из целей движка, это именно простота, что включает т что это тупо один файл, ты скачал его, создал html-ку и вот у тебя уже что-то шевелится на экране и можно писать игру. Не надо ничего инсталировать, настраивать, билдить и т.д. Я понимаю, программистов с этого прет, но мне нужна тут простота на уровне полных новичков.
Поддержка файла на 2000 строк не особо и проблема. Навешал закладок, юзаешь. К тому же прям в редакторе есть дерево методов, можно открывать один док в нескольких окнах. Я пробовал раньше разбивать другие проекты. Честно, разницы я не чувствую. Может когда пишешь не один, то это играет большую роль, но мне не доводилось. А разбить основной класс на несколько классов я планирую попробовать, тут согласен на счет читаемости, стоило бы да. Но потом когданить.
Цель была, но она как-то затянулась и превратилась в путь да))
Какие преимущества даст react? Вроде и так с js все можно, куда хочешь обратился, что хочешь накрутил, ну jq добавил если прям хочется. Не шарю за react, скорее слышу шутки, что он любит грузить тонны ненужного хлама, чтобы сделать простое действие. Мне вот как раз именно этого совсем не нужно.
С терпением и усидчивостью как раз проблемы) К тому же и так нормально времени потратил на ковыряния с unity. Но это конечно опыт, в итоге если можно так сказать, пытаюсь изобразить что-то среднее между unity и scratch.
'Туц туц' вапщета это 'new new' в русской раскладке)) Так что вот. Но да, с инглишем есть серьезные сложности у меня. Немалые сложности у меня вызывало придумывание названий для некоторых методов, и до сих пор остались сомнения насколько это адекватно. Просто надо еще и оч коротко записать, меня просто выводят из себя названия методов, которые делают из более двух слов, еще и без сокращений.
Большое спасибо за развернутый фидбек, мне такое важно ❤.
Типизация - это не только для крупных проектов, но для любых проектов удобно - так как приведение типов в JS порой может выстрелить в ногу или привести к неожиданным багам, пропущенным по невнимательности. TS многие такие ошибки позволяет отлвить еще на этапе написания кода
Смысл сборщика - не потому что нас 'прет' а потому что это необходимость. Сборщик - это builder который собирает весь твой код, и компилирует его в финальный файл / файлы. При этом происходит процесс минимизации / обфускации кода, + он может быть прогнан через транспайлеры которые делают твой код доступным на старых устройствах / браузерах, конвертирует TS в JS, SCSS в CSS и многое другое
React или Vue или Angular позволят упростить / оптимизировать работу с DOM - базово он берет на себя рендер HTML, навешивание обработчиков, управление состоянием, например - если брать только React, без дополнительных пакетов. Сам по себе React не грузит тонны штук - если что-то такое и происходит - это косяк разработчика.
Почему нужно разбивать проект на модули - потому что, как я уже написал - читать и поддерживать монолит очень сложно, и чем больше он будет разрастаться - тем будет хуже. В целом - если тебе норм - то ок. А если ты планируешь чтобы твой код читали и использовали другие программисты - подумай как твой код выглядит для них со стороны. Легко ли его читать, легко ли его понять человеку который видит это все в первый раз?
LOL, я бы по рукам линейкой лупил разработчиков которые стремятся все сократить - названия переменных, методов, компонентов и так далее. На ревью такое не пройдет.
В этом нет смысла - финальный код все равно будет (должен быть) обфусцирован сборщиком, а вот читаемость кода падает заметно + приходится больше тратить времени на то чтобы вникнуть в саму суть кода
Суммарно - если ты пишешь все сам и для себя - то делай как хочется (не сарказм)
В целом да, пишу во многом для себя и под себя, но таки не только. И вот по именам методов как раз есть нацеливание, но не как ты считаешь, на программистов (они и в юнити напишут), а скорее наоборот, на ламеров, а то и вовсе детей. У тебя надеюсь пукан не взрывается каждый раз когда ты видишь/пишешь тег ссылки просто буквой "a", а не anchor, как по идее должно быть. И там в html такого навалом, и я рад этому (хотя одна буква, это конечно перебор). Всегда можно загуглить и прочитать/вспомнить что делает штука с таким именем. И если ты ее часто пишешь, и ее визуально много в твоем коде, то хорошо, что она будет называться типа setGR(), а не setGlobalRandomNumberFromMyFantasyInNow(). Но и да, код должен быть читаем без комментариев, это я тоже полностью соглы, и по мере сил стараюсь, чтобы так было. Пытаюсь между тем и тем соблюдать какой-то баланс. Ну или что-то такое)