3. Приплыли :( А так же что лучше: автогенерация планетных систем или описание их строго вручную.

Ну вот, приплыл, даже не знаю о чем пока написать, что рассказать. Разве что сейчас игра готовится перейти к версии 0.1.0. Осталась только набить необходимый код, чтобы распарсить хмл-ку и прорисовать HUD. Доделать хмл-ку, чтобы спутники планет в ней были и станции околопланетные, ну и астероидов набросать, тех, которые будут статическими, наподобие пояса Койпера и проч. Доделать обработку ивентов клавиатуры. Причем все это уже знаю как делать нужно, но пока нет времени сделать реально. А хотя я понял о чем написать сегодня! Ура! :) Итак, тема сегодняшей статьи будет следующей: Что же лучше, автогенерация планетных систем или же полное ручное их прописывание? 1. Автогенерация. Врубаем случайную генерацию (рандом) и что-то получаем... Понятно, что результат может быть как однообразным, так и непредсказуемым. 2. Ручное прописывание. Хорошо, если систем у нас 10, и в каждой в среднем по 8 планет. Тут еще терпимо, а если как в той же EVE Online более 5000 систем? Скажем так, если делаешь один, то будет очень тяжело и очень, мягко говоря, устанешь от этого. Как показывает практика и ошибки других (форумы все-таки полезная вещь иногда), ни один из вышеназванных способов не годится в чистом, так сказать, виде. Именно поэтому я принял решение смешать оба этих способа. Для начала, не мудрствуя лукаво, честным образом, без указания копирайтов, спионерил параметры нашей Солнечной системы с wikipedia.org. Smile Первую хмл-ку накропал вручную. По ходу дела продумывая ее структуру. Оказалось, что не все так просто, как хотелось бы, но особых сложностей с ней не было, главное было хорошенько пошевелить полуатрофированным мозгом. :) В результате все стало выглядеть подобным образом: Офигительный набор отверток. :) 000,380,3820,2410,0658,61 ... - далее все подобно, только параметры отличаются Возможно формат описания не самый лучший и "слегка" избыточный, но пока что она у меня будет выглядеть именно так. Потом, все же, прийдется ее формат немножко подправить и сделать наподобие этого: ... - далее все подобно, только параметры отличаются Так же, скорее всего, прийдется добавить в нее дополнительные данные. Потому что по здравому размышлению (а зачем мне плодить лишние файлы? в данном случае, по-моему, это не нужно) в этой же хмл-ке стоит хранить и другие данные о системе, например, дополнительные параметры системы, как-то, беря в пример бессмертную Elite, государственный строй системы и другие подобные вещи. А далее немножко схитрим. Сообразно этим параметрам теперь напишем автогенератор. Да-да-да, именно автогенератор, не надо удивляться. Пусть он нам нагенерирует кучу таких систем, а уж мы потом будем их просматривать и изменять вручную. Конечно такой способ "не фонтан", однако это, по-моему, достойный компромисс. Который позволит достаточно разнообразить планетные системы. Хотя возможно, в моем полусонном и перегруженном мозгу возникнет хитрая мысль о том, как этот процесс максимально автоматизировать. В любом случае, возникающие задачи все-таки стоит решать по мере их возникновения. Поэтому сейчас буду решать проблему автогенерации. По сему случаю быстренько пишу небольшой автогенератор. А далее начинается самое сложное и страшное - доводка параметров автогенерации "до ума" (чтобы потом было работы как можно меньше). Можно, конечно, делать это включив воображение на максимум и пытаясь представить конечный результат по цифрам в хмл-ках, или вывести эти цифры в табличку какую-нить хитрую... Но зачем так над собой измываться-то? Я ж не мазохист. Smile Так что, наверное, стоит прикрутить к автогенератору модуль визуального представления. Тут можно пойти двумя путями. Первый - пусть генерится 2д картинка, на которую можно смотреть и по ней проводить оценку. Второй - использовать возможности именющегося уже Ирлла (сам игровой движок, который разрабатывается, для этого в общем-то не годится, но можно его немножко видоизменить, чтобы получилось то, что нужно: отобразить систему в уменьшенном виде и камеру подвестить строго над ней). Второй вариант несколько предпочтительнее. Почему? А все просто - у нас получится готовый кусочек игры: "Карта системы"! Она сможет отображать системы, потом к ней останется только прикрутить возможность отображения всех планетных систем, так сказать сделать из Карты системы Карту галактики. В следующий раз продолжу эту тему, распишу с какими подводными камнями я столкнусь по ходу дела. Ибо завтра я намерен приступить как раз к написанию автогенератора.
Последняя правка: пн, 02/07/2007 - 15:47
Submitted by BlackCat on

Комментарии

В проекте Альтернатива, когда-то поднимали похожую проблему генерации карт и звездных систем. Почитай тут, может чем поможет. Форум у них в данный момент лежит, там тоже было немного материала.
Submitted by Victor on
Спасибо за совет, некоторые идеи оттуда пригодилось.
Submitted by BlackCat on

Как продвигается написание автогенератора?

