2013-02-08 6 views
0

Я работаю с sdl ttf, Теперь я создаю функцию визуализации текста для многострочного рендеринга текста.Проблемы с прозрачностью SDL_Surface

Я создаю поверхность для каждой линии, blitting in на «глобальной» поверхности, а затем превращая эту «глобальную» поверхность в текстуру.

На самом деле моя проблема в том, что: если я допускаю, чтобы глобальная поверхность была прозрачной, blitting не работает (она показывает пустую поверхность). Если я устанавливаю этот SDL_FillRect и выполняю SDL_SetColorKey, не работает.

Я попытался сделать это с помощью пиксельного метода, он работает, но это не ожидаемый результат.

В действительности мне нужно: Blit surface (Text rendered surface with TTF_RenderText_Blended), blit их внутри SDL_Surface с прозрачным фоном, вот и все.

SDL_Surface * surfed_texture = SDL_CreateRGBSurface(SDL_SWSURFACE,surface_width,surface_height,32, 
0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); 

Uint32 tormv = SDL_MapRGB(surfed_texture->format,255,0,255); 

int possiblecolors[] = { 255,0,255,255,255,255 }; 

int in_pc = 0; 

if(color.r == possiblecolors[0] && color.g == possiblecolors[1] && color.b == possiblecolors[2]){ 
    in_pc=3; 
} 

/*SDL_FillRect(surfed_texture,NULL,SDL_MapRGB(surfed_texture->format,possiblecolors[in_pc],possiblecolors[in_pc+1],possiblecolors[in_pc+2])); 
SDL_SetColorKey(surfed_texture, SDL_SRCCOLORKEY, SDL_MapRGB(surfed_texture->format,possiblecolors[in_pc],possiblecolors[in_pc+1],possiblecolors[in_pc+2])); 
*/ 
SDL_Surface * temporal = NULL; 
for(int i=0;i<(int)buff_split.size();i++){ 
    const char* c_text = buff_split.at(i).c_str(); 

    temporal = TTF_RenderText_Blended(font,c_text,color); 

    int w_fo; 
    int h_fo; 
    TTF_SizeText(font,c_text,&w_fo,&h_fo); 

    SDL_Rect rct; 
    rct.y=i*lineSkip; 

    if(txt_align==ALIGN_LEFT){ 
     rct.x=0; 
    }else if(txt_align==ALIGN_CENTER){ 
     rct.x = surface_width/2 - w_fo/2; 
    }else if(txt_align==ALIGN_RIGHT){ 
     rct.x = surface_width - w_fo; 
    } 

    rct.w=0; 
    rct.h=0; 

    // Blit surface 

    SDL_BlitSurface(temporal,NULL,surfed_texture,&rct); 

    SDL_FreeSurface(temporal); 

} 

Blitting in "surfed_texture" с прозрачным фоном = не показывает блуждающую поверхность. Метод Per-Pixel: не удаляет весь фон.

И SDL_SetColorKey не работает! (Я уже пробовал SDL_DisplayFormatAlpha и неподвижные файлы не работает).

Некоторая помощь?

ответ

1

Решение заключается в следующем:

Используйте SDL_SetAlpha НЕ в «глобальной» поверхности, нанесите SDL_SetAlpha каждому «временной» поверхности без каких-либо флагов, а также со значением 0:

SDL_SetAlpha(temporal,NULL,0); 

Теперь он работает нормально!