SDLでスプライトをスケーリングするにはどうすればよいですか?
5 に答える
SDLはスケーリング機能を直接提供しませんが、回転およびズーム機能を提供するSDL_gfxと呼ばれる追加のライブラリがあります。同様の機能を提供するSprigと呼ばれる別のライブラリもあります。
SDL_RenderCopy()を使用してテクスチャからスプライトを取得している場合はスケーリングを実行できますが、アンチエイリアスを保証することはできません。
関数SDL_RenderCopy()を使用して、4つのパラメーターを渡します。
- レンダラーへのポインター(レンダリングする場所)。
- テクスチャへのポインタ(スプライトを取得する場所)。
- ソースrectへのポインタ(テクスチャ上でスプライトを取得する領域と位置)。
- そして、dest rect(描画しようとしているレンダラー上の領域と位置)へのポインター。
たとえば、画像を300 x 300でレンダリングする場合、画像を拡大縮小する場合は、目的地を150x150または72x72、あるいは拡大縮小したい値のように変更する必要があります。
コードを提供していないので、テクスチャとSDL_Rendererを使用していると仮定します。
SDL_RenderCopy()を使用すると、宛先のSDL_Rectに合わせてテクスチャが引き伸ばされるため、宛先のSDL_Rectを大きくしたり小さくしたりすると、テクスチャの単純なスケーリングを実行できます。
IbrahimCSのソリューションが機能します。
このソリューションに加えて、コードを提供します。注意すべきもう1つのことは、左上がスケーリングされたテクスチャをレンダリングするための原点である新しい位置(x、y)を計算することです。
私はこのようにします
// calculate new x and y
int new_x = (x + texture->w/2) - (texture->w/2 * new_scale);
int new_y = (y + texture->h/2) - (texture->h/2 * new_scale);
// form new destination rect
SDL_Rect dest_rect = { new_x, new_y, texture->w * scale, texture->h * scale };
// render
SDL_RenderCopy(renderer, texture, NULL, &dest_rect);
texture
がSDL_Texture
、でrenderer
あると仮定しSDL_Renderer
、入力テクスチャから宛先まで完全にレンダリングします。
代わりにSFMLを使用すると、非常によく似たクロスプラットフォーム機能のセットが得られますが、グラフィックスはハードウェアアクセラレーションであり、スケーリングや回転などの機能は、追加の依存関係を必要とせず、目立ったCPUを使用しないという点で無料です。操作する時間。