핵토버페스트 2

3035 단어 roguelikeopensource


이 글은 Pataro.에 대한 직렬화 구현을 위한 계획 및 전략을 작업하기 위한 것입니다. 많은 조사와 머리 긁적 끝에 필요한 데이터를 직렬화하는 방법을 알아낸 것 같고 작업하면서 작성하고 싶습니다. 내가 하고 있는 일과 그 이면의 논리를 추적하기 위해.

이 문제를 해결하는 동안 내가 직면한 가장 큰 문제 중 하나는 프로그램의 구조를 파악하는 것이었습니다. 이전에 게임 작업을 해본 적이 없어서 서로 다른 모든 조각이 어떻게 결합되는지에 대한 구조가 생소하지만, 지난 며칠, 몇 주 동안 천천히 알아내고 있습니다. Pataro의 개발자와 연락을 취하고 libtcod의 개발에 대한 자습서를 읽은 후 어떻게 접근해야 할지 더 잘 알게 된 것 같습니다.



Pataro 리포지토리의 이 이미지는 항목이 어떻게 구성되어 있는지에 대한 높은 수준의 보기를 제공하지만 빠르게 추적하기 어려운 코드로 다이빙합니다. 다시 말하지만, 개발자나 libtcod 개발자의 잘못이 아니라 이러한 유형이나 규모의 프로젝트에서 작업한 경험이 없기 때문입니다.

플레이어는 항목, 함정, 문, 몬스터, 플레이어 등을 상속이 아닌 구성을 통해 나타낼 수 있는 클래스인 Entity 개체입니다.

class Engine
    {
...
        GameState m_state = GameState::StartUp;

        std::shared_ptr<Entity> m_player;  ///< Pointer shared between the levels and the engine
        std::unique_ptr<Map> m_map;
        std::unique_ptr<Gui> m_gui;
...
}


Entity 클래스에는 다양한 가능한 상태를 나타낼 수 있는 여러 포인터 데이터 멤버가 포함되어 있습니다. 이것은 프로그램을 구성하는 모든 포인터로 인해 각 구성 요소와 해당 구성 요소를 사용하는 각 구성 요소에 대한 직렬화 방법을 구현해야 하기 때문에 직렬화에 대한 고유한 문제를 제기합니다.

class Entity
    {
...
        std::unique_ptr<component::Attacker>     m_attacker     = nullptr;  ///< For Entities that deal damages
        std::unique_ptr<component::Destructible> m_destructible = nullptr;  ///< For destructible Entities
        std::unique_ptr<component::AI>           m_ai           = nullptr;  ///< For self updating Entities
        std::unique_ptr<component::Container>    m_container    = nullptr;  ///< Something that can contain Entities
        std::unique_ptr<component::Use>          m_use          = nullptr;  ///< Something that can be used (create an action)
...
}


내 의도는 엔진을 포함하여 계층 구조의 모든 개체에 대해 이러한 메서드를 구현하는 것입니다. 다음 개체는 마지막 개체의 직렬화 메서드를 호출한 다음 시작하거나 시작할 때 엔진에서 하나의 직렬화/역직렬화 메서드를 호출할 수 있습니다. 게임 종료.

class Attacker
    {
...
  template<class Archive>
        void save(Archive& archive)
        {
            archive(m_power);
        }
...
}


아직 해야 할 일이 많지만 마침내 어떻게 접근해야 할지 알 것 같으니 이제 멀지 않았으면 좋겠습니다.

좋은 웹페이지 즐겨찾기