На некоторое время работа над прпоектом как бы подзависла. Причиной тому было продолжавшееся"дробление" скриптов, кстановление взаимосвязи между ними, шлифовка кода и его "притирка". Долгое время никак не удавалось отработать поражающее действие оружия на юнитах - из-за того, что когда я ломал старую схему, в импортируемом новом коде сдублировал функции. После чего корректная работа кода нарушилась. Также я долго и безуспешно пытался понять причину странного поведения ракет Р-27Р - после пуска с МиГ-29 одна обязательно взрывалась почти сразу (самоликвидация), а вторая шла в цель. Позже выяснилось, что причина просто в некорректном разрешении на пуск - олно выдавалось за пределами дальности, поэтому придется еще пошерстить скрипт сеносрра юнитов, чтобы этот баг устранить.
Но сначала я грешил на сам класс оружия и такие основания у меня были. Хотя я вроде как и освоил классы, и даже классы наследники, но не все так просто. Когда идет мутация объекта - при создании класса, то данные в самом классе меняются для всех объектов, которые ранее этот самый классс использовали. Иначе я никак не могу объяснить феномен поиска деталей МиГ-29 у Ф-15 (а именно такую ошибку мне выадвала консоль) или деталей МиГ-23 у Ф-16. Это безобразие продолжалось ровно до тех пор, пока я не ввел наследование классов для юнитов. В итоге подобные вещи прекратились, потому что классы МиГ-29 и Ф-15, а также МиГ-23 и Ф-16 более не пересекаются. Это отдельные классы, хотя и имеющие схожую структуру.
Весьма раздраженный поведением Р-27Р и еще не ведая об истинных причинах, я приступил к созданию классов наследников для оружия. По-видимому, я все же набил руку, потому что сделал это практически с первого залпа. Отработав технику на Р-27Р, принялся терпеливо дописывать json с данными для оружия и для оружия же писать скрипты класса. Папок было довольно много, поэтому делал я это в несколько приемов, затратив пару дней. Несложно, но одноообразно и надо быть внимательным, чтобы не проскочили символы типа плюс-минус в заголовке класса - консоль тут же выразит свое возмущение...
Теперь превращение 30-мм снаряда в 152-мм во время выстрела и его полета к цели исключено. Схема выглядит так.
Запускаем скрипт в игровом файле - тащим из нужной папки класс оружия, название питоновского файла обычно выглядит так - R27R.py.
def Weapon(cont):
own = cont.owner
nameWeapon = ""
nameGeneral = own.parent.name
nameSysPath = ""
#print(own.parent, own.childrenRecursive)
if hasattr(own.parent, "dictWeapon") == True:
if "WPU" in own.parent.dictWeapon:
nameGeneral = own.parent.dictWeapon["WPU"]["gunBullet"]
if hasattr(own.parent, "parent") == True:
#print(own.parent.parent)
if hasattr(own.parent.parent, "parent") == True:
#print(own.parent.parent.parent)
if hasattr(own.parent.parent.parent, "dictWeapon") == True:
if "bulletGen" in own.parent.parent.parent.dictWeapon:
#print("True")
nameGeneral = own.parent.parent.parent.dictWeapon["bulletGen"]
#print(nameGeneral)
nameSysPath = "//Weapon/"+nameGeneral
sys.path.append(bge.logic.expandPath(nameSysPath))
with open(bge.logic.expandPath("//Weapon/"+nameGeneral+"/"+nameGeneral+".json"), 'r') as directWeaponClass:
JSONweaponClass = json.load(directWeaponClass)
nameWeapon = JSONweaponClass["ownClass"]
unit_module = __import__(nameWeapon)
#print(nameWeapon)
unit_class = getattr(unit_module, nameWeapon)
#print(nameGeneral)
x = unit_class(own)
#import ClassWeapon
#own = cont.owner
#x = ClassWeapon.typeWeapon(own)
А потом уже тащим класс-наследник. Он совсем маленький.
import bge
from ClassWeapon import typeWeapon
class R27R(typeWeapon):
def __init__(self, old_owner):
typeWeapon.__init__(self, old_owner)
def mutate(cont):
R27R(cont.owner)
А этот класс сначаа тащит стандартный класс оружия, который лежит в папке со скриптами для оружия.
import bge
import json
with open(bge.logic.expandPath('//Weapon/WEAPON_CLASS.json'), 'r') as directWeapon:
JSONweapon = json.load(directWeapon)
class typeWeapon(bge.types.KX_GameObject):
def __init__(self, old_owner):
self.__dict__.update(JSONweapon)
def mutate(cont):
typeWeapon(cont.owner)
Но сначала я грешил на сам класс оружия и такие основания у меня были. Хотя я вроде как и освоил классы, и даже классы наследники, но не все так просто. Когда идет мутация объекта - при создании класса, то данные в самом классе меняются для всех объектов, которые ранее этот самый классс использовали. Иначе я никак не могу объяснить феномен поиска деталей МиГ-29 у Ф-15 (а именно такую ошибку мне выадвала консоль) или деталей МиГ-23 у Ф-16. Это безобразие продолжалось ровно до тех пор, пока я не ввел наследование классов для юнитов. В итоге подобные вещи прекратились, потому что классы МиГ-29 и Ф-15, а также МиГ-23 и Ф-16 более не пересекаются. Это отдельные классы, хотя и имеющие схожую структуру.
Весьма раздраженный поведением Р-27Р и еще не ведая об истинных причинах, я приступил к созданию классов наследников для оружия. По-видимому, я все же набил руку, потому что сделал это практически с первого залпа. Отработав технику на Р-27Р, принялся терпеливо дописывать json с данными для оружия и для оружия же писать скрипты класса. Папок было довольно много, поэтому делал я это в несколько приемов, затратив пару дней. Несложно, но одноообразно и надо быть внимательным, чтобы не проскочили символы типа плюс-минус в заголовке класса - консоль тут же выразит свое возмущение...
Теперь превращение 30-мм снаряда в 152-мм во время выстрела и его полета к цели исключено. Схема выглядит так.
Запускаем скрипт в игровом файле - тащим из нужной папки класс оружия, название питоновского файла обычно выглядит так - R27R.py.
def Weapon(cont):
own = cont.owner
nameWeapon = ""
nameGeneral = own.parent.name
nameSysPath = ""
#print(own.parent, own.childrenRecursive)
if hasattr(own.parent, "dictWeapon") == True:
if "WPU" in own.parent.dictWeapon:
nameGeneral = own.parent.dictWeapon["WPU"]["gunBullet"]
if hasattr(own.parent, "parent") == True:
#print(own.parent.parent)
if hasattr(own.parent.parent, "parent") == True:
#print(own.parent.parent.parent)
if hasattr(own.parent.parent.parent, "dictWeapon") == True:
if "bulletGen" in own.parent.parent.parent.dictWeapon:
#print("True")
nameGeneral = own.parent.parent.parent.dictWeapon["bulletGen"]
#print(nameGeneral)
nameSysPath = "//Weapon/"+nameGeneral
sys.path.append(bge.logic.expandPath(nameSysPath))
with open(bge.logic.expandPath("//Weapon/"+nameGeneral+"/"+nameGeneral+".json"), 'r') as directWeaponClass:
JSONweaponClass = json.load(directWeaponClass)
nameWeapon = JSONweaponClass["ownClass"]
unit_module = __import__(nameWeapon)
#print(nameWeapon)
unit_class = getattr(unit_module, nameWeapon)
#print(nameGeneral)
x = unit_class(own)
#import ClassWeapon
#own = cont.owner
#x = ClassWeapon.typeWeapon(own)
А потом уже тащим класс-наследник. Он совсем маленький.
import bge
from ClassWeapon import typeWeapon
class R27R(typeWeapon):
def __init__(self, old_owner):
typeWeapon.__init__(self, old_owner)
def mutate(cont):
R27R(cont.owner)
А этот класс сначаа тащит стандартный класс оружия, который лежит в папке со скриптами для оружия.
import bge
import json
with open(bge.logic.expandPath('//Weapon/WEAPON_CLASS.json'), 'r') as directWeapon:
JSONweapon = json.load(directWeapon)
class typeWeapon(bge.types.KX_GameObject):
def __init__(self, old_owner):
self.__dict__.update(JSONweapon)
def mutate(cont):
typeWeapon(cont.owner)
Тоже ничего особенного. Опять матрешка - отыскивается json со стартовыми данными и идет присвоение атрибутов.
Потом все это подвергается доводке другим скриптом - функцией сартовой инициализации - я об этом раньше писал - просто обновляется словарь класса оружия на основе json той же Р-27Р и все.
По-хорошему, наверное, следовало бы прямо в класс вписать эту самую инициализацию, навеное. Но сделаю это чуть позже. Там свои нюансы, и опять придется перебирать все скрипты ручками...
Поражающее действие ракет я таки отработал и теперь полра шлифовать модель повреждений, а также ИИ ботов, до которого все ника не доходят руки. Что касаемо модели повреждений, то тут меня душит жаба. БГЕ сильно не любит большого количества объектов, а с огнем и дымом именно так дело и обстоит. Очевидно, придется жульничать. Бывает, что сбитые машины падают либо относительно целые (заглох двигатель), либо слабо дымя. Или просто взрываются в воздухе. Вообще же, Евгений Пепеляев, воевавший в Корее, в своей книге "МиГи против Сейбров" писал, что реактивные самолеты горят плохо, в отличие от поршневых, что ж приму его слова в качестве рекомендации и излоупотреблять красивым огненным хвостом не буду.
Комментариев нет:
Отправить комментарий