четверг, 28 апреля 2016 г.

Горячая пора-4. Кувалдой и напильником обретешь ты право свое...

Столь вычурным названием этот пост обязан  долгим и не сказать что удачным поискам решения по загрузке и расстановке юнитов, а также раздаче им стартовых характеристик. После серии обломов пришел к тому, что теперь юниты грузятся путем просмотра многомерного списка типа:
generationList = [['2','UnitAir','red','Yes','MiG-23MF','Libya','FuelTank-3_R-23R_R-13M','Intercept','4','300.0_200.0_1500.0','0.0'],
                      ['2','UnitAir','red','Not','MiG-23MF','Libya','FuelTank-3_R-23R_R-13M','Intercept','4','1000.0_200.0_1500.0','0.0']]

Часть данных, судя по всему придется либо трансфорировать, либо просто выкинуть, но девять десятых из этого списка останется, наверное.
Из этого мегасписка, который будет выглядеть куда как пострашнее (а ведь здесь всего-то два самолета), извлекаются циклом по отдельности вложенные списки, которые я обозвал кластерами (надо же как-то выпендриться). Далее из кластера извлекаются и используются данные, причем иногда их надо преобразовать. Если учесть, что эта операция с небольшой натяжкой - одноразовая и используется только лишь при старте игры, тог тормозить она не должна (при старте игры и так есть закономерное подвисание при подгрузке ландшафта (что я наблюдаю во вполне "фирменных" играх тоже).
Далее я долго ломился в открытую дверь... Изощрялся в вызовах функций, модулей, классов, плохо в этом соображая и не понимая, что это совсем необязательно. В конце концов после отработки генерации на подвесках всего, что требуется (прошлый пост), пришел к более простому и универсальному способу. В каждую папку с юнитом суется файл с названием типа MiG-23MF_Libya_INI.txt, где содержится записб на первый взгляд непонятная, однако если читать скрипт, который занимается извлечением и применением данных из этого файла, то не такая уж и непонятная. Сам файл имеет вид типа:
#Технические характеристики
T|694|17500|220|0.8|1.3|0.3|1.0|0.14|4|12.5|1.8|4090.0|400|10000.0|E_|7400|FLG_|1.1|1.1|W\n
#Характеристики БРЭО
E|45|60|1.8|1|0.75|0.1|0.3|15|W\n
#Размещение камеры летчика в кабине
D|0.0|3.0|0.56|W\n
#Размещение пилота
O|PilotRus|0.0|2.85|0.25|W\n
#Бортовые номера
N|b_|6901,6902,6903,6904,6905,6906,6907,6908,6910,6911,6912,6913,6914,6915,6916|W\n
#Один топливный бак
P|0|FuelTank-1|FLG_FuelTank_Center_|0.0|-1.13|-1.04|0.8|0.05|W\n
#Пара топливных баков
P|0|FuelTank-2|FLG_FuelTank_Wing_|-2.67|-1.76|-0.1|0.8|0.05|W\n
P|0|FuelTank-2|FLG_FuelTank_Wing_|2.67|-1.76|-0.1|0.8|0.05|W\n
#Три бака
P|0|FuelTank-3|FLG_FuelTank_Center_|0.0|-1.13|-1.04|0.8|0.05|W\n
P|0|FuelTank-3|FLG_FuelTank_Wing_|-2.67|-1.76|-0.1|0.8|0.05|W\n
P|0|FuelTank-3|FLG_FuelTank_Wing_|2.67|-1.76|-0.1|0.8|0.05|W\n
#ПЕРВАЯ ПАРА ПОДВЕСОК
#Ракеты Р-24Р
P|1|R-24R|FLG_APU23_|0.005|W\n
P|1|R-24R|R-24R|-1.428|-2.0|0.03|-0.035|0.0|0.0|1|0.02|W\n
P|1|R-24R|R-24R|1.428|-2.0|0.03|-0.035|0.0|0.0|1|0.02|W\n
#Ракеты Р-24РМ
P|1|R-24RM|FLG_APU23_|0.005|W\n
P|1|R-24RM|R-24RM|-1.428|-2.0|0.03|-0.035|0.0|0.0|1|0.02|W\n
P|1|R-24RM|R-24RM|1.428|-2.0|0.03|-0.035|0.0|0.0|1|0.02|W\n

В файле перечислены варианты подвесок самолета, его пилоны для этих подвесок, координаты и повороты подвешиваемых объектов, а также всякие мелочи вроде лобового сопротивления, веса горючего в баках  и так далее. Но перед этим расписаны технические характеристики самолета, его особенности, вроде типа используемого шасси или названия семейства. Плюс положение летчика, положение камеры в кабине, характеристики бортовой электроники и так далее. Все это буду расписывать в следующих постах, по мере "введения в строй" бортсистем. Добавлю только, что предусмотрены "мертвые зоны" для РЛС (БРЛС "Фантомов", "Томкэтов", МиГ-23М, МиГ-21МФ например весьма плохо видят цели на фоне земли и не могут их захватить, зато радары МиГ-23МЛД, Ф-15, МиГ-29, не говоря уж о Ф-22 и "Тайфунах", отлично видят и сопровождают низколетящие цели), параметры устойчивости к помехам и так далее. в перспективе думаю возможно реализовать так называемую "уводящую помеху" для УРВВ с РГСН, до которой дело так и не дошло в первой версии, как и до контейнеров РЭБ, которые и будут эту помеху устраивать. Вообще во второй версии имитацию электроники юнитов постараюсь сделать гораздо более продвинутой.
Ладно, это погтом, и вообще, "гладко ьыло на бумаге", вернемся к нашим баранам...
В игровой сцене есть такой объект Generator, который является "внуком" двигателя. "Внучок" проживает недолгую, но очень насыщенную жизнь, прочитав файл с текстовыми данными и ударными, прямо-таки стахановскими методами генерируя и развешивая на своего "папу" (потомка двигателя, так сказать, в первом поколении) плейны, меши которых меняются на меши пилонов, ракет, бомб и баков. Заодно он "наставляет на путь истинный" своего "деда", выставляя и подправляя ему вевозможные проперти вроде угловых скоростей, высотности, угла обзора радара и так далее. Такой вот сознательный товарищ. после чего исчезает.
Выглядит это примерно так:
#Открываем файл инициализации юнита       
        directClass = open(bge.logic.expandPath('//Aircraft/' + typeUnit + '/' + typeUnit + 'INI' + '.txt'),'r')
       
        #то заглядываем в файл
        for string in directClass:
             #Срез строки по маркеру |
             config = string.split('|')
             #Эта строка, с начальным символом # - комментарий и ее читать не надо
             if config[0] == '#':
                 continue
            
             #Эта строка - технические данные летательного аппарата
             elif config[0] == 'T':
                 own.parent.parent['speedMax'] = int(config[1])                  #Максимальная скорость
                 own.parent.parent['heightMax'] = int(config[2])                 #Максимальный потолок
                 own.parent.parent['speedVert'] = int(config[3])                 #Максимальная вертикальная скорость
                 own.parent.parent['angX'] = float(config[4])                    #Максимальная скорость тангажа
                 own.parent.parent['angY'] = float(config[5])                    #Максимальная скорость крена
                 own.parent.parent['angZ'] = float(config[6])                    #Максимальная скорость рыска
                 own.parent.parent['startSpeed'] = float(config[7])              #Стартовый коэффициент скорости
                 own.parent.parent['rotatDyn'] = float(config[8])                #Угловое ускорение
                 own.parent.parent['dvigDyn'] = int(config[9])                   #Динамика(приемистость) двигателя

Сам скрипт вроде и длинный и преобразования строковых величин опять же. Да, xml, наверное было бы получше, но, как сказать... Из-за тегов возрастет объем, а если учесть, что таковых текстовых данных очень много... Проще уж повозиться со скриптом в самой игре, чем подгонять друг под друга новые и новые xml, да и данные в txt четко укладываются в строчки, не занимая много места.
И самый убийственный довод - c TXT я работать умею, а с xml - нет, увы... Пока, надеюсь... мне надо было сдвинуть с места застопорившую было работу и это все-таки удалось.
Из этого способа генерации меня пока все устраивает, осталось доделать массу для подвешиваемых объектов (она у меня играет большую роль, сильно влияя на маневренность), а также продумать, каким образом надо производить отстрел ловушек и стрельбу из пушки. Для сброса бомб и пуска ракет все более-менее понятно, а вот для пушки и ЛТЦ надо придумать новый способ.
Кстати о массе. В конце концов я привел все массовые характеристики к тоннам. Вес самолета, топлива, оружия - если в кг - загромождение идет большими цифрами. А так - максимум - сотнями приходится опернировать, а не сотнями и десятками тысяч.
В общем после грубой подгонки началась более тонкая работа - шлифовка и "достраивание" для летательных аппаратов. Выясяется, какие проперти и для чего нужны, как их использовать и так далее. Постепенно надо изобретать способ формирования стартового мегасписка и уточнять, какие параметры нужны во вложенных списках.
Результат  последних дней и часов работы - МиГ-23МФ с тремя ПТБ, бортовым номером, ракетами и летчиком в кабине (заодно привел к единому стандарту кокпиты МиГ-23БН и МФ):

  

Комментариев нет:

Отправить комментарий