• 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

0 głosów
97 wizyt
pytanie zadane 16 sierpnia 2018 w C i C++ przez bartolinciu Mądrala (7,110 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 Mędrzec (199,840 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 VIP (106,380 p.)

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

 

komentarz 17 sierpnia 2018 przez bartolinciu Mądrala (7,110 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 VIP (106,380 p.)
Rysuje Ci tylko tło, bo ten kod tylko tło maluje.

 

Kod wstawiaj w bloczek {...}.
komentarz 17 sierpnia 2018 przez bartolinciu Mądrala (7,110 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 VIP (106,380 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 Mądrala (7,110 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ź 48 wizyt
pytanie zadane 6 stycznia w C i C++ przez PYTAJĄCYproszePOMOC Nowicjusz (120 p.)
0 głosów
6 odpowiedzi 192 wizyt
pytanie zadane 22 sierpnia 2016 w HTML i CSS przez wildcrasher Nowicjusz (220 p.)
0 głosów
1 odpowiedź 107 wizyt
pytanie zadane 24 grudnia 2017 w Grafika i multimedia przez DODO Bywalec (2,930 p.)
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

66,503 zapytań

113,269 odpowiedzi

239,876 komentarzy

46,641 pasjonatów

Przeglądających: 266
Pasjonatów: 9 Gości: 257

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...