Skip to main content
GameDev.net gamedev.net
🔒 Locked

SDL_BlitSurface() Problem

Started by Peter Dreyer Nov 10, 2012 at 8:23 PM 2 replies 2.9k views
Original Post
Peter Dreyer
Peter Dreyer
Hey everyone, I just started game development in C++ with SDL and I'm having some trouble with the SDL_BlitSurface() function. Basically, if i try to blit a surface using NULL for the two SDL_Rects, the image will be blitted as it should be. If I try to blit only a certain portion of the image, it won't work and returns -1. Any ideas?


Main.cpp

[source lang="cpp"]
int main ( int argc, char** argv ){
SDL_Surface* screen = NULL;
SDL_Init(SDL_INIT_VIDEO);

screen = SDL_SetVideoMode(DEFAULT_WINDOW_WIDTH,DEFAULT_WINDOW_HEIGHT,DEFAULT_WINDOW_COLOR_DEPTH, SDL_SWSURFACE);

SDL_WM_SetCaption(WINDOW_TITLE,NULL);

SDL_Surface* DefaultFontSheet = SDL_LoadBMP("font.bmp");

SpriteSheetReader ssr;

ssr.setSpriteSheet(DefaultFontSheet);
ssr.setSpriteSize(12,12);
SDL_Surface* letter = ssr.getSprite(1,1);
SDL_BlitSurface(letter, NULL, screen, NULL);
SDL_Flip(screen);
MainLoop();
}[/source]

SpriteSheetReader.h
[source lang="cpp"]
//Sprite Sheet Reader version 1.00
//Peter Dreyer
//10 November 2012

class SpriteSheetReader{
public:
//spriteSheet Getters and Setters
void setSpriteSheet(SDL_Surface* spriteSheet);
SDL_Surface* getSpriteSheet(void);
//Sprite Size Controlling
void setSpriteSize(int width, int height);
SDL_Rect getSpriteSize();
//Sprite Retrieval
SDL_Surface* getSprite(int x, int y);
private:
SDL_Surface* spriteSheet;
SDL_Rect spriteRect;
};

void SpriteSheetReader::setSpriteSheet(SDL_Surface* ss){
this->spriteSheet = ss;
}

SDL_Surface* SpriteSheetReader::getSpriteSheet(void){
return this->spriteSheet;
}

void SpriteSheetReader::setSpriteSize(int width, int height){
this->spriteRect.w = width;
this->spriteRect.h = height;
}

SDL_Rect SpriteSheetReader::getSpriteSize(void){
return spriteRect;
}

SDL_Surface* SpriteSheetReader::getSprite(int x, int y){
this->spriteRect.x = x * this->spriteRect.w;
this->spriteRect.y = y * this->spriteRect.h;

SDL_Surface* Sprite;
SDL_BlitSurface(spriteSheet, &this->spriteRect, Sprite, NULL);

return Sprite;
}
[/source]

I've done some testing and found that I can blit the whole sprite sheet and the problem is only introduced when I start trying to use the SDL_Rects.
Servant of the Lord
Servant of the Lord
[color=#ff0000]SDL_Surface* Sprite;
SDL_BlitSurface(spriteSheet, &this->spriteRect, [color=#ff0000]Sprite, NULL);

Sprite was never created. It's a pointer pointing to nothing. You can't draw one image onto a destination that doesn't exist. smile.png

SDL_BlitSurface() returns -1 on error, but you didn't check the return result. SDL tells you, "something went wrong" by returning -1, and by calling SDL_GetError(), you could find out *what* went wrong. Error checking your code is very important. wink.png

So, your problem is now: "How do I create an empty surface so I can draw to it?"
The answer is: SDL_CreateRGBSurface().

I usually wrap it in a function, to make it easier to use. I posted such a function in this thread, along with some links to great SDL tutorials, and wrapping code for loading and drawing SDL surfaces - I strongly encourage you to read through that thread for the resources I posted, even though the problem the OP is having is different than yours.
Peter Dreyer
Peter Dreyer
Thanks for your help Servant of the Lord! For the record, I did check the return result of the blitting function several times and I didn't just assume that result as my post made it look. I've just tested it again and it worked.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.