2010-12-13 17 views
5

Witam Mam obraz z czarnym prostokątem narysowanym na nim, a jego tło jest przezroczyste. Ten plik jest zapisany jako png (clear.png). Następnie mam inny obraz, który jest po prostu solidnym czerwonym tłem zapisanym jako jpeg (background.jpeg). Próbowałem zrobić to, aby czarny prostokąt w clear.png pojawił się na górze pełnego czerwonego obrazu tła.Mieszanie przezroczystego obrazu .PNG na ekranie

To co mam zrobić ..

/*Transparent image*/ 
#include "SDL/SDL.h" 
#include "SDL/SDL_image.h" 
#include <iostream> 
using namespace std; 
int main(int argc,char *argv[]){ 
    SDL_Surface *screen = NULL; 
    SDL_Surface *background = NULL; 
    SDL_Surface *transparentimage = NULL; 

    if (SDL_Init(SDL_INIT_EVERYTHING) == -1){ 
     cout <<"could not start sdl" << endl; 
    } 

    screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE); 
    if (screen == NULL){ 
     cout<<"could not create the screen" << endl; 
    } 

    background = IMG_Load("background.jpeg"); 
    if (background == NULL){ 
     cout<<"could not load background" << endl; 
    } 

    transparentimage = IMG_Load("clear.png"); 
    if (transparentimage == NULL){ 
     cout<< "could not load transparentimage" << endl; 
    } 

    if (SDL_BlitSurface(background,NULL,screen,NULL) == -1){ 
     cout<<"Couldnt do background blitting " << endl; 
    } 
    if (SDL_BlitSurface(transparentimage,NULL,background,NULL) == -1){ 
     cout<<"could not do clear image blitting "<< endl; 
    } 

    SDL_Flip(screen); 
    SDL_Delay(5000); 

    SDL_FreeSurface(background); 
    SDL_FreeSurface(transparentimage); 

    SDL_Quit(); 

    return 0; 
} 

Powyższe nie działa i to tylko pokazuje mi ekran z czerwonym tle i czarnym stopce na dole ekranu (tego ISN” t mój prostokąt :)). Co ja tu zrobiłem źle? Również rozmiar zdjęć jest identyczny (640x480).

Odpowiedz

7

Upewnij init SDL_image i Blit zarówno bitmapy na ekranie:

/*Transparent image*/ 
#include "SDL/SDL.h" 
#include "SDL/SDL_image.h" 
#include <iostream> 
using namespace std; 
int main(int argc,char *argv[]){ 
    SDL_Surface *screen = NULL; 
    SDL_Surface *background = NULL; 
    SDL_Surface *transparentimage = NULL; 

    if (SDL_Init(SDL_INIT_EVERYTHING) == -1){ 
     cout <<"could not start sdl" << endl; 
    } 

    screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE); 
    if (screen == NULL){ 
     cout<<"could not create the screen" << endl; 
    } 

    int flags = IMG_INIT_JPG | IMG_INIT_PNG; 
    int initted=IMG_Init(flags); 
    if(initted & flags != flags) { 
     cout<<"could not init SDL_Image" << endl; 
     cout<<"Reason: " << IMG_GetError() << endl; 
    } 

    background = IMG_Load("red.jpg"); 
    if (background == NULL){ 
     cout<<"could not load background" << endl; 
    } 

    transparentimage = IMG_Load("green.png"); 
    if (transparentimage == NULL){ 
     cout<< "could not load transparentimage" << endl; 
    } 

    if (SDL_BlitSurface(background,NULL,screen,NULL) == -1){ 
     cout<<"Couldnt do background blitting " << endl; 
    } 
    if (SDL_BlitSurface(transparentimage,NULL,screen,NULL) == -1){ 
     cout<<"could not do clear image blitting "<< endl; 
    } 

    SDL_Flip(screen); 
    SDL_Delay(5000); 

    SDL_FreeSurface(background); 
    SDL_FreeSurface(transparentimage); 

    SDL_Quit(); 

    return 0; 
} 

screenshot

+0

Dziękuję bardzo. – silent

Powiązane problemy