Qual é a maneira correta de usar GFX rotozoomSurface com SDL para desenhar sprites transparentes?

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

Pergunta

Eu estou usando as últimas libs SDL / GFX no Fedora 10 e eu estou tentando processar um PNG ou GIF imagem sobre a superfície da tela. Eu não poderia começar transparente PNG para exibição em tudo então eu substituído as peças transparentes ou meu sprite com todo branco (e tentou Magenta 255,0,255). Os PNG monitores de branco transparente fina usando este código:

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

Mas quando eu tento rodar o sprite não soltar todos os pixels brancos. I substituir o código acima com este para rodar:

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

eu acabar com um esboço branco em torno de alguns dos bons pixels. imagens GIF dar os mesmos resultados.

Ao tentar com PNG transparente / GIF arquiva o código era o mesmo, exceto que eu não chamei SDL_SetColorKey. Em seguida, o PNG não exibir corretamente em todos. Uma coisa estranha que eu encontrei foi o PNG transparente parecia o mesmo no MS Paint como fez em SDL, mas os programas GIMP / Photoshop abriu corretamente.

Existe algo que eu estou sentindo falta de criação de superfície de destino?

O Google não apareceu muito, um exemplo de trabalho seria ótimo.

Foi útil?

Solução

Estou assumindo que quando você diz "a última SDL / GFX libs no Fedora 10," você quer dizer as bibliotecas SDL e SDL_gfx. Para exibir corretamente as imagens PNG com transparência, garantir que você também tem SDL_image instalado; você vai precisar dele, a menos que você tem uma biblioteca diferente, que pode carregar uma imagem PNG em uma SDL_Surface.

Você não deve precisar de usar uma chave de cores para a transparência (a menos, claro, você deseja para usar um). Quanto ao seu problema com o uso de uma chave de cor, nota que a documentação SDL recomenda definir a tecla de cor antes de chamar SDL_DisplayFormat ():

"Se você quer tirar proveito de colorkey hardware ou alfa aceleração blit, você deve definir o colorkey e alfa valor antes de chamar esta função."

Você também pode querer tentar usar SDL_DisplayFormatAlpha () em vez de SDL_DisplayFormat (), assim:

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

Mais tarde, em seu ciclo de processamento, então você pode girar a imagem de origem por alguns angle ponto flutuante para algum screen SDL_Surface:

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

O código acima irá blit corretamente um PNG com transparência, assumindo que o seu PNG tem transparência adequada.

Certifique-se de ligação com -lSDL_image para a biblioteca SDL_image e -lSDL_gfx para a biblioteca SDL_gfx, supondo que você está usando g ++ em sua instalação do Fedora 10. Você também pode usar sdl-config --libs para os argumentos necessários g ++ para si SDL.

Outras dicas

Apenas desligar o anti-aliasing do Rotozoomsurface, e você não mais deve ter problemas com o 'out questão linha'.

Você usou este: SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 1);

Em vez Utilize este: SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 0);

0 define o anti-aliasing off.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top