Ush Temat założony przez niniejszego użytkownika |
Metoda przechowująca zasoby » 2013-11-17 18:06:08 Witam :)
Piszę gierkę 2d i zastanawiam się w jaki sposób wczytać tekstury, dźwięki i czcionki żeby nie robić niczego globalnie. Stworzyłem sobie klasę GameResources, która w konstruktorze wczytuje wszystkie pliki do odpowiedniej tablicy (używam al_load_bitmap()) (3 tablice: grafika, dzwiek, czcionki), w destruktorze wszystko zwalnia i zawiera jeszcze 3 metody Get do "wyciągania" odpowiednich elementów z tablic.
Wszystko byłoby wspaniale, gdyby nie problem z osadzeniem obiektu takiej klasy, w taki sposób, by dało się do niej bezpiecznie odnieść z innego miejsca w kodzie.
Bardzo zależy mi na zachowaniu hermetyzacji i zrobienie tego tak, żeby wszystko wczytywało się raz przy starcie gry. Pewnie problem jest prosty, ale mam jakieś zaćmienie umysłu i męczę się z tym od 2 dni. Jaki jest wg Was najlepszy sposób na eleganckie i bezpieczne wczytywanie plików?
Mam nadzieję że jest coś lepszego niż zrobienie kilkudziesięciu zmiennych globalnych :s |
|
pekfos |
» 2013-11-17 18:12:45 Zmienna globalna lub singleton. |
|
Ush Temat założony przez niniejszego użytkownika |
» 2013-11-17 18:29:34 dzięki za odpowiedź :) pobawię się tym singletonem, bo w sumie pewna osoba mi już o tym wspominała, ale nie byłem przekonany.
|
|
Monika90 |
» 2013-11-17 19:40:17 Singleton to zmienna globalna. (Chyba, że wszystkie funkcje składowe mają atrybut const, to wtedy jest to stała globalna.) |
|
Ush Temat założony przez niniejszego użytkownika |
» 2013-11-17 20:46:37 Wiem, ale chyba nie mam wyjścia. Mógłby ktoś rzucić okiem czy zrozumiałem sens? :D #pragma once #include <iostream> using namespace std; class Singleton { public: static Singleton * getInstance(); int texture[ 3 ]; private: static bool instanceFlag; static Singleton * single; Singleton(); Singleton( const Singleton & ); ~Singleton( void ); };
#include "Singleton.h"
bool Singleton::instanceFlag = false; Singleton * Singleton::single = NULL;
Singleton::Singleton() { } Singleton::Singleton( const Singleton & ) { }
Singleton::~Singleton( void ) { instanceFlag = false; }
Singleton * Singleton::getInstance() { if( !instanceFlag ) { single = new Singleton(); single->texture[ 0 ] = 500; single->texture[ 1 ] = 100; single->texture[ 2 ] = 1500; cout << "Tworze sigleton XD" << endl; instanceFlag = true; return single; } else { cout << "NIE TWORZE JUZ SIGLETONA BO JEDEN JUZ JEST" << endl; return single; } }
I potem jak potrzebuję odwołać się do tego w jakiejś klasie to tworzę sobie za każdym razem nowy wskaźnik z którego mogę sobie korzystać i jestem pewien że mimo że kilka instacji to wszystko wczytało się raz? Ludek::Ludek( void ) { Singleton * s1; texture = s1->texture[ 0 ]; }
|
|
Monika90 |
» 2013-11-17 20:54:08 Zmienna instanceFlag nie jest potrzebna, możesz sprawdzać czy wskaźnik jest NULL. A tutaj: Singleton * s1; texture = s1->texture[ 0 ];
|
|
Ush Temat założony przez niniejszego użytkownika |
» 2013-11-17 21:10:05 Ostatnie pytanie, czyli właśnie samo odwoływanie się w różnych klasach do tego singletona: Czy tworząc kilka obiektów jego typu nie robię tego, czego również chciałem uniknąć, tzn powtarzania się zmiennych przechowujących tę samą bitmapę?
Poziom abstrakcji tego kodu wydaje się mnie przerastać - nie rozumiem tego za bardzo. Czy w pamięci znajduje się tylko 1 obiekt singleton, a to że tworzę sobie ich więcej w różnych miejscach w kodzie powoduje że mam fizycznie 1 obiekt, a reszta to tylko jego "kopie", które mimo innej nazwy wskazują na to samo miejsce w pamięci???
Bo jeśli tak nie jest i kolejne obiekty kopiują mi go fizycznie w pamięci, to w ogóle nie widzę sensu stosowania czegoś takiego :/ Bo znowu sprowadza się to do stworzenia jednego globalnego obiektu jego typu, a tego nie chcę robić :/
To mnie zastanawia:
scr.hu/1hp7/g9zqb
Czy s1, s2, s3 i s4 to ten sam obiekt w pamięci czy nie? |
|
kampar |
» 2013-11-17 23:15:34 Program odpowiedział na twoje pytanie, w pamięci istnieje tylko jeden obiekt. Singleton to zmienna globalna. |
|
|
« 1 » 2 |