SFML - zbiór instancji sf::Shapes

SFML - zbiór instancji sf::Shapes
Bartosz36
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:348
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:

Kopiuj
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)?


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)
mwl4
  • Rejestracja:około 12 lat
  • Ostatnio:14 dni
  • Lokalizacja:Wrocław
  • Postów:399
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:

Kopiuj
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);
    // ...
}

Asm/C/C++
edytowany 1x, ostatnio: mwl4
Bartosz36
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:348
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 ;)


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.