Следующий код предназначен для отображения зеленого квадрата на черном фоне. Это выполняется, но зеленый квадрат не появляется. Однако, если я изменю SDL_DisplayFormatAlpha
в SDL_DisplayFormat
квадрат отображается правильно.
Так чего я не понимаю? Мне кажется, что я создаю *surface
с альфа-маской, и я использую SDL_MapRGBA
отобразить мой зеленый цвет, так что было бы согласованно использовать SDL_DisplayFormatAlpha
также.
(Я удалил проверку ошибок для ясности, но ни один из вызовов API SDL не завершился неудачей в этом примере.)
#include <SDL.h>
int main(int argc, const char *argv[])
{
SDL_Init( SDL_INIT_EVERYTHING );
SDL_Surface *screen = SDL_SetVideoMode(
640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF
);
SDL_Surface *temp = SDL_CreateRGBSurface(
SDL_HWSURFACE, 100, 100, 32, 0, 0, 0,
( SDL_BYTEORDER == SDL_BIG_ENDIAN ? 0x000000ff : 0xff000000 )
);
SDL_Surface *surface = SDL_DisplayFormatAlpha( temp );
SDL_FreeSurface( temp );
SDL_FillRect(
surface, &surface->clip_rect, SDL_MapRGBA(
screen->format, 0x00, 0xff, 0x00, 0xff
)
);
SDL_Rect r;
r.x = 50;
r.y = 50;
SDL_BlitSurface( surface, NULL, screen, &r );
SDL_Flip( screen );
SDL_Delay( 1000 );
SDL_Quit();
return 0;
}
Я использовал неправильный формат для SDL_MapRGBA. Должно было
SDL_FillRect(
surface, NULL, SDL_MapRGBA(
surface->format, 0xff, 0xff, 0x00, 0xff
)
);
(surface->format
вместо screen->format
.) Я думал, что эти два будут эквивалентны. И они после звонка SDL_DisplayFormat()
, но не после звонка SDL_DisplayFormatAlpha()
, Поверхность экрана не имеет альфа-канала, поэтому формат отличается между двумя.
(Перекрестный пост от gamedev.stackexchange.com)
Других решений пока нет …