// The Tile array is a member of the CDisplay class. I have tried setting it
// to NULL in the constructor as well as just leaving it out of the constructor.
void CDisplay::LoadTiles()
{
SDL_Surface* Tiles;
SDL_Rect dstRect;
SDL_Rect srcRect;
int iTileNumber = 0;
dstRect.x = 0;
dstRect.y = 0;
dstRect.h = dstRect.w = 100;
srcRect.y = srcRect.y = 1;
srcRect.h = srcRect.w = 100;
if ((Tiles = IMG_Load("gfx/tiles1.gif")) == NULL)
{
cout << "Could not open tileset." << endl;
} else
{
for (int y = 1; y <= 132; y += 33)
{
for (int x = 1; x <= 132; x += 33)
{
srcRect.x = x;
srcRect.y = y;
if (SDL_BlitSurface(Tiles, &srcRect, Tile[iTileNumber], &dstRect)==-1)
{
cout << "Tile Blit Failed! Error -1." << endl;
fprintf(stderr, "%s\n", SDL_GetError());
} else
{
cout << "Blitting Succeeded." << endl;
}
iTileNumber++;
}
}
}
SDL_FreeSurface(Tiles);
}
[SDL] Tileset Blitting Problems
I am trying to load a .GIF image using SDL_image, then blit the image into seperate tiles, which I store in an array of SDL_Surfaces*. I keep getting an error from the SDL_BlitSurface function.
Here is the code:
The output I am getting is:
Tile Blit Failed! Error -1.
SDL_UpperBlit: passed a NULL surface
I tried creating a 2D program using SDL last summer and I got it to display the tiles, but I do not think I did anything except create the array of SDL_Surfaces to hold the tiles in. Unless there is something I forgot. Do I have to initialize the SDL_Surfaces to something before I can blit something else on them?
Thanks,
Chris
(edit: Source formatting)
You don't have an array of "SDL_Surface*"s, you have one.
So you can't index into it here:
Tile[iTileNumber]
instead of trying to do multiple SDL_Surfaces, it's almost always better to put your tiles into one image, then manipulate the srcrect to only blit parts of it.
For example, if your tiles are 100x100 and you have 5 tiles, you'd put them horizontaly on the image
Then for srcrect, you'd set it up like this:
An example drawing function:
So you can't index into it here:
Tile[iTileNumber]
instead of trying to do multiple SDL_Surfaces, it's almost always better to put your tiles into one image, then manipulate the srcrect to only blit parts of it.
For example, if your tiles are 100x100 and you have 5 tiles, you'd put them horizontaly on the image
Then for srcrect, you'd set it up like this:
srcRect.x=iTileNumber*100;srcRect.y=0;srcRect.w=srcRect.h=100;
An example drawing function:
srcRect.y=0;srcRect.w=srcRect.h=100;for(int y=0;y<map_height;y++){ for(int x=0;x<map_width;x++){ srcRect.x=map[x][y]*100; dstRect.x=x*100; detRect.y=y*100; SDL_BlitSurface(Tiles, &srcRect, screen, &dstRect); }}
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement