• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wyświetlanie obrazków z przezroczystością w SDL 2.0 działa nieprawidłowo

Object Storage Arubacloud
0 głosów
432 wizyt
pytanie zadane 16 sierpnia 2018 w C i C++ przez bartolinciu Dyskutant (7,580 p.)
edycja 17 sierpnia 2018 przez bartolinciu

Próbuję napisać prostą grę 2D wykorzystując SDL 2.0. Jako pomysł wybrałem szachy. Natknąłem się na problem gdy próbowałem podświetlić pola na które może ruszyć się figura. Najpierw próbowałem:

SDL_Rect rect = {190, 40, 52, 52};//prostokąt opisujący pierwsze pole na szachownicy
SDL_FillRect( screenSurface, &rect, SDL_MapRGBA(screenSurface->format, 255, 114, 114, 127));

Potem spróbowałem:

SDL_Rect rect = {190, 90, 52, 52};
SDL_Surface* highlight = SDL_CreateRGBSurface(0, 52, 52, 32, 0, 0, 0, 0);
SDL_FillRect(  highlight, NULL, SDL_MapRGBA( highlight->format, 255, 114, 114, 127));
SDL_BlitSurface(highlight, NULL, screenSurface, &rect); 

Na końcu stworzyłem obrazek png w odpowiednim kolorze, z przezroczystością i wyświetliłem go nad szachownicą:

SDL_Rect rect = {190, 90, 52, 52};
SDL_Surface = IMG_Load("highlight.png");
SDL_BlitSurface(highlight, NULL, screenSurface, &rect); 

Za każdym razem we wskazanym miejscu pojawiał się kwadrat o wskazanym kolorze, ale bez przezroczystości.

EDIT: Zgodnie z sugestią użytkownika adrian17 wykorzystałem tekstury SDL' a i teraz wszystko działa jak należy. Wątek pozostawiam otwarty w razie gdyby ktoś miał pomysł jak obejść ten problem bez używania tekstur.

komentarz 17 sierpnia 2018 przez adrian17 Ekspert (344,860 p.)
Tylko dodam, że AFAIK przy użyciu nowszego API renderującego (SDL_Texture, SDL_RenderCopy etc) przezroczystość wydaje się działać out of the box.

1 odpowiedź

0 głosów
odpowiedź 17 sierpnia 2018 przez j23 Mędrzec (194,920 p.)

Pokombinuj z blend mode funkcją SDL_SetSurfaceBlendMode i flagą SDL_BLENDMODE_BLEND (highlight).

 

komentarz 17 sierpnia 2018 przez bartolinciu Dyskutant (7,580 p.)
Nie, po użyciu tej funkcji obrazek w ogóle się nie pokazuje.
komentarz 17 sierpnia 2018 przez j23 Mędrzec (194,920 p.)

A jak używasz tej funkcji?

 

Z tego, co wyczytałem w dokumentacji, jeśli screenSurface będzie w formacie RGB (bez kanału A), to taka SDL_FillRect będzie malowała pełnym kolorem, tak samo SDL_BlitSurface - w trybie SDL_BLENDMODE_NONE będzie kopiować z pominięciem kanału alfa.

komentarz 17 sierpnia 2018 przez bartolinciu Dyskutant (7,580 p.)
To by wszystko wyjaśniało. Niestety każda zmiana formatu screenSurface sprawiała, że ekran był całkowicie czarny.
komentarz 17 sierpnia 2018 przez j23 Mędrzec (194,920 p.)

Zamiast zmieniać screenSurface, stwórz surface o formacie RGBA, na niej rysuj z blendingiem to, co chcesz narysować i całość przekopiuj na surface ekranu..

komentarz 17 sierpnia 2018 przez bartolinciu Dyskutant (7,580 p.)
Próbowałem, może coś zrobiłem źle, ale wyświetlało się tylko tło rysowane z użyciem SDL_FillRect.
komentarz 17 sierpnia 2018 przez j23 Mędrzec (194,920 p.)
Bez kodu trudno coś sensownego doradzić.
komentarz 17 sierpnia 2018 przez bartolinciu Dyskutant (7,580 p.)
edycja 17 sierpnia 2018 przez bartolinciu

To było coś w rodzaju:

SDL_Surface* surface = CreateRGBSurface( 0, 800, 600, 32, 0xff000000, 0xff0000, 0xff00, 0xff);
SDL_SetSurfaceBlendMode( surface, SDL_BLENDMODE_BLEND ); 
//...
//Blitting everything onto the surface 
//... 
SDL_Rect rect = {0,0, 800, 600};
SDL_BlitSurface( surface, NULL, screenSurface, &rect);

 

komentarz 17 sierpnia 2018 przez j23 Mędrzec (194,920 p.)
Rysuje Ci tylko tło, bo ten kod tylko tło maluje.

 

Kod wstawiaj w bloczek {...}.
komentarz 17 sierpnia 2018 przez bartolinciu Dyskutant (7,580 p.)
1. Nie wklejałem kodu blitowania wszystkiego na tą podmienioną powierzchnię, bo przy próbach go nie zmieniałem oraz dla tego, że tyle razy coś w nim zmieniałem, że go nie pamiętam.

 

2. Poprawiłem, za pierwszym razem nie wczytało mi się to menu z narzędziami i miałem tylko pole tekstowe.
komentarz 17 sierpnia 2018 przez j23 Mędrzec (194,920 p.)

Jeśli piszesz na x86, to te maski są chyba źle - to, co teraz masz, to (według dokumentacji) maski dla big endian, a x86 śmiga na little endianie -> link

komentarz 17 sierpnia 2018 przez bartolinciu Dyskutant (7,580 p.)

Możliwe, że to był ten problem, ale teraz nie ma to znaczenia, bo teraz do podświetlania używam tekstury stworzonej w ten sposób:

SDL_Renderer* r;

//...

SDL_Surface* srf = SDL_CreateRGBSurface( 0, 52, 52, 32, 0xff000000, 0xff0000, 0xff00, 0xff );
SDL_SetSurfaceBlendMode( srf, SDL_BLENDMODE_BLEND );
SDL_FillRect( srf, NULL, SDL_MapRGBA( srf->format, 0xff, 114, 114, 127 ) );
SDL_Texture* tex = SDL_CreateTextureFromSurface( r, srf );
SDL_FreeSurface(srf);

użycie w SDL_MapRGBA formatu powierzchni srf załatwia sprawę.

Podobne pytania

0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez PYTAJĄCYproszePOMOC Nowicjusz (120 p.)
0 głosów
6 odpowiedzi 770 wizyt
pytanie zadane 22 sierpnia 2016 w HTML i CSS przez wildcrasher Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 321 wizyt

92,543 zapytań

141,385 odpowiedzi

319,492 komentarzy

61,929 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...