質問
本当に大きな画像(ハードウェアがサポートできるサイズよりも大きい)を使用する2Dゲームがある場合、どうしますか?たぶん、私にはこれまでになかったこの問題に対する興味深い解決策があるかもしれません。
私は基本的に、一種のグラフィックアドベンチャーゲームメーカーに取り組んでいます。私のターゲットオーディエンスは、ゲーム開発(およびプログラミング)の経験がほとんどない人です。このようなアプリケーションで作業している場合、「画像を分割する」ように指示するよりも、内部で問題を処理する方が好みではないでしょうか?
環境
グラフィックカードは、使用できるテクスチャのサイズに一連の制限を課していることはよく知られています。たとえば、XNAを使用する場合、選択するプロファイルに応じて、2048または4096ピクセルの最大テクスチャサイズに制限されます。
通常、2Dゲームではほとんどの場合、小さな個別のピース(タイルや変形したスプライトなど)から構築できるレベルがあるため、それほど問題にはなりません。
しかし、古典的なpoint'n'clickグラフィックアドベンチャーゲーム(Monkey Islandなど)について考えてみてください。グラフィックアドベンチャーゲームの部屋は通常、全体的に設計されており、風景に取り組んでいる画家のように、再現可能なセクションがほとんどまたはまったくありません。または、大規模な事前レンダリングされた背景を使用するFinal Fantasy 7のようなゲーム。
これらの部屋のいくつかはかなり大きくなることがあり、頻繁に3画面以上の幅に広がります。現在、これらの背景を最新の高解像度ゲームのコンテキストで考慮すると、サポートされる最大テクスチャサイズを簡単に超えてしまいます。
これに対する明白な解決策は、背景を要件内に収まる小さなセクションに分割し、それらを並べて描画することです。しかし、あなた(またはあなたのアーティスト)はあなたのテクスチャのすべてを分割する人でなければなりませんか?
高レベルAPIを使用している場合、この状況に対処し、内部で(XNAのコンテンツパイプラインなどの前処理として、または実行時に)テクスチャの分割とアセンブルを行う準備をしてはいけませんか?
編集
XNA実装の観点から、私が考えていたものを以下に示します。
私の2Dエンジンは、Texture2Dの機能の非常に小さなサブセットのみを必要とします。実際にこのインターフェイスに減らすことができます:
public interface ITexture
{
int Height { get; }
int Width { get; }
void Draw(SpriteBatch spriteBatch, Vector2 position, Rectangle? source, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth);
}
Texture2Dに依存する唯一の外部メソッドはSpriteBatch.Draw()であるため、拡張メソッドを追加してそれらの間にブリッジを作成できます。
public static void Draw(this SpriteBatch spriteBatch, ITexture texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth)
{
texture.Draw(spriteBatch, position, sourceRectangle, color, rotation, origin, scale, effects, layerDepth);
}
これにより、以前にTexture2Dを使用したときにITextureを交換可能に使用できます。
それから、ITextureの2つの異なる実装、たとえばRegularTextureとLargeTextureを作成できます。RegularTextureは通常のTexture2Dを単純にラップします。
一方、LargeTextureは、フル画像の分割されたピースの1つにそれぞれ対応するTexture2Dのリストを保持します。最も重要な部分は、LargeTextureでDraw()を呼び出すと、すべての変換を適用し、すべてのピースを1つの連続したイメージであるかのように描画できることです。
最後に、プロセス全体を透明にするために、ファクトリメソッドとして機能する統合テクスチャローダークラスを作成します。テクスチャのパスをパラメーターとして受け取り、制限を超えているかどうかに応じて、RegularTextureまたはLargeTextureのいずれかになるITextureを返します。しかし、ユーザーはそれがどれであるかを知る必要はありませんでした。
少しやり過ぎですか、それとも大丈夫ですか?