суббота, 13 августа 2016 г.

Фредди против Джейсона. Ужасы перестройки.

Похоже, давать постам громкие заголовки, используя названия фильмов (особенно, когда сказать нечего по существу), становится у меня традицией. Почему "Ужасы перестройки"? Да потому что использование json (который я уже обозвал Джейсоном) несет массу неожиданностей. Почему "Фредди против Джейсона"? А потому, что такой фильм был. Даже два - у меня на самом первом компе завалялся огрызок этого фильма - файл был поврежден, поэтому какой маньяк с каким маньяком там воевал установить не удалось. Фредди - это, конечно Федя Крюгов (Фредди Крюгер) - так я с некоторых пор именую свой старый стиль программирования для выставления проперти юнитам (смотрим посты ниже с длинными рядами строк присвоения пропертей). Подобная простыня с многими отступами и занимающая больше 500 строчек способна вогнать в ужас любого мало-мальски сведущего в программировании человека (я имею в видк тех, кто знает не только if own: own, в отличие от меня). Джейсон (json) дает возможность не в пример быстрее и понятнее загрузить данные, правда, с некоторыми оговорками.
Дело в том, что, как мне объяснил dron, проперти в Блендере написаны на языке Си, а метод attrDict вообще-то дает питоновские проперти и, разумеется, вся система мгновенно рушится. Так что сам метод не виноват в том, что у меня ручки кривые (Питон и Си - языки вообще-то разные, а валить все на разработчиков Блендера  не стоит, хотя иногда знатные подарки они таки преподносят, как с проигрыванием анимации).
Поэтому был найден еще один способ раздать проперти, читая файл

jsonINIweaponFile = open(bge.logic.expandPath('//Weapon/'+pathObj+'/'+pathObj+'.json'),'r')
#Читаем файл с проперти
weaponINI = json.load(jsonINIweaponFile
 #Выдаем проперти со значениями и закрываем файл
  for key in weaponINI:
        if key not in newObject:
              newObject[key] = weaponINI[key]

Не сказать, что это меня сильно обрадовало, но, по крайней мере, пока срабатывает. Этот кусочек кода предназначен для выдачи проперти ракетам, бомбам, пилонам подвески - всему тому, что составляет внешнюю подвеску на самолете. Кстати, точно так же раздавались проперти двигателю самолета, с одной поправочкой - в последней строчке отсутствовало not, поскольку проперти я заранее там выставил в блоке редактирования логики, проставив нулевое значение.  И тут неожиданно всплыло еще одно препятствие...
Сначала вообще-то надо прочесть файл старта миссии - названия юнитов, их координаты, лриентация, сторона, способ управления и оружие. Чтение json по данным, не относящимся к проперти юнита проходило отлично - никаких отклонений, ошибок и прочего. Однако, стоило мне присвоить значение проперти target(сторона) и bot(способ управления), как все пошло кувырком после чтения второго json  с остальными проперти (маневренность, тяга, высотность, скорость). Такое впечатление, что повторное вмешательство в проперти опять же с чтением json вызывает какой-то сбой и в этом опять же виноваты особенности проперти в БГЕ.
В итоге на данный момент с помощью хитроумных извращений удалось сделать загрузку всех проперти юнита, сделать генерацию оружия с заменой мешей и работающей системой объектов, зависящей от требуемой детализации, но стартовую загрузку миссии все же оставить в формате txt. Со всеми вытекающими - чтнеием по маркерам-разделителям, резкой и преобразованием текстовых блоков и тд. Это не есть хорошо - Фредди прочно пока удерживает последние позиции (лишь бы не получилось, как с сериалом "Кошмар на улице Вязов" - серия 9 - "Фредди мертв. Последний кошмар", серия 10 "Фредди жив! Новый кошмар"), потому что к хорошему быстро привыкаешь и полста строчек кода вместо полтыщи выглыдят куда привлекательнее. К тому же удалось более-менее выстроить стройную систему генерации вооружения и начать клепать файлы с данными для конкретной ракеты или бомбы. Файлики небольшие, читать и понять их гораздо проще и легче. Посмотрим, не подведут ли меня эти методы генерации и раздачи свойств для оружия. Пуски-то и сброс я пока закомментил...
В результате всего этого произошел переход на 2.77, пусть в нем и присутствует баг с анимацией, но выправлены некоторые другие, да и анимация почти исчезла даже для кокпита - ее заменила ориентация стрелок, как выяснилось, надо просто правильно подобрать коэффициенты. Кроме того, как выяснилось, в БГЕ есть возможность рисовать текст на экране без использования текстовых объектов. Смотрим функцию blf в АПИ Блендера. Тексту можно давать цвет, размеры и расположение на экране. В свое время dron как-то делал GUI еще на старом сайте БлендерУкраина. Я же сделал вывод, что совершенно необязательно делать извращения с заменой мешей с текстурой текста или создавать еще одну оверлейную сцену с текстовыми объектами (есть в Блендере очень старый баг с невидимостью некоторых объектов при взгляде через текстуру с альфа-каналом - об этом, кажется писал еще O.din13 на БУ). Так что текст, скорее всего будет именно рисованным через blf, обновлять его придется либо при повороте камеры либо при поступлении новых данных, что будет происходить относительно редко, так что много сожрать не должно.
В общем перестройка после "термидориансокого переворота"  пусть и со страшным скрипом, но идет вперед.

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

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