투명한 스프라이트를 그리기 위해 SDL과 함께 GFX RotozoomSurface를 사용하는 올바른 방법은 무엇입니까?
-
13-09-2019 - |
문제
Fedora 10에서 최신 SDL/GFX LIB를 사용하고 있으며 화면 표면에 PNG 또는 GIF 이미지를 렌더링하려고합니다. 투명한 PNG를 전혀 표시 할 수 없었기 때문에 투명한 부품이나 스프라이트를 모든 흰색으로 교체했습니다 (그리고 Magenta 255,0,255를 시도했습니다). 흰색 트랜스 펜트 PNG는이 코드를 사용하여 미세하게 표시됩니다.
SDL_Surface *image = load_image("sprite-white.png");
SDL_Surface *roto = SDL_DisplayFormat(image);
SDL_SetColorKey(roto, SDL_SRCCOLORKEY, SDL_MapRGB( roto->format, 255,255,255 ));
SDL_BlitSurface( roto, NULL, surface, &offset );
그러나 스프라이트를 회전 시키려고 할 때 모든 흰색 픽셀을 떨어 뜨리지는 않습니다. 위의 코드를 이것으로 바꾸려면 회전합니다.
SDL_Surface *image = load_image("sprite-white.png");
SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 1);
SDL_Surface *roto2 = SDL_DisplayFormat(roto);
SDL_SetColorKey(roto2, SDL_SRCCOLORKEY, SDL_MapRGB( roto2->format, 255,255,255 ));
SDL_BlitSurface( roto2, NULL, surface, &offset );
나는 좋은 픽셀 중 일부 주위에 흰색 개요로 끝납니다. GIF 이미지는 동일한 결과를 제공합니다.
투명한 PNG/GIF 파일로 시도 할 때 SDL_SETCOLORKEY를 호출하지 않은 경우를 제외하고 코드는 동일했습니다. 그런 다음 PNG는 전혀 제대로 표시되지 않았습니다. 내가 찾은 이상한 점은 투명한 PNG가 SDL에서와 마찬가지로 MS 페인트에서 동일하게 보였지만 GIMP/Photoshop 프로그램이 올바르게 열렸습니다.
대상 표면을 설정하는 것이없는 것이 있습니까?
Google은별로 나타나지 않았고 작업 예제가 좋을 것입니다.
해결책
"Fedora 10의 최신 SDL/GFX LIB"라고 말할 때 SDL 및 SDL_GFX 라이브러리를 의미한다고 가정합니다. 투명성으로 PNG 이미지를 올바르게 표시하려면 sdl_image 설치; PNG 이미지를 SDL_SURFACE에로드 할 수있는 다른 라이브러리가없는 한 필요합니다.
투명성을 위해 색상 키를 사용할 필요는 없습니다 (물론, 당신은 원하다 하나를 사용하려면). 색상 키 사용 문제는 SDL 문서가 SDL_DISPLAYFORMAT ()를 호출하기 전에 색상 키를 설정하는 것이 좋습니다.
"하드웨어 Colorkey 또는 Alpha Blit Acceleration을 활용하려면이 기능을 호출하기 전에 Colorkey 및 Alpha 값을 설정해야합니다."
SDL_DISPLAYFORMAT () 대신 SDL_DISPLAYFORMATALPHA ()를 사용해 볼 수도 있습니다.
SDL_Rect imagePosition = { 50, 50, 0, 0 };
SDL_Surface *image = IMG_Load("example.png");
if (image != NULL) {
image = SDL_DisplayFormatAlpha(image);
}
나중에 렌더링 루프에서 소스 이미지를 일부 부동 소수점으로 회전시킬 수 있습니다. angle
일부 sdl_surface에 screen
:
if (image != NULL) {
SDL_Surface *rotation = rotozoomSurface(image, angle, 1, 1);
SDL_BlitSurface(rotation, NULL, screen, &imagePosition);
SDL_FreeSurface(rotation);
}
위의 코드는 PNG에 적절한 투명성이 있다고 가정 할 때 투명성으로 PNG를 올바르게 블립합니다.
연결하십시오 -lSDL_image
SDL_IMAGE 라이브러리 및 -lSDL_gfx
SDL_GFX 라이브러리의 경우 Fedora 10 설치에서 G ++를 사용한다고 가정합니다. 당신은 또한 사용할 수 있습니다 sdl-config --libs
SDL 자체에 필요한 G ++ 인수의 경우.
다른 팁
Rotozoomsurface의 반 알리 아스를 끄면 더 이상 '외부 라인 문제'에 어려움이 없어야합니다.
당신은 이것을 사용했습니다 : SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 1);
대신 이것을 사용하십시오 : SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 0);
0은 반 알리 아스를 설정합니다.