SFML - zbiór instancji sf::Shapes

0

Cześć,

Chcąc wykorzystać SFML do jednego ze swoich projektów natknąłem się na problem w związku z budową klasy sf::Shape wspomnianej wcześniej biblioteki.
To co chcę uzyskać to utworzyć klasę reprezentującą ciało, lub po prostu postać, którą wykorzystam do dalszych animacji. Ciało to składać się będzie ze zbioru różnych kształtów reprezentowanych fajnie i wygodnie przez różne klasy SFML'a jak choćby: sf::RectangleShape, sf::CircleShape. Każda z tych klas dziedziczy jednak po bardziej abstrakcyjnym (w przenośni i dosłownie jak się niestety okaże) bycie jakim jest po prostu kształt: sf::Shape.

Mając więc ciało:

class BodyC
{
public:
    // Tworzy ciało alokując pamięć potrzebną na elementy
    BodyC( unsigned int bodyElementsCount = 1 );

    // Usuwa elementy z pamięci
    ~BodyC( void );

private:
    // Tutaj zbiór elementów jako typ  sf::Shape
}

chciałbym przechowywać w nim różne typy kształtów, które oferuje SFML, dlatego typ kontenera/zbioru deklaruję jako sf::Shape.

Tu jednak zaczynają się problemy, ponieważ:

1.: nie mogę wykorzystać na przykład std::vector gdyż klasa sf::Shape jest abstrakcyjna.
Owszem, mogę utworzyć cienką warstwę opakowującą sf::Shape i zaimplementować jej metody czysto wirtualne, jednak nie potrzebuję tych metod i w żaden sposób nie upraszcza mi to rozwiązania.

2.: nie mogę wykorzystać surowego wskaźnika, który alokowany będzie znienawidzonym new w konstruktorze zależnie od parametru bodyElementsCount, a usuwany będzie rzecz jasna w destruktorze. Nie mogę, ponieważ konstruktor klasy sf::Shape jest prywatny i błąd kompilacji mówi, że nie mam oczywiście do niego dostępu w moim konstruktorze...

3.: nie chcę tworzyć własnego kształtu o dowolnie ułożonych punktach i dowolnych wektorach - nie po to SFML udostępnia wygodne do szybkiego prototypowania kształty, aby teraz tracić czas na swoje własne. ;)
Tym bardziej, jeśli też będą to proste figury jak prostokąt, czy koło.


Co więc mam robić? Kończą mi się pomysły, a wyniki Google'a dają jedynie problemy związane z vector'em konkretnych już kształtów...
Jedyne rozwiązanie, na jakie trafiam szukając to wykorzystanie surowych vertex'ów i określanie własnych kształtów, ale stworzone przeze mnie Ciała w animacji będą różne i chciałbym zamodelować taki byt, który nie będzie dbał o to jakie kształty będzie miała rzeczywiście jego instancja.

Czy ktoś bawił się kiedyś SFML'em i natknął się na podobny problem, lub czytając to doszedł do czegoś czego ja nie widzę (może z racji późnej godziny)?

1

Użyj smart pointerów. Klasa sf::Shape ma wirtualny destruktor, więc wszystko będzie ładnie działać. Nie opisałeś w którym miejscu ty chcesz tworzyć obiekty typu sf::CircleShape, sf::ConvexShape czy sf::RectangleShape. Ja bym to zrobił tak:

class BodyC
{
public:
    BodyC( void ) {}
    ~BodyC( void ) {}

    sf::RectangleShape *CreateRectangle(const Vector2f &size = Vector2f(0, 0))
    {
        std::unique_ptr<sf::RectangleShape> object = std::make_unique<sf::RectangleShape>(size);
        sf::RectangleShape *const result = object.get();
        m_shapes.push_back(std::move(object));
        return result;
    }
    
    // CreateConvex(), CreateCircle itd.

private:
    std::vector<std::unique_ptr<sf::Shape>> m_shapes;
};

void foo()
{
    BodyC body;
    sf::RectangleShape *const rect = body.CreateRectangle(Vector2f(50.f, 50.f));
    rect->setPosition(100.f, 100.f);
    // ...
}
0

Miejsce tworzenia obiektów nie bardzo miało dla mnie znaczenie w tym wątku. Przede wszystkim problem leżał w ich przechowywaniu i wykorzystaniu właśnie klas konkretnych kształtów.
smart_pointer'y rozwiązują problem. Dzięki za pomoc ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1