[Solved]SDL black screen

Started by
7 comments, last by Serenity54 16 years, 1 month ago
Hey, can anyone tell me why this won't work?

void ApplySurface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL)
{
	SDL_Rect offset;
	offset.x = x;
	offset.y = y;
	SDL_BlitSurface(source, clip, destination, &offset);
}
...
...
	for(int col = 0; col < 20; col++)
	{
		for(int row = 0; row < 15; row++)
		{
			ApplySurface(col*32, row*32, cell1, map);
			/*
				if I replace map with screen and remove the
				ApplySurface below, it works fine, but I
				want to 'build' it to the surface just once and
				then just redraw it later as a surface
			*/
		}
	}

	ApplySurface(0,0, map, screen);

...
...
	if(SDL_Flip(screen) == -1)
	{
		return 0;
	}
...
...




This code shows a black screen. As I said in the comment in the above code, I want to 'build' the map onto a single SDL surface to draw later, but I don't know or understand why this code doesn't work. The reason I want to do this is to save processing time, but is it really going to matter? P.S. sorry if this has been posted before, I wasn't sure what to search for. [Edited by - Serenity54 on February 29, 2008 4:18:13 PM]
PixelStation.ca - Web design and development.
Advertisement
Looks like it should work to me. Post more detailed code.

Learn to make games with my SDL 2 Tutorials

I don't think this will help, but here's the rest of the code.

//// Global variables//SDL_Event wEvent;SDL_Surface *screen = NULL;//// Initialize SDL//bool Init(char* title, int w, int h, int bpp = 32, Uint32 flags = SDL_DOUBLEBUF|SDL_SWSURFACE){	if(SDL_Init(SDL_INIT_EVERYTHING) == -1)	{		return false;	}	screen = SDL_SetVideoMode(w, h, bpp, flags);	if(screen == NULL)	{		return false;	}	SDL_WM_SetCaption(title, NULL);	return true;}//// Kill SDL//void Kill(){	SDL_FreeSurface(screen);	SDL_Quit();}//// Load an image from a file//SDL_Surface* LoadImage(char* path){	SDL_Surface *loadedImage = NULL;	SDL_Surface *optimizedImage = NULL;		//Load image	loadedImage = IMG_Load(path);	if(loadedImage != NULL)	{		//optimize		optimizedImage = SDL_DisplayFormat(loadedImage);		if(optimizedImage != NULL)		{			//Remove 'magic purple' from the image			Uint32 colorkey = SDL_MapRGB(optimizedImage->format, 0xFF, 0, 0xFF);			SDL_SetColorKey(optimizedImage,SDL_SRCCOLORKEY, colorkey);		}		SDL_FreeSurface(loadedImage);	}	return optimizedImage;}//// Apply an SDL surface to another surface//void ApplySurface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL){	SDL_Rect offset;	offset.x = x;	offset.y = y;	SDL_BlitSurface(source, clip, destination, &offset);}//// Mainline//int main(int argc, char* argv[]){	if(!Init("SDL Test", 640, 480, NULL, SDL_SWSURFACE)) // 20 columns, 15 rows	{		return 1;	}	SDL_Surface* cell1 = NULL;	SDL_Surface* cell2 = NULL;	SDL_Surface* map = NULL;	cell1=LoadImage("grass_1_night.gif");	cell2=LoadImage("brickwall_1_night.gif");	if(cell1 == NULL || cell2 == NULL)	{		return 1;	}	for(int col = 0; col < 20; col++)	{		for(int row = 0; row < 15; row++)		{			ApplySurface(col*32, row*32, cell1, map);		}	}	ApplySurface(0,0, map, screen);	bool done = false;	while(!done)	{		while(SDL_PollEvent(&wEvent))		{			switch(wEvent.type)			{			case SDL_QUIT:				done = true;				break;			}		}		if(SDL_Flip(screen) == -1)			return 1;	}		SDL_FreeSurface(cell1);	SDL_FreeSurface(cell2);	SDL_FreeSurface(map);	Kill();	return 0;}


I believe the problem has something to do with blitting surfaces to a single surface, then blitting that single surface to the surface I want to flip.
PixelStation.ca - Web design and development.
The variable "map" is NULL. To create a surface to blit onto, use SDL_CreateRGBSurface().

Other than that, don't call SDL_FreeSurface on the surface returned by SDL_SetVideoMode(), the documentation expressly says not to.
Quote:Original post by rip-off
The variable "map" is NULL. To create a surface to blit onto, use SDL_CreateRGBSurface().

Other than that, don't call SDL_FreeSurface on the surface returned by SDL_SetVideoMode(), the documentation expressly says not to.


Perfect, that fixed it, thanks! What do the last four parameters for SDL_CreateRGBSurface do exactly?
PixelStation.ca - Web design and development.
They specify the order of the reg, green, blue and alpha channels. In a 32 bit surface each channel (a byte long) is packed into a single 32 bit integer. I use the example on the linked page, for this:
#if SDL_BYTEORDER == SDL_BIG_ENDIAN    rmask = 0xff000000;    gmask = 0x00ff0000;    bmask = 0x0000ff00;    amask = 0x000000ff;#else    rmask = 0x000000ff;    gmask = 0x0000ff00;    bmask = 0x00ff0000;    amask = 0xff000000;#endif

And setting them all to 0 will revert to the systems default? or SDLs default?
PixelStation.ca - Web design and development.
Quote:Original post by Serenity54
And setting them all to 0 will revert to the systems default? or SDLs default?


Looking at the SDL source, it appears to be a system default. SDL has no default, AFAICT.
Alright, thanks for all the help :D.
PixelStation.ca - Web design and development.

This topic is closed to new replies.

Advertisement