IPB

Правила раздела

Перед публикацией рекомендуем ознакомиться с правилами раздела

 
 
>

Вопросы по программированию

, Конкретнее - по генерации уровня

 
 Giperion
сообщение 27.07.2013, 21:24
Сообщение #1


Геймер
******

Группа: Участник
Сообщений: 105
Регистрация: 12.05.2010
Пользователь №: 13853



Здравствуй Gameinator! (IMG:style_emoticons/default/smile.gif)
Делаю свою игру. Моделирование, создание музыки, рисование - все это более менее ок, а вот с программированием все не так гладко...

К примеру досихпор не знаю как делать интерполяцию (линейную и по безье (или как оно там) ).

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

Сообщение отредактировал Dereline - 27.07.2013, 21:28
Перейти в начало страницы
 
 
 jamakasi
сообщение 27.07.2013, 22:02
Сообщение #2


Доктор Игровых Наук
*******************

Группа: Участник
Сообщений: 3521
Регистрация: 12.07.2007
Из: Энгельс
Пользователь №: 6560



Во первых какой язык и какой рендер(DX или GL)? Во вторых что подразумевается под "генерацией уровня", типа как в диабло2 или path of exile ? А в третьих
Цитата
И.... эээ.... ну чтоб там больше картинок было, чем зубодробительных формул. У меня аллергия на математические формулы, даже на самые простейшие.
, программирование нельзя выучить не зная матана, начиная от простейшего до самого сложного, также просто не существует книг в картинках, максимум увидишь "треугольнички и квадратики" которые рисовал в школе и то ооочень редко.
Перейти в начало страницы
 
 
 Giperion
сообщение 27.07.2013, 22:10
Сообщение #3


Геймер
******

Группа: Участник
Сообщений: 105
Регистрация: 12.05.2010
Пользователь №: 13853



Цитата(jamakasi @ 27.07.2013, 23:06) *
Во первых какой язык и какой рендер(DX или GL)? Во вторых что подразумевается под "генерацией уровня", типа как в диабло2 или path of exile ? А в третьих ЦитатаИ.... эээ.... ну чтоб там больше картинок было, чем зубодробительных формул. У меня аллергия на математические формулы, даже на самые простейшие., программирование нельзя выучить не зная матана, начиная от простейшего до самого сложного, также просто не существует книг в картинках, максимум увидишь "треугольнички и квадратики" которые рисовал в школе и то ооочень редко.


Рендер тут не важен (если так интересно - DirectX). Под генерацией уровня я подразумеваю создание меша.... ну скажем здания с корридорами и комнатами, а также создание точек где будет стоять свет и статик модели. Но для начала неплохо бы просто меш.

Нельзя выучить программирование говоришь? А что если я тебе скажу, что я его уже знаю? Без знания матана можно выучить программирование (и даже C++, представь себе!), просто для этого надо иметь хорошое знание информатики. С DirectX API проблем нет, есть проблема с алгоритмом генерации.

Книжки в картиночках существуют (IMG:style_emoticons/default/biggrin.gif) . Но вообще в данном случае это можно читать как "Чтоб объясняли доходчиво". Сами картиночки необязательны, если все и так понятно.
Перейти в начало страницы
 
 
 RedMagic
сообщение 27.07.2013, 22:24
Сообщение #4


Высший Игровой Бог
************************

Группа: Супермодератор
Сообщений: 12334
Регистрация: 05.11.2009
Пользователь №: 12882



Тема перемещена в более подходящий раздел.
Перейти в начало страницы
 
 
 jamakasi
сообщение 27.07.2013, 22:36
Сообщение #5


Доктор Игровых Наук
*******************

Группа: Участник
Сообщений: 3521
Регистрация: 12.07.2007
Из: Энгельс
Пользователь №: 6560



