SDL, przeźroczysty obrazek .bmp w niektórych miejscach

0

Witam proszę mi pomóc, czy może mi ktoś wytłumaczyć jak zrobić aby część mojego obrazka .bmp była przeźroczysta?
(mowa o SDL) wiem że służy do tego funkcja SDL_SetColorKey, prosiłbym o szczególowe wytłumaczenie, a najlepiej jakiś przykład z działającym przeźroczystym obrazkiem. Przeglądałem kilka kursów SDL i było haotycznie wytłumaczone.

0

Nie wiem czy takie kombinowanie jest Ci koniecznie potrzebne. SDL może ładować 32-bitowe pliki BMP (z kanałem alpha). Ładowałem sobie kiedyś takie tekstury do OpenGL i wszystko ładnie wczytywało ;) GIMP może zapisywać półprzezroczyste BMP bez problemu.

Masz tutaj info jak to zrobić na czysto w SDL (bez OpenGL): http://forums.libsdl.org/viewtopic.php?t=6626&sid=3f876f5e4431d1ee6eb0b2b010cb57da

0

W załączniku jest obrazek z tłem 0xff , chciałbym żeby to pole bylo przeźroczyste, prosze mnie nakierować...
zalacznik jest w jpeg, bo nie akceptuje bmp

#include <SDL.h>

SDL_Surface* pilka = NULL;
SDL_Surface* screen = NULL;
SDL_Surface* tlo = NULL;


SDL_Surface *load_image( char *filename ) 
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;
    
    //The optimized image that will be used
    SDL_Surface* optimizedImage = NULL;
    
    //Load the image
	loadedImage = SDL_LoadBMP( filename);
    
    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized image
        optimizedImage = SDL_DisplayFormat( loadedImage );
        
        //Free the old image
        SDL_FreeSurface( loadedImage );
		 //If the image was optimized just fine
        if( optimizedImage != NULL )
        {
            //Map the color key
            Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );
			    //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
        }
		
	}
	//Return the optimized image
	return optimizedImage;
}

int main()
{
	 if(SDL_Init(SDL_INIT_EVERYTHING) == -1) return false;

	screen=SDL_SetVideoMode( 1366, 768, 32, SDL_SWSURFACE );
	tlo=load_image("tlo.bmp");
	pilka=load_image("pilka.bmp");


	//Apply the surfaces to the screen
	SDL_BlitSurface(tlo, NULL, screen, NULL);
	SDL_BlitSurface(pilka, NULL, screen, NULL);
    
    //Update the screen
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;    
    }

	return 0;
}
0

Nie przerobiłeś tego tutoriala ze zrozumieniem...

Jaką wartość usuwają w tutorialu z tła ludzika? Białą, czy jasnoniebieską?

If the image was optimized, we have to map the color we want to set as the color key. We call SDL_MapRGB() to take the red, green, and blue values and give us the pixel value back in the same format as the surface.

Jaką wartość RGB ma kolor biały?

Teraz jest 0, 0xFF, 0xFF
Powinno być 0xFF, 0xFF, 0xFF

Ale jak już pisałem, zrób to nowocześnie, a nie takim archaicznym sposobem... użyj kanału alpha, o ile nie ma żadnych przeciwwskazań.

Masz działający kod:

#include <SDL.h>
#include <iostream>

SDL_Surface* pilka = NULL;
SDL_Surface* screen = NULL;
SDL_Surface* tlo = NULL;


SDL_Surface *load_image( char *filename )
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;

    //The optimized image that will be used
    SDL_Surface* optimizedImage = NULL;

    //Load the image
        loadedImage = SDL_LoadBMP( filename);

    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized image
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Free the old image
        SDL_FreeSurface( loadedImage );
                 //If the image was optimized just fine
        if( optimizedImage != NULL )
        {
            //Map the color key
            Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0xFF, 0xFF, 0xFF );
                            //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
        }

        }
        //Return the optimized image
        return optimizedImage;
}

int main()
{
         if(SDL_Init(SDL_INIT_EVERYTHING) == -1) return false;

        screen=SDL_SetVideoMode( 1366, 768, 32, SDL_SWSURFACE );
        //tlo=load_image("tlo.bmp");
        pilka=load_image("pilka.bmp");


        //Apply the surfaces to the screen
        //SDL_BlitSurface(tlo, NULL, screen, NULL);
        SDL_BlitSurface(pilka, NULL, screen, NULL);

    //Update the screen
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;
    }

	// dodane, zeby zatrzymac program, bo inaczej sie zamknie i nic nie zobaczysz
	char a;
	std::cin >> a;
	
        return 0;
}
0

Error 2 error LNK1120: 1 unresolved externals
Error 1 error LNK2019: unresolved external symbol _SDL_main referenced in function _main

Udało mi się:
void SetColorKey (SDL_Surface *SDLSufrace, Uint8 r, Uint8 g, Uint8 b)
{
Uint32 colorMask = SDL_MapRGB(SDLSufrace->format, r, g, b);
SDL_SetColorKey(SDLSufrace, SDL_SRCCOLORKEY|SDL_RLEACCEL, colorMask);
}

pilka=SDL_DisplayFormat(SDL_LoadBMP("pilka.bmp"));

SetColorKey(pilka,0,255,255);
SDL_BlitSurface( zero_zero, NULL, ekran, NULL );
SDL_BlitSurface( pilka, NULL, ekran, &BALL );

....

ale teraz tak, może mi ktoś wytłumaczyć co to jest to 255 i 0 ? czy mogę podać inne liczby? czemu nie musiałem podawać nigdzie 0xff?

===================================================================================
Może mi ktoś coś powiedzieć o typie Unit8 Unit32? bo nigdzie nie jest jasno wytłumaczone

1

0xff to szesnastkowo 255. W języku C++ takie literały są jednoznaczne.

Uint (a nie Unit) to nic innego jak unsigned int z określoną ilością bitów.

Unresolved... te błędy są zazwyczaj spowodowane niepodlinkowaniem biblioteki. Oprócz include pliku nagłówkowego trzeba jeszcze w opcjach linkera ustawić odpowiednie opcje. Jak robisz w SDL pod Windows dobrze jeszcze dopisać w kodzie #undef main, najlepiej przed include SDL.

Do funkcji SetColorKey możesz podać inne liczby. One odpowiadają wartościom RGB koloru, który chcesz ustawić jako przezroczysty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1