Я делаю 2.5d движок
6534
140
Хочу замутить олдскульную гаму на нём, правда это пока кривой прототип, и когда я гляжу на картинку из tes: arena -- я просто выпадаю в осадок от того, сколько всего мне нужно сделать, чтобы хотя бы примерно соответствовать играбельному уровню.
Это карта, где изображён игрок и сломанные углы и направления обзора. Простенький генератор пещер на клеточном автомате.
[UPD 03-05-2020]
Сейчас игра выглядит так. Подробности в этом комментарии.
[UPD 21-05-2020]
Натянул текстуру на стены
[UPD 26-05-2020]
Первый тест сущностей
[UPD 30-06-2020]
Сущности вроде стали работают.
Первый тест текстурного пола и неба.
[UPD 02-07-2020]
[UPD 20-07-2020]
Текстуры на полу, разные текстуры стен.
Kujivunia сказал(а):↑это пока кривой прототип, и когда я гляжу на картинку из tes: arena -- я просто выпадаю в осадок от того, сколько всего мне нужно сделать, чтобы хотя бы примерно соответствовать играбельному уровню.
Нажмите, чтобы раскрыть...Таблицу лидеров введи и можешь в открытый доступ запускать
Крутотень! Автоматически уважаю людей которые делают свои движки. Не ну правда, почти все игры на юнити и уе4 ужасно похожи друг на друга, где те времена когда каждая игра имела свою уникальность и не повторимость как раз из-за своих уникальных движков. Да да, и тогда было двигло от квейка и хл, но сейчас вообще одноликие игры, да и ещё эта мода абсолютно тупая на без текстурные дал дизайны и всякие лоу поли, скипаю такое все чаще и чаще...
ТС это С# ??
Kujivunia сказал(а):↑Это PascalABC.NET. Но вообще, движок в виде .dll, и он спокойно может работать на С# даже без конвертации данных, типа, .NET среда же и там и там.
Думаю, нужно много чего переделывать. Сейчас у меня карта это просто массив byte. Как в срезе карты из minecraft. Хочу сделать карту массивом объектов, которые задаются точками вершин, чтобы всякие круглые штучки делать, и чтобы raycasting был точнее. Ещё я ваще не понимаю, как добиться всего, что есть в арене: а там есть объекты разной высоты, перемещение по вертикали (КАК???) и куча красоты, типа, вот к чему я стремлюсь, но не знаю, как это сделать:
изометрия - это отсутствие перспективы. Но да, если игра с видом сверху под углом, то изометрия - способ из 2д сделать 2.5д.
Нажмите, чтобы раскрыть...Ну тогда бы я точно смотрел в сторону сишки. Но если ты реально хочешь прям чтоб олдскулы сводило, то придется знатно помучиться паскалем. И да не юзай .нет. это ж халтура библиотечная.
DaniCh сказал(а):↑Ну тогда бы я точно смотрел в сторону сишки. Но если ты реально хочешь прям чтоб олдскулы сводило, то придется знатно получится паскалем.
Нажмите, чтобы раскрыть...Дело в том, что паскалем я пишу с школы, и он имеет в себе всю мощь шарпа, а шарпом я писал пару раз в жизни. А ещё IDE паскаля работает мгновенно, а VS весит дофига и лагает даже на мощном компе и имеет миллиард кнопок, в которых лень разбираться. Но в перспективе я бы вообще на котлине хотел всё писать. + у паскаля лёгкие учебные графические библиотеки, чтобы можно было легко и быстро посмотреть результат, а в других языках нужно будет мучиться с подключением графических библиотек....
насчёт сведения олдскул: это супер современный паскаль, там от старого паскаля почти ничего нет) Поэтому в этом плане олдскулы не сведёт
Kujivunia сказал(а):↑Дело в том, что паскалем я пишу с школы, и он имеет в себе всю мощь шарпа, а шарпом я писал пару раз в жизни. А ещё IDE паскаля работает мгновенно, а VS весит дофига и лагает даже на мощном компе и имеет миллиард кнопок, в которых лень разбираться. Но в перспективе я бы вообще на котлине хотел всё писать. + у паскаля лёгкие учебные графические библиотеки, чтобы можно было легко и быстро посмотреть результат, а в других языках нужно будет мучиться с подключением графических библиотек....
насчёт сведения олдскул: это супер современный паскаль, там от старого паскаля почти ничего нет) Поэтому в этом плане олдскулы не сведёт
Нажмите, чтобы раскрыть...Эхх...Вот где ты был в теме где какой-то чело спросил зачем учат Паскаль в школе, мол это атавизм и не питон...Короче я там пояснял и отхватил дизлукасов ))
Успехов вам разработке, поднимай тему по мере наполнения инфой. Может кто из здешних прогеров заинтересуется, хотя сомнимаювсь, что они упарываются по паскалю. Видел ещё пару человек которые про графику с точки зрения программирования поясняли, но ники у сожалению не помню.
DaniCh сказал(а):↑Не ну правда, почти все игры на юнити и уе4 ужасно похожи друг на друга, где те времена когда каждая игра имела свою уникальность и не повторимость как раз из-за своих уникальных движков. Да да, и тогда было двигло от квейка и хл, но сейчас вообще одноликие игры, да и ещё эта мода абсолютно тупая на без текстурные дал дизайны и всякие лоу поли, скипаю такое все чаще и чаще...
Нажмите, чтобы раскрыть...Вот только почему-то челам плевать на всякие однобокости движков, ибо они и так хавают всяких Отсасинов (ещё и добавки просят)
DaniCh сказал(а):↑поднимай тему по мере наполнения инфой.
Нажмите, чтобы раскрыть...Что ж. Я не знаю, почему эта штука работала...
- У меня полностью не работает дальность отрисовки, что очень странно -- ведь должно быть наоборот: это без неё ничего не должно работать. Сижу в недоумении.
- Функция, возвращающая направление луча, на самом деле возвращала нечто невразумительное. Починил, и всё заработало прекрасно. Но как оно работало до этого, если учесть, что именно от неё всё и зависит? Она вызывалась сотни и тысячи раз за кадр для самых разных углов
- Эффект рыбьего глаза. Совершенно лютый. Как починить - не знаю. Если что, это прямая стена в квадратной комнате. FoV=120, но с меньшим - не лучше.
- Если приглядеться, то можно заметить, что стены состоят будто бы из множества разной ширины пластинок. Вообще, так не должно быть. Но я нашёл причину. Она была довольно очевидной. К сожалению, с текущим форматом карты и багом из первого пункта игра с большей чёткостью выдаёт примерно 1 кадр в 5 секунд на моём, весьма не слабом ПК.
- Формат карты и способ RayCasting'а придётся переделывать, если я хочу красивую последовательницу девяностых, а не психоделичное пластинчатое нечто.
Касаемо графической составляющей:
0.2 фпс? Каким образом происходит рендеринг? Какого размера карта? И где вообще код, без него не разобраться.
Если рендерить то, о чем ты расписал, при помощи OpenGL - можно вообще запушить всё в видеопамять и рисовать всю карту одним (!) вызовом OpenGL-функции (даже с текстурами. если понадобится), да еще и расположенные далеко от камеры объекты и объекты, перекрытые другими - отсеятся на опред. этапе графического пайплайна, плюс доступ к программированию шейдеров откроет широкие возможности работы с графическими эффектами, освещением и тенями.
ПС это всё на деле гораздо проще, чем кажется
Вот, например, я как-то баловался
Спойлер
На gtx560 было ~3к фпс (если убрать рендер вообще - фпс оставалось +-столько же), т.е. затратами времени на отрисовку вообще можно пренебречь
Касаемо игровой логики:
Один психопат(в хорошем смысле) сделал это в консольном приложении, можно что-то подсмотреть
Berglol сказал(а):↑Касаемо графической составляющей:
0.2 фпс? Каким образом происходит рендеринг? Какого размера карта? И где вообще код, без него не разобраться.
Если рендерить то, о чем ты расписал, при помощи OpenGL - можно вообще запушить всё в видеопамять и рисовать всю карту одним (!) вызовом OpenGL-функции (даже с текстурами. если понадобится), да еще и расположенные далеко от камеры объекты и объекты, перекрытые другими - отсеятся на опред. этапе графического пайплайна, плюс доступ к программированию шейдеров откроет широкие возможности работы с графическими эффектами, освещением и тенями.
ПС это всё на деле гораздо проще, чем кажется
Вот, например, я как-то баловался
На gtx560 было ~3к фпс (если убрать рендер вообще - фпс оставалось +-столько же), т.е. затратами времени на отрисовку вообще можно пренебречь
Касаемо игровой логики:
Один психопат(в хорошем смысле) сделал это в консольном приложении, можно что-то подсмотреть
Нажмите, чтобы раскрыть...Он не один. У меня, кстати, тоже всё началось с консоли.
И, вообще говоря, функция пре-рендера просто возвращает высоту всех столбиков, якие треба отрисовать. А уж как будет идти отрисовка - через OpenGL ли, через консоль ли - не важно.
Именно поэтому текущий способ отрисовки - не финальный, а тестовый.
Говоря о ФПС, я использую RayCasting. Из камеры итерационно испускаю луч, на каждой итерации прибавляя к нему небольшое число, до тех пор, пока луч не упрётся в конец обзора или не-нулевой блок карты. Почти как RayTracing, но RayCasting. Именно он сжирает львиную долю всех ресурсов. Если выключить рисование вообще - то можно получить... 8.6 квс, тогда как с отрисовкой приложение выдаёт 5.6 квс. Именно RayCasting сжирает львиную долю ресурсов из-за кривой реализации.
К слову, чел с отрисовкой в консоли, судя по коду, использует тот же способ:
Цитата:while (!bHitWall && fDistanceToWall < fDepth)
Нажмите, чтобы раскрыть...Это его цикл испускания луча.
Нетрудно посчитать, что количество расчётов зависит ровно от трёх параметров: ширина отрисовки в столбиках, шаг луча, дистанция обзора. Причём максимальная потребляемость это width*(distance/step). В моём случае это 1770*(64/0.1)<=1132800 проверок на столкновение. Если бы дистанция обзора работала, то проверок почти всегда было бы гораздо меньше, чем посчитано выше. Но оно не работает.
Именно поэтому я хочу перейти на карту, состоящую из массива объектов, якие состоят из массива точек-вершин.
Там на каждый луч нужно проверок столько, сколько есть пар точек, образующих каждую сторону каждого объекта.
А формула нахождения точки пересечения двух прямых, в общем то, известна, пусть я её пока не очень понимаю =(
А, да, мой говнокод: https://gitlab.com/Roman.Svetlov/kujivengine/-/tree/master
Осторожно, опасно для слабых духом эстетов.
Рыбий глаз был побеждён путём деления высоты стенки на косинус угла между лучём до стенки и центром взгляда. Было - стало:
Правда, вблизи стенку, кхм-кхм, косолюбит (от слова косинус).
И причина, по которой это случается. 1 и 2 - це дистанции, на которых проходит очередная проверка столкновения луча
Mooneater сказал(а):↑Какие учебные материалы использовал по графике?
Нажмите, чтобы раскрыть...Прям учебных материалов - не использовал, но читал пару рассказов про RayCasting с отрисовкой в консоли.
А именно: http://ilinblog.ru/article.php?id_article=49
>Полтора дня ищу, почему не работает дальность отрисовки
>Перелопатил весь "движок"
>в клиенте игры нахожу строчку lob := pr.PreRender(Map, cam, width, 64);
>Исправляю на lob := pr.PreRender(Map, cam, width, distance);
>Оно работает, но ФПС почему-то не увеличился...
Пользователь
Регистрация: 21.02.2020
Сообщения: 949
Рейтинг: 435
Нарушения: 155
Регистрация: 21.02.2020
Сообщения: 949
Рейтинг: 435
Нарушения: 155
Kujivunia сказал(а):↑Именно поэтому первые игры были "этой залупой", а не "простыми 3д"?
>Полтора дня ищу, почему не работает дальность отрисовки
>Перелопатил весь "движок"
>в клиенте игры нахожу строчку lob := pr.PreRender(Map, cam, width, 64);
>Исправляю на lob := pr.PreRender(Map, cam, width, distance);
>Оно работает, но ФПС почему-то не увеличился...
Нажмите, чтобы раскрыть...Потому что вычислительных мощностей не хватало, хотя судя по тому что вы тут пускаете циклы по 64 итерации на каждый пиксель то фиг знает что еще медленнее. Вообще без гпу, а даже в старых играх использовалось гпу ты ничего не напиешешь будет адски лагать в любом случае
BUTTERFLY_PUDGE_NAGIBATOR_666 сказал(а):↑Потому что вычислительных мощностей не хватало, хотя судя по тому что вы тут пускаете циклы по 64 итерации на каждый пиксель то фиг знает что еще медленнее. Вообще без гпу, а даже в старых играх использовалось гпу ты ничего не напиешешь будет адски лагать в любом случае
Нажмите, чтобы раскрыть...
- По distance/step. Конкретно в моём случае это 64/0,1=640.
- Не на пиксель, а на столбец. Это же псевдо-трёхмерность.
- GPU использовать должен не алгоритм raycasting, а отрисовщик.
- Есть лёгкий способ поднять производительность в сотни раз, но я пока люблюсь с генерацией пещер.
Тема закрыта
-
ЗаголовокОтветов ПросмотровПоследнее сообщение
-
Сообщений:0
Просмотров:0
-
Сообщений:3
Просмотров:3
-
Сообщений:8
Просмотров:9
-
Сообщений:2
Просмотров:2
-
Сообщений:13
Просмотров:18