Dereline, в таком случае объясняю что генерации как таковой не существует до сих пор ни в одной игре кроме майнкрафта но там эта задача сильно упрощена т.к. весь мир состоит в прямом смысле из квадратов и отпадает необходимость использования мешей. Та что присутствует в некоторых играх работает по принципу заранее рассчитанных условий, модели(куски) рисуются заранее квадратами с подгонкой вершин друг к другу. Далее описываются условия в коде которые срабатывают из псевдослучайных чисел. Конкретно небольшой пример:
есть 3 меша(как бы то нибыло нарисованные квадратами), Пусть первый будет нижней гранью карты и имеет число 1 и может быть пристыкован к любой своей части, 2й меш располагается впритык к 1ому мешу с любой из 4х сторон а также может быть пристыкован сам к себе, 3й меш подогнан только для стыка со 2м мешом и может быть пристыкован сам к себе. Задаем константные размеры максимального количества кубов в нашем случае 10х10 , высоту не учитываем. Далее задаем условия вероятности создания каждого меша с учетом его расстояния до любого края т.е. от 0-10х до 0-10у. к примеру для меша 1 вероятность создания на крайних координатах = 1 и чем ближе к центральной точке 5,5 вероятность уменьшается. 2й меш создается только при условии пристутсвия рядом меша 1 или 2.. У меш 3 вероятность создания будет равна 1 только в центре, чем ближе к краю тем меньше вероятность, может быть создан только при наличии вокруг мешей 2 и 3. Во избежание не стыковок карту генерировать необходимо методом улитки т.е:
1-2-3
8-9-4
7-6-5

Сгенирированная карта по условиям будет выглядеть примерно так:
1-1-1-1-1-1-1-1-1-1
1-1-2-2-1-1-1-1-2-1
1-2-1-2-2-2-2-2-1-1
1-2-2-3-3-2-2-1-2-1
1-1-2-3-3-2-3-2-1-1
1-1-1-2-3-3-2-2-2-1
1-1-1-1-2-2-1-1-1-1
1-1-1-1-1-2-1-2-2-1
1-2-1-1-1-1-1-1-1-1
1-1-1-1-1-1-1-1-1-1

PS: алгоритм который описал очень сильно упрощен, но идея понятно я думаю.
Перейти в начало страницы
 
 
 Da Man
сообщение 27.07.2013, 22:42
Сообщение #6


Архимагистр Игры
*****************

Группа: Забанен
Сообщений: 2766
Регистрация: 06.06.2008
Из: Киев
Пользователь №: 8242



Где-то пацаны из Крайтека публиковали видео-демо и, кажется, пейпер на тему процедурной генерации города. А вообще гугл тебе поможет.
З.Ы. Такие темы лучше создавать на геймдев.ру
Перейти в начало страницы
 
 
 Giperion
сообщение 27.07.2013, 23:03
Сообщение #7


Геймер
******

Группа: Участник
Сообщений: 105
Регистрация: 12.05.2010
Пользователь №: 13853



Спасибо за объяснение, хотя вопрос все еще остается открытым. Я думал сделать примерно так:

1) В зданий 3 этажа. Константа. В начале всей генераций рандомно определяем точки лестниц, чтобы не усложнять алгоритм.
2) Алгоритм работает только с одним этажом. Все начинается в классе LevelMap который генерирует изображение где-то 256х256 px. Каждый пиксель привязан к уникальному "блоку": т.н. кусочек интерьера (это может быть корридор, часть комнаты, холл, особая комната, корридор с расположеной ловушкой, лестница и еще много много всего). Все это описано в отдельном enum'е и дальше уже работаем с именоваными константами. Алгоритм генерирует три карты. Дальше идем в класс LevelMesh.
3) LevelMesh создает корридоры и комнаты на основе сгенерированых карт. У него довольно много задач, одна из них: определение крайнего пикселя комнаты и создание соответственно стены. Какбы то нибыло результатом его является скомплектованый меш.
4) LevelLight создает свет на основе сгенерированных карт. Думаю что меш не понадобится. Результатом работы его является массив структуры, которая содержит в себе: Point3D (координаты света) и дифузный цвет.
5) LevelStatic создает модели на основе сгенерированых карт. В корридорах проще всего, а вот в комнатах по-сложнее (есть несколько видов комнат, но об этом заботится LevelMap). Кстати, модели светильников (и еще пара вещей) идут в префабе вместе с светом, так что генерация их не требуется.

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

