저는 2D 공간 범인을 만들기 위해 엔티티 구성 요소 시스템 (ECS) 프레임 워크를 사용하고 있습니다. 내 구성 요소는 데이터 전용이고 내 시스템은 모든 논리를 처리하며 엔티티는 기본적으로 ID입니다. 나는 SFML 개발자 중 하나에 의해 만들어진 정말 멋진 입력 시스템을 사용하고구성 요소 - 엔티티 시스템 - 입력 처리
struct LaserCannon {
bool shooting;
};
struct Thrusters {
bool up, left, right, down;
float acceleration;
};
struct Movement {
sf::Vector2f velocity, acceleration;
float maxSpeed;
};
, thor 전화 :
은 여기 내 구성 요소의 일부입니다. sf::Keyboard::W
과 같은 입력은 Control::UP
과 같은 상위 레벨 이벤트에 매핑됩니다. 이벤트가 inputMap->isActive(Control::UP)
을 통해 발생했는지 확인한 다음 적절하게 응답하는지 확인할 수 있습니다.
이렇게하면 원시 입력이 하나의 추상화 레벨로 올라갑니다. 그러나 조금 더 가야합니다. Control::UP
과 같은 것에 응답 할 수있는 엔티티가 필요하고 플레이어 우주선의 스러 스터를 활성화하는 것과 같은 결과 엔티티 레벨의 것들을 활성화해야합니다. 구성 요소와 시스템을 사용하여 접근하는 방법을 모르기 때문에 아직이 작업을 수행하지 않았습니다!
나는 하나의 가능한 해결책을 마련했습니다 내가 제어 할 모든 것들을 나타내는 논리 값을 가지고 PlayerShipController라는 새로운 구성 요소를 만들 수 있습니다. 다른이있는 경우,이를 달성하기 아마도 더 나은 방법을
struct PlayerShipController {
bool up, left, right, down, shoot;
};
// Input handling system
struct InputSystem : public entityx::System<InputSystem> {
InputSystem(std::shared_ptr<thor::ActionMap<Event>> inputMap) : inputMap(inputMap) {}
void update(entityx::EntityManager &es, entityx::EventManager &events, entityx::TimeDelta dt) override {
// Iterate across all entities with a PlayerShipController
es.each<cm::PlayerShipController>([dt, this](entityx::Entity entity, cm::PlayerShipController &controller) {
if (inputMap->isActive(Event::LEFT_BUTTON)) {
controller.left = true;
}
if (inputMap->isActive(Event::UP_BUTTON)) {
controller.up = true;
}
if (inputMap->isActive(Event::RIGHT_BUTTON)) {
controller.right = true;
}
if (inputMap->isActive(Event::DOWN_BUTTON)) {
controller.down = true;
}
});
};
std::shared_ptr<thor::ActionMap<Event>> inputMap;
};
을하지만 궁금 : I는 입력에 반응하여과 같이 따라 그 논리 값을 설정하는 시스템을 가지고있다. 내가 정말로 내 솔루션에 대해 싫어하는 것은 게임에 매우 특정한 시스템을 작성해야한다는 것입니다 (PlayerShipController - 너무 구체적으로 생각합니다!)! 나는 중간층의 일종을 갖는 것이 훨씬 깔끔할 것이라고 생각한다. 나에게, 아래의 해결책은 훨씬 더 차갑다!
- 사용자 프레스 'w'
- 만 배는 사용자가 제어를 위해 어떻게 든,
Ship::THRUST_UP
처럼 개체 수준의 이벤트에 매핑되는 Control::UP
의 InputMap 토르에 의해Control::UP
로 번역되는 'W'- 엔티티 수준의 이벤트는 무엇 especi입니다
Thrusters::up
부울
Ship::THRUST_UP
같은
를 활성화 같은 행동으로 변환됩니다 이 솔루션에 대한 멋진 동맹인데, 나는 소행성 폭발과 같은 많은 다른 것들을 제어하기 위해 동일한 엔티티 레벨 이벤트를 사용하거나 적기가 스러 스터를 사용하는 것과 같은 이상적인 이벤트를 사용할 수 있다는 것이 이상적이다. 이제는 구현하거나 ECS에 통합하는 방법을 모르겠습니다. 어떻게해야합니까?