SDL_TextureとSDL_Surfaceの使いわけ
昨日よりは少し進み、画像の描画に関しては8割がたSDL_Textureを使うようにできた。残り二割は解像度の問題と、まだ未確認の全画面モード切替だけど、それらは後回し。あとはSGEの線分描画と、SDL_ttfの文字列描画が対応できればいいんだけどなあ。
現在SDL_SetVideoMode関数の代わりに以下のようにしている。最後のscreen変数が従来のSDL_SetVideoMode関数の戻り値に相当する(はず)。アプリケーションとしてはこのscreen変数のサーフェスに対して描画して、最後にSDL_RenderCopy(surface->textureID (以下略) って感じにすればいいはずなんだけど、大丈夫かな。
// ウィンドウ window_id = SDL_CreateWindow("Test App", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_SHOWN); // レンダラー SDL_CreateRenderer(window_id, -1, 0); // テクスチャー SDL_DisplayMode mode; SDL_GetDesktopDisplayMode(&mode); main_texture_id = SDL_CreateTexture(mode.format, SDL_TEXTUREACCESS_LOCAL, WIDTH, HEIGHT); // サーフェス。 screen = SDL_CreateRGBSurfaceFromTexture(main_texture_id);
ちなみのこのコードはsdl_compat.cでSDL_SetVideoMode関数内のコードを簡略化したもの。SDL_SetVideoMode関数を直接使わない理由は、SDL_SelectRenderer関数などに渡すウィンドウIDを得るため。SDL_SetVideoMode関数を使うとSDLライブラリ内部の変数にウィンドウIDを格納するだけでアプリケーションからは参照できず、かつウィンドウIDを使って呼び出す関数が結構多いので、アプリケーション側に保持するためこのようにした。