Вот как то так. Сыро, недоработано, но как-то так. Жду летящих какашек комментариев и предложений.

Цитата(Da Man @ 27.07.2013, 23:46) *
Где-то пацаны из Крайтека публиковали видео-демо и, кажется, пейпер на тему процедурной генерации города. А вообще гугл тебе поможет.

У меня не город, у меня здание. И там еще одна фишка будет, но я пока про неё помолчу, мне бы хотя бы простую генерацию сделать.

Гугл не помог, я к нему сразу пошел.

Сообщение отредактировал Dereline - 27.07.2013, 23:15
Перейти в начало страницы
 
 
 jamakasi
сообщение 27.07.2013, 23:42
Сообщение #8


Доктор Игровых Наук
*******************

Группа: Участник
Сообщений: 3521
Регистрация: 12.07.2007
Из: Энгельс
Пользователь №: 6560



Dereline, на самом деле лучше не заморачиваться с генерацией, подскажу способ для описанного тобой случая:
Моделишь к примеру стол, делаешь на нем к примеру 6 костей "хелперов" в местах где может что либо лежать, т.е. стоять лампа, книга, бумажка. В коде обычное случайное число в диапазоне 1-6 и ограничение на количество задающиеся опять же случайным числом от 1до 3х допустим. При генерации создается меш стола и случайными числами количество и тип предметов на нем.
Дальше моделишь комнату из 4х стен и потолка, также расставляешь "хелперы" для спавна мебели, света и т.д. комнат можно намоделить пару видов с окнами и без, с разными дырками для дверей. В ней также случайными числами спавнишь мебель.
Далее моделишь несколько видов коридоров таким же способом и лестницы и все необходимое.
Точкой старта можно сделать к примеру комнату со входной дверью которых тоже несколько типов. Дальше все подинится великому рандому но который уже подконтрольный тебе.
В итоге у тебя будет контролируемая иерархия которую можно будет легко проверить и она не будет ресурсоемкой при генерации. Также минимальными будут "сюрпризы" генерации. При особой прытке можно генерить даже текстуры путем наследования начального типа. К примеру Если самая первая сгенерированная комната имеет стены с текстурой А то все остальные могут быть только А-А , А-Б но не Ч-А или М-П, также и мебель может быть использована только относящаяся к типу А и т.д. и т.п..

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

PS: коли дядя гугл тебе не помог то вот пара статей раз(русская) и еще одна поинтересней но eng .

Сообщение отредактировал jamakasi - 27.07.2013, 23:47
Перейти в начало страницы
 
 
 Giperion
сообщение 28.07.2013, 00:04
Сообщение #9


Геймер
******

Группа: Участник
Сообщений: 105
Регистрация: 12.05.2010
Пользователь №: 13853



jamakasi, 3 этажа тут геймплейная особенность, так что она в любом случае константа. Все таки хотелось бы сделать с учетом моей схемы или около того. Что касается хелперов для спауна моделей на поверхности стола, то я думаю, что можно просто создать префаб, который помимо самого стола будет содержать пустышки расположенные в нужных позициях и дальше уже от них плясать (модель с костями - куча лишних проблем при импорте). Я думаю использовать unity, но еще не исключаю другие движки. Небольшая часть моделей уже сделана (достаточная чтоб тестировать игру), завтра могу показать несколько, если интересно (сижу с холоди.... ой т.е. с планшетки (IMG:style_emoticons/default/smile.gif) ).

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

Статьи ща прочитаю, спасибо.
Перейти в начало страницы
 
 
 jamakasi
сообщение 28.07.2013, 00:16
Сообщение #10


Доктор Игровых Наук
*******************

Группа: Участник
Сообщений: 3521
Регистрация: 12.07.2007
Из: Энгельс
Пользователь №: 6560



