qest43 Temat założony przez niniejszego użytkownika |
[ALLEGRO 5] Wyciek pamięci w programie » 2014-06-21 15:58:20 Błąd występuję podczas wczytywania mapy. Gdy jest mało elementów do wczytania, program działa poprawnie, natomiast przy większej liczbie elementów mapy do wczytania, program ma problem z wczytaniem pliku Player.txt, gdzie umieszczona jest np. ścieżka do grafiki, no i program crashuje bo nie może wyświetlić grafiki, której nie wczytał. Nie mam pojęcia co może powodować te zamazywanie ścieżek. Metoda klasy layer, każdy kafelek jest wysyłany tutaj tiles[ tiles.size() - 1 ].SetContent( tileImage, tempState, position );
void Layer::LoadContent( std::string layerID, std::string mapID ) { std::string filename = "Load/Maps/" + mapID + ".txt"; fileManager.LoadContent( filename.c_str(), attributes, contents, layerID ); int indexY = 0; for( int i = 0; i < attributes.size(); i++ ) { for( int j = 0; j < attributes[ i ].size(); j++ ) { if( attributes[ i ][ j ] == "SolidTiles" ) solidTiles.push_back( SetTiles( contents[ i ][ j ] ) ); else if( attributes[ i ][ j ] == "TileSheet" ) tileSheet = al_load_bitmap( contents[ i ][ j ].c_str() ); else if( attributes[ i ][ j ] == "StartLayer" ) { for( int k = 0; k < contents[ i ].size(); k++ ) { if( contents[ i ][ k ] != "---" ) { ALLEGRO_BITMAP * tileImage; Tile::State tempState = Tile::State::Passive; std::pair < int, int > tile = SetTiles( contents[ i ][ k ] ); if( std::find( solidTiles.begin(), solidTiles.end(), tile ) != solidTiles.end() ) { tempState = Tile::State::Solid; } tileImage = al_create_sub_bitmap( tileSheet, tile.first * 32, tile.second * 32, 32, 32 ); std::pair < float, float > position( k * 32, indexY * 32 ); Tile tileInstance; tiles.push_back( tileInstance ); tiles[ tiles.size() - 1 ].SetContent( tileImage, tempState, position ); } } indexY++; } } } } Przechodzi wtedy do metody klasy Tile, po usunięciu linijki tileAnimation.LoadContent( tileImage, "", position );
Program nie crashuje. void Tile::SetContent( ALLEGRO_BITMAP * tileImage, State state, std::pair < float, float > position ) { image = tileImage; this->state = state; tileAnimation.LoadContent( tileImage, "", position ); } No a tak wygląda ta metoda klasy Animation void Animation::LoadContent( ALLEGRO_BITMAP * image, std::string text, std::pair < float, float > position ) { this->image = image; this->text = text; this->position = position; alpha = 255; font = al_load_font( "font1.ttf", 30, NULL ); sourceRect = image; isActive = false; ammountOfFrames = std::pair < int, int >( 3, 4 ); currentFrame = std::pair < int, int >( 1, 0 ); } Przypominam że program działa poprawnie gdy wczytuje się mniejszą ilość danych. Ścieżki zamazuje jak wczytał z 480 elementów mapy. Cały projekt: http://www.speedyshare.com/Xe5Wa/RPG.rarKompilowany na VS 2012 |
qest43 Temat założony przez niniejszego użytkownika |
» 2014-06-21 16:51:54 Contents ma zawsze albo tyle samo, albo więcej od Attributes. Plik menu: Load =[ Title ]
Load =[ Position ][ Axis ][ Font ][ Animation ] [ 0 0 ][ 2 ][ Font1 ][ Fade ]
Load =[ Image ] [ Data / Images / Menu / background.png ]
Load =[ Item ][ ItemLink ] [ New Game ][ GameplayScreen ] [ Exit ][ SplashScreen ]
EndLoad =[ Title ]
Menager plików wczytuje każdy Load= jako Attributes, ale nie zwiększy go o 1, jeśli pod spodem nie ma Contents. Czyli w tym przypadku Attributes bedzie miało 3 (3 Load=, gdzie pod spodem jest Contents). Plik mapy: Load =[ Layer1 ]
Load =[ SolidTiles ] [ 2, 0 ] [ 1, 0 ]
Load =[ TileSheet ] [ TileSheets / tilesheet.png ]
Load =[ StartLayer ] [ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ] [ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ] [ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ] [ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ] [ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ] [ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ] [ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ] [ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ] [ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ] [ 0, 0 ][ 1, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ] [ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]
EndLoad =[ Layer1 ]
Jak widać Contents załaduje się znacznie więcej od Attributes. Tyle danych jest jeszcze w stanie wczytać, ale jak by wkleić parę razy jeszcze te kaflę, to wtedy nie wczytuje już danych z pliku player. Metoda Wczytywania danych z pliku: void FileManager::LoadContent( const char * filename, std::vector < std::vector < std::string > > & attributes, std::vector < std::vector < std::string > > & contents, std::string identifier ) { std::string line; std::string newLine; std::cout << filename << std::endl; std::ifstream openfile( filename ); if( openfile.is_open() ) { while( !openfile.eof() ) { std::stringstream str; std::getline( openfile, line ); if( line.find( "EndLoad=" ) != std::string::npos && line.find( identifier ) != std::string::npos ) { identifierFound = false; break; } else if( line.find( "Load=" ) != std::string::npos && line.find( identifier ) != std::string::npos ) { identifierFound = true; continue; } if( identifierFound ) { if( line.find( "Load=" ) != std::string::npos ) { type = Attributes; line = line.erase( 0, line.find( "=" ) + 1 ); tempAttributes.clear(); } else { type = Contents; tempContents.clear(); } str << line; while( std::getline( str, newLine, ']' ) ) { newLine.erase( std::remove( newLine.begin(), newLine.end(), '[' ), newLine.end() ); std::string erase = " \t\n\r"; newLine.erase( newLine.find_last_not_of( erase ) + 1 ); if( type == Attributes ) tempAttributes.push_back( newLine ); else tempContents.push_back( newLine ); std::cout << newLine << std::endl; } if( type == Contents && tempContents.size() > 0 ) { attributes.push_back( tempAttributes ); contents.push_back( tempContents ); std::cout << "att" << attributes.size() - 1 << std::endl; } } } } else { } }
|