SDL サーフェスをスケーリングする適切な方法は何ですか? オンラインで 1 つの説明を見つけましたが、Surface をピクセルごとに再描画する必要がありました。そのように画像を再描画するのではなく、SDL を介してネイティブにこれを行う方法があるはずです。これをカバーするSDLドキュメントには何も見つかりませんでした。サーフェスの幅と高さを変更することで問題なくサーフェスのサイズを変更できますが、結果のサーフェスはクリップされます。
3 に答える
この回答が遅すぎて、質問した人を支援できないことはわかっていますが、この質問に出くわした人を助けるためにこれを書くことにしました. SDL 2.0 では、このSDL_BlitScaled()
関数を使用して、サーフェスを対象の にスケーリングできますSDL_Rect
。これについて説明しているLazyFooによるチュートリアルがあるか、このドキュメントをチェックしてください。
SDL は、スケーリングされたブリッティングをサポートしていません。SDL_BlitSurfaceのドキュメントによると:
注: SDL ブリッターには、他のより洗練されたブリッティング メカニズムの場合のように、ブリットされたサーフェスを拡大または縮小する機能が (まだ) ありません。画像をスケーリングしたい場合は、自分で何かを考え出さなければなりません (例えば、SDL_gfx を使用します)。
ここにSDL_gfx があります。独自のブリッティング関数を作成することはそれほど悪くはありません。楽しくて便利な学習実験になるかもしれません (車輪の再発明になりますが)。スケーリングや回転などを 1 回の関数呼び出しで実行できるため、OpenGL を使用することもできます。
完全を期すために、また質問で SDL バージョンが指定されていないため、API メソッドを使用して SDL2 でスケーリングが可能SDL_RenderCopyEx
です。基本的な SDL2 ライブラリ以外の追加のライブラリは必要ありません。
int SDL_RenderCopyEx(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect,
const double angle,
const SDL_Point* center,
const SDL_RendererFlip flip)
サイズを設定することでdstrect
、テクスチャを整数のピクセル数にスケーリングできます。テクスチャの回転と反転を同時に行うこともできます。
技術的には、これはサーフェスのスケーリングではなく、テクスチャのスケーリングです。ただし、SDL2 ベースのアプリケーションでレンダリングが行われる前に、ほとんどの場合、サーフェスはテクスチャに変換されるため、この手順は関連性があるはずです。
参照: https://wiki.libsdl.org/SDL_RenderCopyEx
通常どおりテクスチャを作成します。
surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);
そしてそれをレンダリングする時が来たら、SDL_RenderCopyEx
代わりに呼び出しますSDL_RenderCopy