투명한 스프라이트를 그리기 위해 SDL과 함께 GFX RotozoomSurface를 사용하는 올바른 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1670304

문제

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은 반 알리 아스를 설정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top