Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Metoda przechowująca zasoby

Ostatnio zmodyfikowano 2013-11-18 18:13
Autor Wiadomość
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
P-96469
pekfos
» 2013-11-17 18:12:45
Zmienna globalna lub singleton.
P-96471
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.
P-96482
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.)
P-96496
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

C/C++
#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 );
};

C/C++
#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; //wczytywanko grafik
        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?
C/C++
Ludek::Ludek( void )
{
    Singleton * s1;
    texture = s1->texture[ 0 ];
}
P-96507
Monika90
» 2013-11-17 20:54:08
Zmienna instanceFlag nie jest potrzebna, możesz sprawdzać czy wskaźnik jest NULL.

A tutaj:
C/C++
Singleton * s1; //niezainicjalizowany wskaznik
texture = s1->texture[ 0 ]; //crash!!!
P-96508
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?
P-96509
kampar
» 2013-11-17 23:15:34
Program odpowiedział na twoje pytanie, w pamięci istnieje tylko jeden obiekt.
Singleton to zmienna globalna.
P-96526
« 1 » 2
  Strona 1 z 2 Następna strona