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.
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
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;
}
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;
}
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
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.