saguaro Temat założony przez niniejszego użytkownika |
[SDL] Program zawiesza się po dodaniu więcej niż 80 obiektów, » 2014-07-13 10:39:06 Jak mam zmienić kod,aby program zużywał mniej pamięci? Próbowałem usunąć dynamiczną tablicę obiektów, ale wtedy program się cały sypał. Kod (main): #include <SDL/SDL.h> #include <ctime> #include <cstdlib> #include <SDL_image.h> #include "klocek.h" SDL_Surface * ekran = NULL; SDL_Surface * tlo = NULL; int tabx[ 10 ] = { 64, 128, 192, 256, 320, 384, 448, 512, 576, 640 }; int taby[ 30 ];
bool zakoncz = false; int losowy_x, losowy_y; SDL_Event akcja; long int ilosc, a, b; int t_x, t_y, x, y, calkowita, mysz_x, mysz_y; SDL_Rect mysz; SDL_Surface * ziemia = NULL; SDL_Surface * trawa = NULL; void umiesc( SDL_Surface * a, int x, int y, int w, int h, SDL_Surface * b, int xx, int yy, int ww, int hh ) { SDL_Rect miejsce1; SDL_Rect miejsce2; miejsce1.x = x; miejsce1.y = y; miejsce1.w = w; miejsce1.h = h; miejsce2.x = xx; miejsce2.y = yy; miejsce2.w = ww; miejsce2.h = hh; SDL_BlitSurface( a, & miejsce1, b, & miejsce2 ); }
int zwroc_x() { for( int i = 0; i < 10; i++ ) { x = i; if( mysz.x < tabx[ i ] ) return tabx[ i - 1 ]; } } int zwroc_y() { for( int i = 0; i < 10; i++ ) { y = i; if( mysz.y < taby[ i ] ) return taby[ i - 1 ]; } }
int main( int argc, char * args[] ) { srand( time( NULL ) ); SDL_Init( SDL_INIT_EVERYTHING ); for( int i = 0; i <= 30; i++ ) { taby[ i ] = 48 *( i + 1 ); } ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE | SDL_DOUBLEBUF ); tlo = IMG_Load( "panorama.png" ); trawa = IMG_Load( "k1.png" ); ziemia = IMG_Load( "k2.png" ); Klocek * klocek; klocek = new Klocek[ ilosc ]; SDL_BlitSurface( tlo, NULL, ekran, NULL ); for( int i = 0; i < 10; i++ ) { losowy_y =( rand() % 2 ) + 1; klocek[ ilosc++ ]; klocek[ ilosc ].ID = 1; if( losowy_y == 1 ) klocek[ ilosc ].polozenie_y = taby[ 4 ]; if( losowy_y == 2 ) klocek[ ilosc ].polozenie_y = taby[ 5 ]; klocek[ ilosc ].polozenie_x += 64 * i; if( losowy_y == 1 ) { klocek[ ilosc++ ]; klocek[ ilosc ].ID = 2; klocek[ ilosc ].polozenie_y = taby[ 5 ]; klocek[ ilosc ].polozenie_x = i * 64; } } for( int i = 6; i < 10; i++ ) { for( int j = 0; j < 10; j++ ) { klocek[ ilosc++ ]; klocek[ ilosc ].ID = 2; klocek[ ilosc ].polozenie_y = taby[ i ]; klocek[ ilosc ].polozenie_x = j * 64; } } while( !zakoncz ) { for( int j = ilosc; j != 0; j-- ) { if( klocek[ j ].ID == 1 ) umiesc( trawa, 0, 0, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 ); if( klocek[ j ].ID == 2 ) umiesc( ziemia, 0, 0, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 ); SDL_Flip( ekran ); } while( SDL_PollEvent( & akcja ) ) { if( akcja.type == SDL_KEYDOWN ) { if( akcja.key.keysym.sym == SDLK_ESCAPE ) { zakoncz = true; } } if( akcja.type == SDL_MOUSEMOTION ) { mysz_x = akcja.motion.x; mysz_y = akcja.motion.y; if( mysz_y >= 432 && mysz_y <= 480 ) { for( int j = ilosc; j != 0; j-- ) { umiesc( tlo, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 ); klocek[ j ].polozenie_y -= 48; } } if( mysz_y >= 0 && mysz_y <= 48 ) { for( int j = ilosc; j != 0; j-- ) { umiesc( tlo, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48, ekran, klocek[ j ].polozenie_x, klocek[ j ].polozenie_y, 64, 48 ); klocek[ j ].polozenie_y += 48; } } } } SDL_Flip( ekran ); } delete[] klocek; SDL_FreeSurface( tlo ); SDL_FreeSurface( ziemia ); SDL_FreeSurface( trawa ); SDL_Quit(); return 0; }
|
|
Jacob99 |
» 2014-07-13 12:18:28 A nie możesz po prostu użyć std::vector < Klocek > vec( ilosc ) ? |
|
saguaro Temat założony przez niniejszego użytkownika |
» 2014-07-13 12:35:48 Mógłbym, ale jeszcze nie korzystałem z tej biblioteki i podejrzewam, że nic nie zmieni :-/ Dziwne, że jeśli napiszę: for( int i = 6; i < 10; i++ ) { for( int j = 0; j < 10; j++ ) { klocek[ ilosc++ ]; klocek[ ilosc ].ID = 2; klocek[ ilosc ].polozenie_y = taby[ i ]; klocek[ ilosc ].polozenie_x = j * 64; } }
to program wygeneruje ładny teren, lecz dosyć ograniczony. A jeżeli, zwiększę liczbę rzędów klocków to: for( int i = 6; i < 13; i++ ) { for( int j = 0; j < 10; j++ ) { klocek[ ilosc++ ]; klocek[ ilosc ].ID = 2; klocek[ ilosc ].polozenie_y = taby[ i ]; klocek[ ilosc ].polozenie_x = j * 64; } }
|
|
Jacob99 |
» 2014-07-13 12:44:18 Mógłbym, ale jeszcze nie korzystałem z tej biblioteki i podejrzewam, że nic nie zmieni :-/ |
Z jakiej biblioteki? wywala czarny ekran, albo zakończenie programu wyświetla komunikat o tym, że program przestał działać. |
Szczegóły błędu? |
|
saguaro Temat założony przez niniejszego użytkownika |
» 2014-07-13 12:50:29 std::vector < Klocek > vec( ilosc ) Biblioteka vector? Debug: -------------- Build: Debug in Plansza (compiler: GNU GCC Compiler)---------------
Target is up to date. Nothing to be done (all items are up-to-date).
|
|
Jacob99 |
» 2014-07-13 13:04:03 Jeśli już to STL. A co do błędu, to pokaż cały kod razem z klocek.h etc. |
|
saguaro Temat założony przez niniejszego użytkownika |
» 2014-07-13 13:11:52 Ok, klasa vector, biblioteka STL :P klocek.h: #include <SDL/SDL.h> #include <SDL_image.h> #include <string> using namespace std; class Klocek { friend void wczytaj(Klocek &k); protected: int* a, *b; public: int ID; SDL_Surface*tekstura=NULL; int polozenie_y, polozenie_x; Klocek(); void zmien(); void ruszaj(); void usun(); };
klocek.cpp: #include <SDL/SDL.h> #include <SDL_image.h> #include <string> #include "klocek.h" using namespace std; extern void umiesc(SDL_Surface* a,int x, int y, int w, int h, SDL_Surface* b,int xx, int yy, int ww, int hh);
extern int zwroc_x(); extern int zwroc_y(); extern SDL_Surface*ekran, *tlo; extern int polozenie_y, polozenie_x,x,y,calkowita,ID; extern int tabx[10],taby[10]; Klocek::Klocek() { calkowita++; } void Klocek::ruszaj() { tekstura=IMG_Load("k2.png"); polozenie_x=zwroc_x(); polozenie_y=zwroc_y(); umiesc(tekstura,0,0,64,48,ekran,polozenie_x,polozenie_y,64,48);
}
void Klocek::usun() { polozenie_x=zwroc_x(); polozenie_y=zwroc_y(); umiesc(tlo,polozenie_x,polozenie_y,64,48,ekran,polozenie_x,polozenie_y,64,48); }
debug: ||=== Build: Debug in Plansza (compiler: GNU GCC Compiler) ===| C:\Users\Kacper\Desktop\Projekty\Plansza\klocek.h|12|warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp||In function 'int SDL_main(int, char**)':| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|70|warning: value computed is not used [-Wunused-value]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|70|warning: value computed is not used [-Wunused-value]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|77|warning: value computed is not used [-Wunused-value]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|77|warning: value computed is not used [-Wunused-value]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|88|warning: value computed is not used [-Wunused-value]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|88|warning: value computed is not used [-Wunused-value]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp||In function 'int zwroc_y()':| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|50|warning: control reaches end of non-void function [-Wreturn-type]| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp||In function 'int zwroc_x()':| C:\Users\Kacper\Desktop\Projekty\Plansza\main.cpp|42|warning: control reaches end of non-void function [-Wreturn-type]| ||=== Build finished: 0 error(s), 9 warning(s) (0 minute(s), 1 second(s)) ===| ||=== Run: Debug in Plansza (compiler: GNU GCC Compiler) ===|
|
|
Jacob99 |
» 2014-07-13 13:39:59 Nigdzie nie inicjalizujesz zmiennej ilosc(powinna mieć wartość 0, bo jest globalna), a korzystasz z niej do tworzenia tablicy dynamicznej (czyli powinieneś utworzyć tablicę o rozmiarze 0 (co jest błędem czasu wykonania)) i w licznych pętlach przekraczasz rozmiar tej tablicy. Dlatego lepiej użyć std::vector. To samo, chociaż to nie powinno wpływać na działanie programu, jest ze zmienną calkowita.
W sumie używasz o wiele za dużo zmiennych globalnych. |
|
« 1 » 2 |