Dereline, без хелперов будет точно почти нереально что то сделать (IMG:style_emoticons/default/smile.gif) т.к. даже если получится сделать алгоритм определения оптимальной точки в пространстве то "это" будет кушать нереальное количество процессорного времени. Вообще в случае с 3д пространством шаблонизировать придется в любом случае все. Если смотришь в сторону юнити то погугли на предмет генерации комнат и коридоров из игры SCP.

Сообщение отредактировал jamakasi - 28.07.2013, 00:16
Перейти в начало страницы
 
 
 cjayho
сообщение 28.07.2013, 13:37
Сообщение #11


Почти Мастер
***********

Группа: Участник
Сообщений: 1126
Регистрация: 08.03.2010
Из: Україна
Пользователь №: 13783



Цитата(Dereline @ 27.07.2013, 21:28) *
К примеру досихпор не знаю как делать интерполяцию (линейную и по безье (или как оно там) ).


При том что вы не знаете как сделать простейший lerp - как-то странно слышать такое:

Цитата
Нельзя выучить программирование говоришь? А что если я тебе скажу, что я его уже знаю? Без знания матана можно выучить программирование (и даже C++, представь себе!), просто для этого надо иметь хорошое знание информатики. С DirectX API проблем нет, есть проблема с алгоритмом генерации.


Математика сама по себе - это общий элемент любого программирования. Если вы не знаете математики, вы не умеете программировать. И все заявления вроде "я это уже умею" говорят лишь о том что вы всего лишь осилили синтаксис языка. Хотя для программиста синтаксис языка вообще дело десятое - на привыкание к синтаксису другого языка уходит десяток-другой минут. А математические алгоритмы остаются прежними. Собственно математика и есть основной поставщик алгоритмов.

И вообще если у вас стойкое отвращение к математическим формулам - вам стОит хорошо подумать, нужно ли вам заниматься программированием.
И кстати самый первый признак отсутствия опыта - новичку всегда хочется сразу получить готовенькое, а не заниматься экспериментами и исследованиями возможностей.
Перейти в начало страницы
 
 
 Giperion
сообщение 28.07.2013, 19:13
Сообщение #12


Геймер
******

Группа: Участник
Сообщений: 105
Регистрация: 12.05.2010
Пользователь №: 13853



Цитата(cjayho @ 28.07.2013, 14:41) *
При том что вы не знаете как сделать простейший lerp - как-то странно слышать такое:

Знания программирования само по себе бесполезно - оно дает возможность объяснить компьютеру чего ты хочешь на его языке. Чтобы выучить программирование необходимо знать информатику, и простую арифметику. Но чтобы создать желаемую программу нужно знать еще и специальности на которых она строится. К примеру чтобы создать программу для моделирования нужно четко понимать из чего состоят модели, какие на сегодняшний день есть эффективные способы их создания и с помощью каких методов и алгоритмов можно написать эту программу. Причем просто знания даже той математики тут недостаточно.
Или вот совсем жеский пример: расчет полета ракеты. Если ты выучил программирование и знаешь математику на отлично, то этого мало, ведь надо знать сопромат, особенности топлива и какие стадий полета проходит ракета. Програмирование лишь оболочка...

Когда в ВУЗах изучают программирования то они (для примера и "набивания" руки) используют программирования для решения математических задач. Я же использую программирование в основном для создания скриптов и некоторых инструментов упрощающих мне жизнь (в основном связанные с моделированием и проектированием). И математика мне тут не требуется (IMG:style_emoticons/default/wink.gif) .

К чему все это я?
Цитата(cjayho @ 28.07.2013, 14:41) *
Если вы не знаете математики, вы не умеете программировать.

Да к тому, что выучить программирование математика не нужна (а нужны хорошее знания английского и информатика). Она нужна лишь как средство во время обучения. Я же смог выучить программирование без этого. Только и всего. Ну а если мне все таки потребуется какие то математические элементы то я могу взять какую-нибудь библиотеку с сети и использовать методы от туда. Теорию то я немного знаю (IMG:style_emoticons/default/wink.gif) . Но если потребуется написать собственную математическую библиотеку то тут я конечно зафейлюсь. Как в случае с лерпом, который мне нужен в немного измененном варианте.

