• 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

VPS Starter Arubacloud
0 głosów
406 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,100 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.)
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ź 120 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez PYTAJĄCYproszePOMOC Nowicjusz (120 p.)
0 głosów
6 odpowiedzi 738 wizyt
pytanie zadane 22 sierpnia 2016 w HTML i CSS przez wildcrasher Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 318 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...