• Advertisement
Sign in to follow this  

SDL 1.2 to 2.0 migration (open screen a blit)

This topic is 1450 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 switching from 1.2 to 2.0. I got it compiled and working (an empty window). Now, I want to run an old code (with as few changes as possible, just using the old surface, I don't want any new features yet, don't care about performace, just make the old one complie and run).

 

So basicly my question is how to open a screen/window and then render stuff using SDL_Surface (most likely only SDL_SetVideoMode and SDL_Flip should be changed/renamed).

 

Here is an example from 1.2, please just modify it and I will get hang on how it works with the new system :)

int main ( int argc, char** argv )
{
    // initialize SDL video
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "Unable to init SDL: %s\n", SDL_GetError() );
        return 1;
    }

    // make sure SDL cleans up before exit
    atexit(SDL_Quit);

    // create a new window
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF);
    if ( !screen )
    {
        printf("Unable to set 640x480 video: %s\n", SDL_GetError());
        return 1;
    }

    // load an image
    SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
    if (!bmp)
    {
        printf("Unable to load bitmap: %s\n", SDL_GetError());
        return 1;
    }
    
    // centre the bitmap on screen
    SDL_Rect dstrect;
    dstrect.x = (screen->w - bmp->w) / 2;
    dstrect.y = (screen->h - bmp->h) / 2;

    // program main loop
    bool done = false;
    while (!done)
    {
        // message processing loop
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            // check for messages
            switch (event.type)
            {
                // exit if the window is closed
            case SDL_QUIT:
                done = true;
                break;

                // check for keypresses
            case SDL_KEYDOWN:
                {
                    // exit if ESCAPE is pressed
                    if (event.key.keysym.sym == SDLK_ESCAPE)
                        done = true;
                    break;
                }
            } // end switch
        } // end of message processing

        // DRAWING STARTS HERE
        
        // clear screen
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

        // draw bitmap
        SDL_BlitSurface(bmp, 0, screen, &dstrect);

        // DRAWING ENDS HERE

        // finally, update the screen :)
        SDL_Flip(screen);
    } // end main loop

    // free loaded bitmap
    SDL_FreeSurface(bmp);

    // all is well ;)
    printf("Exited cleanly\n");
    return 0;
}

Share this post


Link to post
Share on other sites
Advertisement

There is a forum called "APIs and tools" that might be more appropriate for this question.

 

I recommend you read a bit of the SDL 2.0 documentation or a tutorial so you get an idea of what has changed and what stayed the same, then try to convert the code yourself. If you have a hard time fighting through the errors, post your attempt and someone here will try to help you.

Share this post


Link to post
Share on other sites

The SDL MigrationGuide pretty much hand-holds you through the process of converting a simple 2D app from 1.2 to 2.0.

Yes, I have read it a few times. I just can't find an exmple that opens a screen in 2.0 and then blits using old 1.2 SDL_surface.

Share this post


Link to post
Share on other sites

 

The SDL MigrationGuide pretty much hand-holds you through the process of converting a simple 2D app from 1.2 to 2.0.

Yes, I have read it a few times. I just can't find an exmple that opens a screen in 2.0 and then blits using old 1.2 SDL_surface.

 

 

 

because there isn't. 

 

2.0 is a completely different api. I suggest you to embrace it as it is, a new and different (and better) thing.

Share this post


Link to post
Share on other sites

 

The SDL MigrationGuide pretty much hand-holds you through the process of converting a simple 2D app from 1.2 to 2.0.

Yes, I have read it a few times. I just can't find an exmple that opens a screen in 2.0 and then blits using old 1.2 SDL_surface.

 

 

You might want to read it again.

 

"Remember SDL_SetVideoMode()? It's completely gone. SDL 2.0 allows you to have multiple windows, so the old function didn't make sense any more."

 

It then goes on to show the old way (SDL_surface and SDL_SetVideoMode) and the new way (SDL_Window and SDL_CreateWindow).

 

And it covers your scenario of surfaces, replaceing surfaces with textures and summarizes with:

 

"At this point, your 1.2 game had a bunch of SDL_Surfaces, which it would SDL_BlitSurface() to the screen surface to compose the final framebuffer, and eventually SDL_Flip() to the screen. For SDL 2.0, you have a bunch of SDL_Textures, that you will SDL_RenderCopy() to your Renderer to compose the final framebuffer, and eventually SDL_RenderPresent() to the screen. It's that simple."

 

Seems pretty well covered to me.

Share this post


Link to post
Share on other sites

Yay! Got the whole game converted to SDL2 (now the ugly black mouse cursor is the cute system mouse instead, which was the primary reason of the upgrade :))

 

 

One more thing, does anyone know what's the replacement for SDL_DisplayFormatAlpha now?

 

Here is the code, it's supposed to render a font without antialiasing.

    SDL_Color col;  col.r=col.g=col.b=255; // white

    // Create Image from TTF
    SDL_Surface* fontSurface;
    if(aamode)
    {
        // Antialiased
        fontSurface=TTF_RenderText_Blended(font, s, col);
    }
    else
    {
        // Pixelated (no antialiasing)
        SDL_Surface* tmpSurface=TTF_RenderText_Solid(font, s, col);
        fontSurface=SDL_DisplayFormatAlpha(tmpSurface); // ERROR !MIGRATION
    }

Share this post


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

  • Advertisement