Jump to content
  • Advertisement
Sign in to follow this  
ext

Error in SDL_BlitSurface

This topic is 4938 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm new to SDL and so I started with the Cone3D SDL tutorial2 (though I didn't copy it exactly, but the program is still doing the same or should). But I have an error in every call to SDL_BlitSurface and I don't know why. The images are loaded successfully and everything else is also initialized successfully. But still SDL_Blitsurface (in those two DrawImage functions) returns allways -1 From my point of view everything should be fine, maybe you can look over my code? Thank you :)
#include <windows.h>
#include <cstdlib>
#include <sdl/sdl.h>

inline void Msg(  char* const str, char* const info = "" )
{
       MessageBox( NULL, str, info, MB_OK );
}

SDL_Surface* G_pScreen = NULL;
SDL_Surface* G_pImage  = NULL;
SDL_Surface* G_pBg     = NULL;

int G_xPos = 0;
int G_yPos = 0;

bool LoadImage( char* const path, SDL_Surface* screen );

bool Init( Uint32 flags = SDL_INIT_VIDEO, int width = 640, int height = 480,
           int bpp = 32, Uint32 mode = SDL_HWSURFACE|SDL_DOUBLEBUF )
{
     if( SDL_Init( flags ) < 0 )
         return false;

     if( !( G_pScreen = SDL_SetVideoMode( width, height, bpp, mode ) ) )
         return false;

     if( !LoadImage( "J:\\Test\\ship.bmp", G_pImage ) )
         return false;

     if( !LoadImage( "J:\\Test\\bg.bmp", G_pBg ) )
         return false;

     std::atexit( SDL_Quit );
     return true;
}

bool LoadImage( char* const path, SDL_Surface* screen )
{
     if( !( screen = SDL_LoadBMP( path ) ) )
          return false;

     return true;
}

bool DrawImage( SDL_Surface* const src, SDL_Surface* dest, int x, int y )
{
     SDL_Rect start;
     start.x = 0;
     start.y = 0;
     if( SDL_BlitSurface( G_pBg, NULL, dest, &start ) == -1 )
         return false;

     return true;
}

bool DrawImage( SDL_Surface* const src, SDL_Surface* dest, int x, int y,
                int x2, int y2, int width, int height )
{
     SDL_Rect start;
     start.x = x;
     start.y = y;

     SDL_Rect start2;
     start2.x = x2;
     start2.y = y2;
     start2.w = width;
     start2.h = height;

     if( SDL_BlitSurface( src, &start2, dest, &start ) == -1 )
         return false;

     return true;
}

void DrawScene( SDL_Surface* const screen )
{
    DrawImage( G_pBg, G_pScreen, G_xPos - 2, G_yPos - 2,
               G_xPos - 2, G_yPos - 2, 54, 54 );
    DrawImage( G_pImage, G_pScreen, G_xPos, G_yPos );

    SDL_Flip( screen );
}

int main(int argc, char *argv[])
{
    if( !Init() )
        Msg( "Error on init", "Error" );

    DrawImage( G_pBg, G_pScreen, 0, 0 );

    Uint8* keys;
    bool done = false;
    while( !done )
    {
          SDL_Event event;

          while( SDL_PollEvent( &event ) )
          {
                if( event.type == SDL_QUIT )
                    done = true;
                if( event.type == SDL_KEYDOWN )
                    if( event.key.keysym.sym == SDLK_ESCAPE )
                        done = true;
          }

          keys = SDL_GetKeyState( NULL );

          if( keys[ SDLK_UP ] )
              ++G_yPos;
          if( keys[ SDLK_DOWN ] )
              --G_yPos;
          if( keys[ SDLK_LEFT ] )
              --G_xPos;
          if( keys[ SDLK_RIGHT ] )
              ++G_xPos;

          DrawScene( G_pScreen );
      }

    return 0;
}

Share this post


Link to post
Share on other sites
Advertisement
On the first DrawImage function, you appear to be passing *const src, but instead of using that you've hardcoded in g_pBg instead of passing in anything as a parameter.

The second one looks okay, comparing it with the original Cone3D example. Try taking out const and just have SDL_Surface *src.

I'm using SDL too, but I'm doing things differently.

I hope that helps, let me know if it still doesn't work.

ukdeveloper.

Share this post


Link to post
Share on other sites
I hardcoded G_pBg only for testing purposes, but it the error ist still there.

I removed the const from those parameters but there is still the same problem.

Can you post me a little example code that's running on your machine?

Share this post


Link to post
Share on other sites
Here's what I've been using for Pong. It's part of a class, but it should work for you if you take away the whole class bit:


void SpriteWrapper::Draw(SDL_Surface *surface,SDL_Surface *screen,int x,int y)
{

SDL_Rect sprite;

sprite.x=x;

sprite.y=y;

SDL_BlitSurface(surface,NULL,screen,&sprite);

}



And you can use it by:


paddle1.Draw(paddle_1,GameWindow,75,250);

// Take away the paddle1. bit

// paddle_1 is an SDL_Surface that you loaded earlier.

//GameWindow is the name I gave to my SDL_Surface which was the window loaded (with SDL_HWSURFACE etc).

//75 is the x co-ordinate of the destination, 250 is the y co-ordinate



To be honest, I think that this approach is better than the Cone3D version, but that's just my opinion.

Try these tutorials - they're what my function is based on:

Our very own Rob Loach

Andrew's Home Page

I've been using SDL for about a month now, and Cone3D still doesn't make a lot of sense. Those ones are easier.


Good luck,

ukdeveloper.

Share this post


Link to post
Share on other sites
Well...your draw function doesn't work, too :(

I'll try those two tutorials and I hope I'll find the error :)


/edit

The example from Rob Loach works fine :)

Share this post


Link to post
Share on other sites
Before blitting you might want to call SDL_LockSurface, because you are using HW_SURFACE. Then SDL_UnlockSurface, when the drawing operation is done.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!