Как спроектировать систему контроллеров и управлять различными действиями?

Я создаю игру, используя библиотеку EntityX, которая обрабатывает модель Entity-Component-System и SFML.

Прямо сейчас у меня есть четыре основных компонента: положение, направление, скорость и рендеринг, плюс две системы: система движения и система рендеринга.

Я разделю свой вопрос на две части:

  • Как я могу сделать основные элементы управления, такие как перемещение моего персонажа? С SFML я могу получить события следующим образом:

    sf::Event event;
    while(window.pollEvent(event))
    {
    if(event.type == sf::Event::Closed)
    window.close();
    // other events ...
    }
    

Таким образом, я мог бы создать ControllerSystem, которая предназначена для объектов, имеющих компонент Controller, и дать ссылку на мое окно в систему, чтобы оно обрабатывало события. Но единственным контролируемым объектом был бы мой персонаж, так ли это действительно эффективно? Кроме того, это означает, что для получения событий KeyPressed мне пришлось бы проходить через события в моей системе. Таким образом, я не могу, например, выполнить условие, чтобы закрыть окно, за исключением случаев, когда я ставлю его вместе с событиями для персонажа.

Наконец, когда я получаю — где бы он ни был — событие KeyPressed и хочу выполнить действие, как и куда мне отправить это действие, чтобы оно реализовалось? Я имею в виду, что моя система контроллеров может заменить моего персонажа, а система ИИ может заменить моба. Я не собираюсь записывать смещение дважды в моих системах, даже если оно просто меняет направление и скорость. У меня могут быть более сложные действия, такие как запуск заклинаний и т. Д.

  • Подходя ко второму пункту, как обращаться с различными заклинаниями / оружием? Предположим, у меня есть три клавиши A, B, C, каждый из которых запускает совершенно другое заклинание. В моем компоненте контроллера, когда я получаю событие, сообщающее, что была нажата одна из этих клавиш, я хотел бы запустить заклинание. Но где я должен хранить это заклинание в коде? Предполагая, что три заклинания должны быть закодированы по-разному, поскольку они имеют разный состав, но между ними должен быть общий паттерн, не так ли?

Так должны ли заклинания быть системами или просто обычными классами из модели ECS, имеющими доступ к диспетчеру сущностей и компонентам для создания снарядов, или я не знаю что?

Это остается довольно размытым для меня, и я не могу найти достаточно конкретные учебники. Спасибо за вашу помощь.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …