私は sdl ttf を使用してきましたが、現在、複数行のテキストをレンダリングするためのテキスト レンダラー関数を作成しています。
各ラインのサーフェスを作成し、「グローバル」サーフェスにブリットしてから、その「グローバル」サーフェスをテクスチャに変換しています。
実際、私の問題は次のとおりです。グローバル サーフェスを透明にすると、ブリッティングが機能しません (空のサーフェスが表示されます)。SDL_FillRect を設定してから SDL_SetColorKey を実行すると、機能しません。
ピクセルごとの方法でそれをやろうとしましたが、うまくいきますが、期待した結果ではありません。
私が実際に必要としているのは、ブリット サーフェス (TTF_RenderText_Blended でレンダリングされたテキスト サーフェス)、透明な背景を持つ 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);
}
背景が透明な「surfed_texture」へのブリッティング = ブリットされたサーフェスは表示されません。ピクセルごとの方法: すべての背景を削除するわけではありません。
SDL_SetColorKey が機能していません! (私はすでに SDL_DisplayFormatAlpha を試しましたが、まだ動作しません)。
手助け?