2009-11-03 3 views
0

Fedora 10에서 최신 SDL/GFX 라이브러리를 사용하고 있으며 화면 표면에 PNG 또는 GIF 이미지를 렌더링하려고합니다. 투명 PNG를 전혀 표시 할 수 없었습니다. 그래서 투명 부분이나 스프라이트를 모든 흰색으로 바꿨습니다. (마젠타 색 255,0,255를 사용해 보았습니다.) .투명 스프라이트를 그리기 위해 SDL과 함께 GFX rotozoomSurface를 사용하는 적절한 방법은 무엇입니까?

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); 

을하지만 스프라이트를 회전 할 때 그것은 모두 흰색 픽셀을 드롭하지 않습니다 흰색 투명 PNG 벌금이 코드를 사용하여 표시됩니다. 나는이와 위의 코드가 회전 교체 :

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가 제대로 표시되지 않았습니다. 내가 발견 한 한 가지 이상한 점은 MS Paint에서 투명 PNG가 SDL에서와 같이 보였지만 김프/Photoshop 프로그램이 올바르게 열었습니다.

대상 표면을 설정하지 않은 것이 있습니까?

Google은별로 성과를 내지 못했지만, 좋은 예가 될 것입니다.

답변

2

"Fedora 10의 최신 SDL/GFX 라이브러리"라고 말하면 SDL 및 SDL_gfx 라이브러리를 의미합니다. 투명도가있는 PNG 이미지를 올바르게 표시하려면 SDL_image도 설치해야합니다. PNG 이미지를 SDL_Surface에로드 할 수있는 다른 라이브러리가 없다면 필요합니다.

투명화를 위해 색상 키를 사용하지 않아도됩니다 (물론 을 사용하려면에 색상 키를 사용하고 싶지 않음). 당신이 하드웨어 컬러 키 또는 알파 블리트 가속을 이용하려면

", 당신은 설정해야합니다 : 컬러 키를 사용하여 문제에 관해서는, SDL 문서 SDL_DisplayFormat()를 호출하기 전에 컬러 키를 설정하는 것이 좋습니다 있습니다 이 함수를 호출하기 전에 컬러 키와 알파 값. "

또한 SDL_DisplayFormatAlpha를 (사용하려고 할 수 있습니다) 대신 SDL_DisplayFormat()의,과 같이 :

SDL_Rect imagePosition = { 50, 50, 0, 0 }; 
SDL_Surface *image = IMG_Load("example.png"); 
if (image != NULL) { 
    image = SDL_DisplayFormatAlpha(image); 
} 

나중에, 당신의 렌더링 루프에서, 당신은 어떤 부동 소수점에 의해 소스 이미지를 회전 한 후 수 일부 SDL_Surface screen에에 angle : 위의 코드가 제대로 투명성과 PNG 블럭 전송됩니다

if (image != NULL) { 
    SDL_Surface *rotation = rotozoomSurface(image, angle, 1, 1); 
    SDL_BlitSurface(rotation, NULL, screen, &imagePosition); 
    SDL_FreeSurface(rotation); 
} 

, 당신의 PNG 가정 적절한 투명성을 가지고있다.

Fedora 10 설치에서 g ++를 사용한다고 가정하고 SDL_image 라이브러리의 경우 -lSDL_image, SDL_gfx 라이브러리의 경우 -lSDL_gfx으로 연결하십시오. SDL 자체에 필요한 g ++ 인수에 sdl-config --libs을 사용할 수도 있습니다.

+0

위의 코드는 동일한 결과를 얻었으므로 다른 png도 찾았고 원래 코드와 함께 잘 작동했습니다. 테스트를 위해 사용했던 PNG는 다소 나빴습니다. 감사! – amanda

0

Rotozoomsurface의 앤티 앨리어싱을 해제하면 '출력 문제'에 더 이상 문제가 없어야합니다.

SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 1); 대신이 옵션을 사용합니다 : SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 0);

0 설정이 앤티 앨리어싱

는이를 사용했다.