Submitted by Victor on
@BlackCat

Я вот только не понимаю, для чего хранить информацию о системах? разве что если специфические миры в редакторе карт генерить. тут уже упоминался шедевр - Elite. нужно всего лиш помнить, что rand, random - это песевдо случайные последователдьности, соответственно, можно все системы генерировать ими по кучке формул, причем даже галактики или скопище галактик. просто проинициализировав последовательность определенным числом у тебя rand будет выдавать одни и теже последовательности. т.е. не нужно ничего хранить, а только номер системы, или номер галактики или вообще 1 число на всю вселенную. рассчитывать же только положение планет в зависимости от времени (они же крутиться должны всеже). причем с именами планет также можно как в элите. таблица слогов из которых рандомом генерируется название планеты. в результате небольшой алгоритм будет задавать тебе всю вселенную.

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

Submitted by Fantik on

Можно в принцыпе открыть учебнник астрономии и нагенерировать рандомом планет(от X до Y), но по моему это кривовато, надо чтобы была какая-нить система связи этих планеток, тобиш галактика, спиралевидная или сферическая. А это загенерить уже посложнее ), но я могу тоже подумать над этим вопросом.

Submitted by Relyer on
Вот. минут за 20 набросал генератор напхп. просто как пример что данный метод работает ,и не нужно кучи файлов. правда здесь только генератор систем солнечных.

http://ecopress.by/cgi/systems.php

function get_pl_name($count){ $name=""; $slogs=array('ra','ban','ugi','ri','to','dir','stu','mi'); while($count){ $index=(int)rand(0,(int)(count($slogs)-1)); $name.=$slogs[$index]; $count--; } return $name;

}

// посчитаем размер планетыfunction get_pl_size($planet_type){ switch($planet_type){ case 1: return (rand(1,10000)/1000); case 2: return (rand(1,1000)/1000); case 3: return (rand(1,100000)/1000); case 4: return (rand(1,1000)/1000); case 5: return (rand(1,10000)/1000000); default: return (1); }

}

function get_pl_sputnics($planet_type){ $tmp=rand(1,100); switch($planet_type){ case 1: if($tmp<2) return (rand(1,2)); if($tmp<10) return (rand(1,5)); break; case 2: if($tmp<5) return 1; break; case 3: if($tmp<10) return (rand(5,10)); if($tmp<50) return (rand(5,40)); if($tmp<80) return (rand(20,60)); break; case 4: if($tmp<30) return (rand(1,5)); break; default: break; } return 0;

}

if(isset($_GET['s'])){ $s=(int)$_GET['s'];}else{ $s=0;

}

srand($s);

// получим тип солнца (6 типов) $sun_type=rand(0,5);// кол-во планет $planets_num=rand(0,10); $planets=array();// данные по планетам посчитаем for($p_num=0;$p_num<$planets_num;$p_num++){ $p_type=rand(1,5); // 1-кислородная, 2-метановая, 3-газовая, 4- вакуум, 5 - астеройды $p_size=get_pl_size($p_type); $sp_cnt=get_pl_sputnics($p_type); if($p_type!=5){ $p_name=get_pl_name(rand(1,3)); }else{ $p_name="пояс астеройдов"; } $planets[]=array('type'=>$p_type,'size'=>$p_size,'sp_cnt'=>$sp_cnt,'name'=>$p_name); } // выведем результат: echo "Система номер: ".$s."
"; $sb=(!$s)?32000:$s-1; $sn=($s>31999)?0:$s+1; echo "<a href=\"?s=".$sb."\"><<<"; echo "<a href=\"?s=".$sn."\">>>>"; echo "

"; echo "Тип звезды: ".$sun_type."
"; echo "Планет: ".count($planets)."
"; if(count($planets)){ $cnt=1; foreach($planets as $planet){ echo "Планета ".$cnt.". ".$planet['name']."
\n"; echo "Атмосфера: "; switch($planet['type']){ case 1: echo "кислородная"; break; case 2: echo "метановая"; break; case 3: echo "газовая (не метановая :))"; break; default: echo "вакуум"; break; } echo "
\n"; echo "Размер: ".$planet['size']."
\n"; if($planet['type']!=5){ echo "спутников: ".$planet['sp_cnt']; } echo "

\n\n"; $cnt++; }

}

Submitted by Fantik on

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

Submitted by BlackCat on

Ой, какая древнющая и очень интересная тема. Жаль, на самом сочном месте оборвалась )= Вставлю свои пять копеек. Если делать реалистичные планетарные системы, то их без труда можно генерировать автоматический, задавая случайным образом параметры звезды (ну, или систем звезда-звезда, звезда-ЧД и т.д.). Но в этом случае игра будет абсолютно неинтересная, ибо мир окажется достаточно однообразным и пустым. Так что для игр надо делать нечто полностью выходящее за рамки реальности, как было сделано в Масс Эффекте 2, ну или хотя бы в примере Fantik. А тут всегда надо работать ручками, если хочется разнообразного мира.

Submitted by Otinagi on

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

Submitted by Hale_32bit on

GameDev.by