tBane Temat założony przez niniejszego użytkownika |
Nieobsłużony wyjątek w lokalizacji ... » 2024-05-30 19:00:24 Witam. Wyskakuje mi nietypowy błąd - nie rozumiem dlaczego wywala "Nieobsłużony wyjątek w lokalizacji 0x00007FF7B7BA6F9D w RPG.exe: 0xC0000005: Naruszenie zasad dostępu podczas odczytywania w lokalizacji 0x000000000000002C." Wszystkie tekstury są wczytywane poprawnie. Kod zamieszczam poniżej. class Unit : public GameObject { public: Texture * attackTextures[ 16 ]; Texture * idleTextures[ 16 ]; Texture * runTextures[ 16 ]; sf::Sprite sprite; int frame; float countdown; int direction; float actionRange; float viewRange; sf::CircleShape viewRangeArea; sf::CircleShape actionRangeArea; Unit( string name, float radius, float width, float height ) : GameObject( name, 0, 0, radius, width, height, true ) { loadTextures(); frame = 0; countdown = 0.0f; direction = 2; sprite = sf::Sprite(); sprite.setOrigin( 32, 58 ); sprite.setOrigin( idleTextures[ 0 ]->cx, idleTextures[ 0 ]->cy ); viewRange = 200.0f; actionRange = 25.0f; setViewRangeArea(); setActionRangeArea(); } void loadTextures() { for( int i = 0; i < 4; i++ ) { attackTextures[ i ] = getTexture( "assets/" + name + "/attackTop" + to_string( i ) ); attackTextures[ 4 + i ] = getTexture( "assets/" + name + "/attackRight" + to_string( i ) ); attackTextures[ 8 + i ] = getTexture( "assets/" + name + "/attackBottom" + to_string( i ) ); attackTextures[ 12 + i ] = getTexture( "assets/" + name + "/attackLeft" + to_string( i ) ); idleTextures[ i ] = getTexture( "assets/" + name + "/idleTop" + to_string( i ) ); idleTextures[ 4 + i ] = getTexture( "assets/" + name + "/idleRight" + to_string( i ) ); idleTextures[ 8 + i ] = getTexture( "assets/" + name + "/idleBottom" + to_string( i ) ); idleTextures[ 12 + i ] = getTexture( "assets/" + name + "/idleLeft" + to_string( i ) ); runTextures[ i ] = getTexture( "assets/" + name + "/runTop" + to_string( i ) ); runTextures[ 4 + i ] = getTexture( "assets/" + name + "/runRight" + to_string( i ) ); runTextures[ 8 + i ] = getTexture( "assets/" + name + "/runBottom" + to_string( i ) ); runTextures[ 12 + i ] = getTexture( "assets/" + name + "/runLeft" + to_string( i ) ); } } |
|
DejaVu |
» 2024-05-30 19:17:08 Odwołujesz się do nieistniejącego obiektu, bo tworzysz tablicę wskaźników na tekstury, a nie tablicę tekstur (choć i tak oba rozwiązania są niepoprawne). |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-30 19:33:45 To jak to w takim razie zrobić ? Potrzebuję mieć trzy tablice wskaźników tekstur |
|
pekfos |
» 2024-05-30 20:59:54 sprite.setOrigin( idleTextures[ 0 ]->cx, idleTextures[ 0 ]->cy ); To jest miejsce gdzie program się wywalił? Skoro to wiesz, to pewnie uruchomiłeś program pod debuggerem i wtedy można dojść łatwo czemu nie działa. idleTextures[0] było pewnie pustym wskaźnikiem, więc to wywołanie idleTextures[ i ] = getTexture( "assets/" + name + "/idleTop" + to_string( i ) );
nie zwróciło poprawnego wskaźnika. A czemu, to już nie wiadomo z podanego kodu. Może ta funkcja nie powinna nigdy zwracać pustego wskaźnika (w przypadku błędu?), jeżeli nie planujesz tego nigdy sprawdzać. Odwołujesz się do nieistniejącego obiektu, bo tworzysz tablicę wskaźników na tekstury, a nie tablicę tekstur (choć i tak oba rozwiązania są niepoprawne). Już lepiej niech ma wskaźniki, bo wtedy przynajmniej jest szansa że każda jednostka w grze nie ładuje swojej własnej kopii kompletu tekstur. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-30 23:30:49 mój błąd pobierałem tekstury, których wcześniej nie ładowałem a zrozumiałem to dopiero teraz. Dzięki za pomoc :-) Już lepiej niech ma wskaźniki, bo wtedy przynajmniej jest szansa że każda jednostka w grze nie ładuje swojej własnej kopii kompletu tekstur.
Istnieje lepsza opcja niż wskaźniki na tekstury ? |
|
pekfos |
» 2024-06-01 12:33:43 Istnieje lepsza opcja niż wskaźniki na tekstury ? To zależy co chcesz osiągnąć. Wskaźnik jest właściwym rozwiązaniem, bo chcesz mieć jedną kopię każdej tekstury (i może nawet getTexture() to zapewnia). Istotne jest jak chcesz zarządzać tą pamięcią. Jeżeli tekstury będą zwalniane w czasie gry, to musisz zachować ostrożność, bo jedno odniesienie do usuniętej tekstury wystarczy by wywalić grę. Pod tym względem wygodniejszą opcją będzie std::shared_ptr<>, które wykona delete gdy ostatni wskaźnik na ten obiekt zostanie zniszczony, więc nie musisz robić tego ręcznie i nie będzie sytuacji że używany obiekt zostanie usunięty. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-06-01 16:57:57 Czyli dobrze robię :-) |
|
« 1 » |