SDL_DisplayFormat работает, но не SDL_DisplayFormatAlpha

Следующий код предназначен для отображения зеленого квадрата на черном фоне. Это выполняется, но зеленый квадрат не появляется. Однако, если я изменю 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;
}

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)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]