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

Nieobsłużony wyjątek w lokalizacji ...

Ostatnio zmodyfikowano 2024-06-01 16:57
Autor Wiadomość
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.

C/C++
class Unit
    : public GameObject
{
public:
   
Texture * attackTextures[ 16 ];
   
Texture * idleTextures[ 16 ];
   
Texture * runTextures[ 16 ];
   
sf::Sprite sprite;
   
   
int frame; // current frame
   
float countdown;
   
int direction; // direction 0 - Top, 1 - Right, 2 - Bottom, 3 - Left
   
float actionRange;
   
float viewRange;
   
   
sf::CircleShape viewRangeArea; // is a range of see of beast // in this range player can be a select as target
   
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 ); // TO-DO - must be a from texture->(cx, cy)
       
sprite.setOrigin( idleTextures[ 0 ]->cx, idleTextures[ 0 ]->cy ); // ERROR
       
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 ) );
       
}
    }
   
P-181146
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).
P-181147
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
P-181148
pekfos
» 2024-05-30 20:59:54
C/C++
sprite.setOrigin( idleTextures[ 0 ]->cx, idleTextures[ 0 ]->cy ); // ERROR
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
C/C++
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.
P-181150
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 ?
P-181151
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.
P-181156
tBane
Temat założony przez niniejszego użytkownika
» 2024-06-01 16:57:57
Czyli dobrze robię :-)
P-181158
« 1 »
  Strona 1 z 1