Jump to content

Quick SDL question -- SDL_CreateRGBSurface

Featured Replies

Hi I recently started learning some SDL but I cant seem to get SDL_CreateRGBSurface to work.

 

http://linux.die.net/man/3/sdl_creatergbsurface

http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlcreatergbsurface.html

 

I have some basic code which displays a moveable image, and I want a solid color generated with createRGBSurface for my background. So when you move the image you cover up the old image w/ that part of the background and redraw the image. For some reason using 8 bit will generate an all black background (regardless of rgba values), and anything else seems to be completely null or something (the image leaves a trail).

#include <stdio.h>
#include <stdlib.h>

#include "SDL.h"

void Slock(SDL_Surface *screen);
void Sulock(SDL_Surface *screen);

int main(int argc, char *argv[])
{
if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
return -1;
}

SDL_Surface *screen;
screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF);

if(screen == NULL)
{
	fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError());
	return 0;
}

SDL_Surface *image;

image = SDL_LoadBMP("doggy.bmp");

if(image == NULL)
{
	fprintf(stderr, "Unable to load image: %s\n", SDL_GetError());
	//return 0;
}

SDL_Surface *back; //background
SDL_Event event;
SDL_Rect rect;
SDL_Rect rback;
SDL_Rect rback2;

rect.x = 50;
rect.y = 50;

rback2.x = 50;
rback2.y = 50;
rback2.w = image->w;
rback2.h = image->h;	

rback.x = 50;
rback.y = 50;

back = SDL_CreateRGBSurface(SDL_HWSURFACE, 639, 479, 8, 0x70, 0x80, 0x90, 0x64); //639 -- minus one from 640 just in case until it starts working

if (back == NULL) {
               fprintf(stderr, "Unable to create SDL Surface for background"
                ": %s\n", SDL_GetError());
        //       exit(1);
       }

Slock(screen);
SDL_BlitSurface(back,NULL,screen,NULL);
Sulock(screen);
SDL_Flip(screen);

while(1)
{
	while(SDL_PollEvent(&event))
	{
		switch(event.type)
		{
			case SDL_KEYDOWN:
			switch(event.key.keysym.sym)
			{
				case SDLK_ESCAPE:
				exit(0); break;

				case SDLK_RIGHT:
				rect.x +=5;
				break;

				case SDLK_LEFT:
				rect.x -= 5;
				break;

				case SDLK_UP:
				rect.y -=5;
				break;

				case SDLK_DOWN:
				rect.y += 5;
				break;

				default:
				break;
			}
			break;

			case SDL_QUIT:
			exit(0);
			break;

			default:
			break;
		}

		Slock(screen);
		SDL_BlitSurface(back, &rback2, screen, &rback);
		SDL_BlitSurface(image, NULL, screen, &rect);
		Sulock(screen);
		SDL_Flip(screen);

		rback.x = rect.x;
		rback.y = rect.y;
		rback2.x = rect.x;
		rback2.y=rect.y;

	}
}
}

void Slock(SDL_Surface *screen)
{
if ( SDL_MUSTLOCK(screen) )
{
	if ( SDL_LockSurface(screen) < 0 )
	{
		return;
	}
}
}

void Sulock(SDL_Surface *screen)
{
if ( SDL_MUSTLOCK(screen) )
{
	SDL_UnlockSurface(screen);
}
}

Here's the part of code that's giving me problems:

SDL_Surface *back;
...
back = SDL_CreateRGBSurface(SDL_HWSURFACE, 639, 479, 8, 0x70, 0x80, 0x90, 0x64);

I've tried all different values for Uinit32 from full string 0x0000ff00 etc to integers and different bits but cant seem to get it working right. Any help is appreciated, thanks :)

Archived

This topic is now archived and is closed to further replies.

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.