SFML - statyczny obiekt sf::Texture

0

Witam, mam w klasie statyczna teksture:

class bullet
{
private:
sf::Sprite sprajt_kuli;
static sf::Texture tekstura_kuli;

......

}

w jaki sposob moge teraz za pomoca funkcji sf::loadFromFile() wczytac do tej statycznej tekstury plik z dysku?

1

Nie idź tą drogą.

0

Stwórz statyczną funkcję do ładowania tego zasobu.

0

Ja popieram @Azarien 'a. W jedną klasę ładujesz sprite i teksture.

Tekstura powinna być w jakim managerze, który mógłby być singletonem(czyli ma statyczne funkcje do zwracania i tworzenia np.) ale i tak będzie przechowywał tekstury w strukturze typu tablica czy coś innego(nie statyczne).

Natomiast sprite to już coś, co wyróżnia dany obiekt w grze, on nie potrzebuje mieć ciągle informacji typu tekstura a jedynie teksturę w momencie tworzenia obiektu aby uzyskać sprite.

0

Kurcze teraz juz sam nie wiem czy ta statyczna tekstura cos pomoze, opisze dokladniej moj problem moze uda sie go rozwiacac:
Mam kilka klas w programie, w tym:
-klasa bullet - jest to klasa pocisku w grze,
-klasa hero - klasa glownego bohatera, tam znajduje sie tablica - deque <bullet> naboje

Przy kliknieciu mysza tworze nowy obiekt klasy bullet w klasie hero i problem polega na tym ze widze po prostu bialy prostokacik zamiast kolorowego i pieknego sprajta.

W czym tkwi problem?

zarowno sprite jak i tekstura znajduja sie w tej samej klasie, wiec widocznie blad polega na tym ze sprite jakby gubi teksture, kiedy jest tworzony nowy obiekt typu bullet w tablicy deque... ;(

class bullet
{
private:
sf::Sprite sprajt_kuli;
sf::Texture tekstura_kuli;

.............
};

class hero:public postac
{

private:
deque <bullet> naboje;

..............

};

0
Hostel napisał(a):

Ja popieram @Azarien 'a. W jedną klasę ładujesz sprite i teksture.

Tekstura powinna być w jakim managerze, który mógłby być singletonem(czyli ma statyczne funkcje do zwracania i tworzenia np.) ale i tak będzie przechowywał tekstury w strukturze typu tablica czy coś innego(nie statyczne).

Natomiast sprite to już coś, co wyróżnia dany obiekt w grze, on nie potrzebuje mieć ciągle informacji typu tekstura a jedynie teksturę w momencie tworzenia obiektu aby uzyskać sprite.

Przecież posiadanie statycznego pola wewnątrz klasy opiera się na podobnej zasadzie - jest to globalny obiekt dla wszystkich instancji tej klasy. Tworzenie osobnego managera w postaci singletona da dokładnie ten sam efekt. Oczywiście poza faktem że wiąże się to z dodatkowym nakładem pracy, który da w konsekwencji bardziej reusable code. Rodzi się pytanie, czy dla autora wątku jest to konieczne? Wydaje mi się że nie jest.

Co do tematu. Idąc drogą statycznego obiektu wewnątrz Twojej klasy, musisz wywołać dla niego odpowiednią funkcję. Może to być w konstruktorze klasy, czy to w jakiejś innej funkcji - w zależności od potrzeby. Musisz jednak zdawać sobie sprawę z pewnych konsekwencji. Twoja tekstura powinna być wczytana TYLKO RAZ. To w jaki sposób tego dokonasz już leży w Twoim pomyśle.
Z dokumentacji klasy sf::Texture widzę że nie można sprawdzić czy tekstura jest załadowana, poza sprawdzeniem czy udało się załadować obraz przez sf::loadFromFile(). W takim wypadku możesz teksturę posiadać w formie pointera i dynamicznie go alokować w konstruktorze klasy. Wcześniej przypisujesz mu 0, NULL'a, lub nullptr. Zaraz po alokacji ładujesz grafikę do tej tekstury. Bezpośrednio przed alokacją sprawdzasz czy wskaźnik już nie wisi na stercie, dzięki czemu będziesz mieć pewność co do tego że z każdym utworzonym obiektem Twojej klasy nie będziesz powtarzać ciągłego ładowania potrzebnego zasobu. "Singleton" jak "w mordę strzelił" ;]
Możesz również łatwiej to osiągnąć przez dodanie statycznej flagi monitującej czy już dokonano załadowania zasobu np coś takiego w pseudokodzie:

if( !loaded ) {
	loaded = texture.loadFromFile( /* args */ );
}
0

Wielkie dzieki dampe, zamiast statycznej zrobilem pointera do sf::Texture i alokowalem dynamicznie i wszystko smiga :)

Jeszcze raz dzieki ;)

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