Цитата(cjayho @ 28.07.2013, 14:41) *
И кстати самый первый признак отсутствия опыта - новичку всегда хочется сразу получить готовенькое, а не заниматься экспериментами и исследованиями возможностей.

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

P.S. Сегодня занят был почти весь день. Завтра покажу некоторые наработки по игре, если кому интересно.
Перейти в начало страницы
 
 
 VIGUR
сообщение 28.07.2013, 22:38
Сообщение #13


Follow me: @VIGUR91
************************

Группа: Участник
Сообщений: 10414
Регистрация: 29.03.2008
Пользователь №: 7808



Цитата(Dereline @ 28.07.2013, 19:17) *
Завтра покажу некоторые наработки по игре, если кому интересно.
Естественно интересно. К тому же, надо чтобы тема соответствовала правилам раздела.
Перейти в начало страницы
 
 
 autistic
сообщение 28.07.2013, 22:55
Сообщение #14


Геймер
******

Группа: Участник
Сообщений: 125
Регистрация: 05.05.2012
Пользователь №: 14751



Цитата(Dereline @ 28.07.2013, 00:07) *
Жду летящих какашек комментариев и предложений.

за многабукв сверху шлю тебе лучи поноса. чмяф.
Перейти в начало страницы
 
 
 HappyMenses
сообщение 29.07.2013, 13:10
Сообщение #15


Мастер Игры
************

Группа: Участник
Сообщений: 1287
Регистрация: 28.02.2009
Пользователь №: 10081



Цитата(jamakasi @ 27.07.2013, 23:06) *
программирование нельзя выучить не зная матана

Ахахахахахах. Хорошая шутка.

Цитата(cjayho @ 28.07.2013, 14:41) *
Математика сама по себе - это общий элемент любого программирования.

Это очень часто используемый элемент, но не обязательный.
Программирование - это, в первую очередь, логика, а уж потом математика.
Перейти в начало страницы
 
 
 autistic
сообщение 29.07.2013, 15:57
Сообщение #16


Геймер
******

Группа: Участник
Сообщений: 125
Регистрация: 05.05.2012
Пользователь №: 14751



Цитата(mendoza @ 29.07.2013, 14:14) *
Программирование - это, в первую очередь, логика, а уж потом математика.

весьма распространенное заблуждение. на первом же собеседовании в сколь-нибудь солидной конторе спросят про сложность поиска в массивах и бинарных деревьях, а за одно написать оценочную ф-ию для какого-нить куска кода, и гуляй вася.
Перейти в начало страницы
 
 
 VIGUR
сообщение 29.07.2013, 16:54
Сообщение #17


Follow me: @VIGUR91
************************

Группа: Участник
Сообщений: 10414
Регистрация: 29.03.2008
Пользователь №: 7808



refuse, это смотря в каком направлении программист. Это может быть важно для низкоуровнего программера. Но у меня несколько друзей успешно работают программерами в разных направлениях (начиная от web'a на Ruby и HTML5/JS и заканчивая разработкой app'ов на Objective-C и Java для iOS и Android) без использования сложных математических алгоритмов... И при этом у себя в конторах они считаются хорошими специалистами.
Так что я скорее соглашуть с этим:
Цитата(mendoza @ 29.07.2013, 13:14) *
Программирование - это, в первую очередь, логика, а уж потом математика.
Математика нужна и полезна, но только на самом низком уровне, а на высоком хватит и умения пользоваться необходимыми библиотеками. Гораздо важнее в этой профессии, я считаю, нужно упорство, ведь реализацию математических алгоритмов можно найти за пару минут в интернете, если даже они срочно понадобятся.
На этом попрошу закончить обсуждения специальности программистов, давайте по теме.
Перейти в начало страницы
 
 
 autistic
сообщение 29.07.2013, 18:20
Сообщение #18


Геймер
******

Группа: Участник
Сообщений: 125
Регистрация: 05.05.2012
Пользователь №: 14751



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

 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 12.12.2019, 01:42