Войти
ПрограммированиеФорумОбщее

Паттерн событий и их взаимодействия с актерами и окружением

#0
8:31, 24 мар 2014

Актёр - любой персонаж, в том числе и тот которым управляет пользователь.
Окружение - все элементы, которые не управляемые, но разрушаемы или перемещаемые, либо имеющие ещё какие нибудь динамические свойства.
Эффект - пуля, волна(звуковая, ударная), огонь, взрыв. Тоесть все те элементы которые генерирует пользователь и окружение.

Я сразу изложу проблемы и своё видение(весь приведенный код касается только изменения свойств актеров и окружения):
Представим есть такие классы:
Класс для наследования:

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(), в этой функции генерируется эффект, который оправляется в стек эффектов и при каждом обновлении все обьекты будут тестироваться,
на попадание под условие любого из элементов в этом стеке эффектов. Но у меня возникла такая проблема, я незнаю как мне сделать триггер для определения когда эффект закончился.
Допустим пуля достигла пределов карты, пуля врезалась во что-то, взрыв вообще происходит очень быстро... Подскажите пожалуйста, может есть какой нибудь паттерн, подходящий для этого?

#1
8:45, 24 мар 2014

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

//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

#2
9:29, 24 мар 2014

KatekovAnton
Да, да точно, но вьюху огня/спрайта/взрыва это да. Меня интересует как узнать попал ли кто-то в поле действия этого взрыва?
Но проблема в том, представь, кто то стреляет, что-то взрывается и т.д. Стек этих вот эффектов будет полный, и мне нужно будет каждый объект окружения, каждого актёра мне нужно будет проверить с каждым эффектом в стеке эффектов, и если допустим актер находится в поле действия взрыва то нанести ему урон.
Допустим, на сцене:

6  - актеров
15 - объектов окружения

Каждый актер сгенерировал по 2 события:

Кол-во событий: 6*2=12

Каждый обьект окружения тоже сгенерировал по 1 событию:

Кол-во событий: 12 + 1*15 = 27

Предположим, что для каждого события нужно пройти по 3 операции сравнения(например расстояние, фракция игрока, тоесть друг он или враг и броня):
Каждый актер и объект окружения должен тестироваться с каждым эффектом:

Кол-во сравнений: (15+6)*(27*3)=1701

Довольно много... Вот я и подумал, может я как-то не так мыслю и есть друге способы.

#3
9:37, 24 мар 2014

Nawy
Во первых все обжэхты мира можно разделить на статические и динамические,
тогда проверять статические со статическими уже не нужно.
Далее динамические эффекты можно разделить на группы, например BULLET и SHELL.
Пули проверять на столкновение между собой не нужно, достаточно только проверить на столкновения со снарядами.
Еще для упрощения можно заиметь маску коллизий:

+ Показать
ПрограммированиеФорумОбщее

Тема в архиве.