Sleep() in SDL2 crasht



  • Hi, ich versuche mich gerade an ein GameOfLife-Spiel. Ich habe das mal mit SDL2 umgesetzt. Kein besonderes Interface und auch der Code ist noch sehr durcheinander. Aber im Grundsatz funktioniert es ganz gut. Nun habe ich folgendes Problem, wenn ich ein Kästchen "belebe" also färbe, dann geschieht das zu schnell. Ich möchte nicht, dass alle kästchen sofort gefärbt werden, sondern Stück für Stück. Deshalb dachte ich, ich verwende einfach die Sleep() Funktion. Doch wenn ich diese Verwende, dann crasht mein Fenster.
    Kann mir jemand helfen? Brauche ich eine andere Funktion?
    Hier ist erstmal der Code der Zeile wo die Sleep() Funktion ist.

    if (square_status[x][y] == true)
    	{	
    
    		square_status[x+1][y] == true;
    		Sleep(1000);
    		fill_square(x+1, y);
    		square_status[x][y+1] == true;
    		Sleep(1000);
    		fill_square(x, y+1);
    

    Und dann wäre hier der komplette Code des GameOfLife Spiels, bitte verzeiht meinen schlechten Programmierstil. Ist alles andere als OOP ich weiß,:

    #include <iostream>
    #include <windows.h>
    #include <SDL.h>
    #include <SDL_image.h>
    using std::cout;
    using std::cin;
    using std::endl;
    
    //Fenster erstellen und Werte definieren.
    const int SCREEN_WIDTH = 800; 
    const int SCREEN_HEIGHT = 600;
    
    SDL_Window *gWindow = NULL;
    SDL_Renderer *gRenderer = NULL;
    
    //alles schliessen
    void close()
    {	SDL_DestroyRenderer(gRenderer);
    	gRenderer = NULL;
    	SDL_DestroyWindow(gWindow);
    	gWindow = NULL;
    	SDL_Quit();
    }
    //initialisieren
    void initialize()
    {
    	gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN ); 
    	gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED );
    }
    
    bool loadMedia() 
    { 
    //Loading success flag 
    bool success = true; 
    //Nothing to load 
    return success; 
    }
    
    void draw_field()
    {
    
    	SDL_SetRenderDrawColor( gRenderer, 0x00, 0x00, 0xFF, 0xFF ); 
    	SDL_RenderDrawLine( gRenderer, 0, SCREEN_HEIGHT*1/6, SCREEN_WIDTH, SCREEN_HEIGHT*1/6 );
    	SDL_RenderDrawLine( gRenderer, 0, SCREEN_HEIGHT*2/6, SCREEN_WIDTH, SCREEN_HEIGHT*2/6);
    	SDL_RenderDrawLine( gRenderer, 0, SCREEN_HEIGHT*3/6, SCREEN_WIDTH, SCREEN_HEIGHT*3/6 );
    	SDL_RenderDrawLine( gRenderer, 0, SCREEN_HEIGHT*4/6, SCREEN_WIDTH, SCREEN_HEIGHT*4/6 );
    	SDL_RenderDrawLine( gRenderer, 0, SCREEN_HEIGHT*5/6, SCREEN_WIDTH, SCREEN_HEIGHT*5/6 );
    
    	SDL_RenderDrawLine( gRenderer, SCREEN_WIDTH*1/6, 0, SCREEN_WIDTH*1/6, SCREEN_HEIGHT);
    	SDL_RenderDrawLine( gRenderer, SCREEN_WIDTH*2/6, 0, SCREEN_WIDTH*2/6, SCREEN_HEIGHT);
    	SDL_RenderDrawLine( gRenderer, SCREEN_WIDTH*3/6, 0, SCREEN_WIDTH*3/6, SCREEN_HEIGHT);
    	SDL_RenderDrawLine( gRenderer, SCREEN_WIDTH*4/6, 0, SCREEN_WIDTH*4/6, SCREEN_HEIGHT);
    	SDL_RenderDrawLine( gRenderer, SCREEN_WIDTH*5/6, 0, SCREEN_WIDTH*5/6, SCREEN_HEIGHT);
    
    }
    
    //square_status abhängig von den Parametern die fill_square übergeben werden
    // werden die statuse im 2-dimensionalen array manipuliert auf true oder false. der status soll darstellen, ob die kästchen den entsprechenden koordinaten
    // "leben"- true oder "tod" sind - false.  man könnte also die übergebenen werte als "koordinaten" betrachten. 
    // Das Spielfeld ist 6x6 kästchen groß, dementsprechend umfasst square_status 6x6 statusse.
    
    bool square_status[6][6];
    
    void fill_square(int p_x = 0, int p_y = 0)
    {
    	SDL_Rect fillRect = { SCREEN_WIDTH*p_x/6, SCREEN_HEIGHT*p_y/6, SCREEN_WIDTH*1/6, SCREEN_HEIGHT* 1/6 };
    	SDL_SetRenderDrawColor( gRenderer, 0xFF, 0x00, 0x00, 0xFF ); 
    	SDL_RenderFillRect( gRenderer, &fillRect );
    	square_status[p_x][p_y] = true;
    }
    
    void fill_square2(int p_x = 0, int p_y = 0)
    {
    	SDL_Rect fillRect = { SCREEN_WIDTH*p_x/6, SCREEN_HEIGHT*p_y/6, SCREEN_WIDTH*1/6, SCREEN_HEIGHT* 1/6 };
    	SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF ); 
    	SDL_RenderFillRect( gRenderer, &fillRect );
    	square_status[p_x][p_y] = true;
    }
    
    void check_status()
    {	int x =0;
    	int y =0;
    
    	while(true)
    	{
    
    	if (square_status[x][y] == true)
    	{	
    
    		square_status[x+1][y] == true;
    		Sleep(1000);
    		fill_square(x+1, y);
    		square_status[x][y+1] == true;
    		Sleep(1000);
    		fill_square(x, y+1);
    
    		if(x >=6)
    		{	x = 0;
    			++y;
    			cout << x << "&" << y << endl;
    
    		}
    
    		if(y >= 7)
    		{
    		break;
    		}
    	}
    	++x;
    
    	}
    
    	x= 0;
    	y= 0;
    
    	while(true)
    	{
    
    	if (square_status[x][y] == true && square_status[x+1][y+1]==true && square_status[x-1][y-1]==true)
    	{	
    		square_status[x][y] == false;
    		Sleep(1000);
    		fill_square2(x, y);
    
    		if(x >=6)
    		{	x = 0;
    			++y;
    			cout << x << "&" << y << endl;
    
    		}
    
    		if(y >= 7)
    		{
    		break;
    		}
    
    	}
    	++x;
    	draw_field();
      }
    
    }
    
    int main( int argc, char* args[] ) 
    {	 
    	initialize();
    
    	//Clear screen 
    	SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF ); 
    	SDL_RenderClear( gRenderer );
    
    	//KOORDINATENSYSTEM ZEICHNEN!!
    	draw_field();
    
    	int eing;
    
    	fill_square(2,1);
    	cout << square_status[3][1];
    	SDL_RenderPresent( gRenderer ); 
    
    	cout << "gib 1 ein!" << endl;
    	cin >> eing;
    	if(eing == 1)
    	{
    		check_status();
    	}
    
    SDL_RenderPresent( gRenderer ); 
    
    bool quit = false;
    SDL_Event e;
    	while( !quit ) { 
    	//Handle events on queue 
    	while( SDL_PollEvent( &e ) != 0 ) 
    	{ 
    	//User requests quit 
    	if( e.type == SDL_QUIT ) 
    	{ quit = true; 
    	} 
    
    }
    }
    }
    

    Freue mich auf Rückantworten.
    Mit freundlichen Grüßen
    Joe

    PS: Das Spiel ist noch nicht fertig, bisher habe ich anhand der 2 while-Schleifen welche in check_status() sich befinden, überprüft ob ein kästchen lebt und wenn ja, neue kästchen belebt, bzw. aussterben lassen, wenn zu viele da sind. Es fehlen also noch 1-2 Regeln, bis alles fertig ist.



  • Weil du sowieso SDL verwendest, versuchs mal mit SDL_Delay anstatt Sleep. Den eigentlichen Grund für den Crash sehe ich auf den ersten Blick nicht.



  • Da während des Sleep() keine Event verarbeitet werden, bleibt dein Fenster natürlich hängen.



  • x und y sind 0 bis 6.
    square_status hat Indices von 0 bis 5.
    Du greifst noch mit x+1 und x-1 auf das Array zu...


Log in to reply