Актёр - любой персонаж, в том числе и тот которым управляет пользователь.
Окружение - все элементы, которые не управляемые, но разрушаемы или перемещаемые, либо имеющие ещё какие нибудь динамические свойства.
Эффект - пуля, волна(звуковая, ударная), огонь, взрыв. Тоесть все те элементы которые генерирует пользователь и окружение.
Я сразу изложу проблемы и своё видение(весь приведенный код касается только изменения свойств актеров и окружения):
Представим есть такие классы:
Класс для наследования:
class Object { private: Vec2D mPos; //позиция int mHP; // здоровье public: //set и get методы для mPos и mHP }
Актёр:
class GameActor : public Object { public: //ability void fire(Vec2D direction); // команда стрелять }
Эффект:
class ActorAbility { private: int mDamage; // Урон int mRadius; //радиус в котором этот урон применяется Vec2D mPos; //положение int mTime; // время действия public: //далее методы set и get для mRadius, mDamage, mPos, mTime }
Окружение:
class WorldObject : public Object { public: void isEplode() { if( mHP <= 0) explode( ); } //например бочка с топливом, если закончилось здоровье, то взорвать void explode( ); // взорваться }
Я думаю так:
GameActor делает fire(), в этой функции генерируется эффект, который оправляется в стек эффектов и при каждом обновлении все обьекты будут тестироваться,
на попадание под условие любого из элементов в этом стеке эффектов. Но у меня возникла такая проблема, я незнаю как мне сделать триггер для определения когда эффект закончился.
Допустим пуля достигла пределов карты, пуля врезалась во что-то, взрыв вообще происходит очень быстро... Подскажите пожалуйста, может есть какой нибудь паттерн, подходящий для этого?
это контроллер же, не тот объект который в движке апдейтится в цикле? просто на событие начала огня создавай вьюху огня (спрайт или как у тебя вьюхи называются?), помещай на сцену и по таймеру удаляй.
//example of engine object class EngineObject { public: virtual void Update(double time); }; class GameActor : public Object { EngineObject * fireObject; public: //ability void fire( Vec2D direction); // команда стрелять }; void GameActor::fire( Vec2D direction) { fireObject = //make fire, set position, direction and other engine->addObject( fireObject); }
чтото типа того. предполагается что спрайт наследован от EngineObject
KatekovAnton
Да, да точно, но вьюху огня/спрайта/взрыва это да. Меня интересует как узнать попал ли кто-то в поле действия этого взрыва?
Но проблема в том, представь, кто то стреляет, что-то взрывается и т.д. Стек этих вот эффектов будет полный, и мне нужно будет каждый объект окружения, каждого актёра мне нужно будет проверить с каждым эффектом в стеке эффектов, и если допустим актер находится в поле действия взрыва то нанести ему урон.
Допустим, на сцене:
6 - актеров
15 - объектов окружения
Каждый актер сгенерировал по 2 события:
Кол-во событий: 6*2=12
Каждый обьект окружения тоже сгенерировал по 1 событию:
Кол-во событий: 12 + 1*15 = 27
Предположим, что для каждого события нужно пройти по 3 операции сравнения(например расстояние, фракция игрока, тоесть друг он или враг и броня):
Каждый актер и объект окружения должен тестироваться с каждым эффектом:
Кол-во сравнений: (15+6)*(27*3)=1701
Довольно много... Вот я и подумал, может я как-то не так мыслю и есть друге способы.
Nawy
Во первых все обжэхты мира можно разделить на статические и динамические,
тогда проверять статические со статическими уже не нужно.
Далее динамические эффекты можно разделить на группы, например BULLET и SHELL.
Пули проверять на столкновение между собой не нужно, достаточно только проверить на столкновения со снарядами.
Еще для упрощения можно заиметь маску коллизий:
Тема в архиве.