2011-12-17 11 views
3

私はいくつかのアドバイスが必要です。私が作っていたゲームのための2つのクラスがあり、これらのクラスは、次のとおりこれを行う良い方法(C++)

グラフィック スプライト

スプライトクラスは、画像のための画像バッファから成り、(x、y)はオフセット、およびA幅と高さ。グラフィックスクラスには画面用のバッファがあります。画面バッファにはスプライト用の画像バッファのようなものがあります。

スプライトのイメージバッファをグラフィックス画面バッファにブリットする方法はありますか?私は2つのアイデアを持っていた:

void Sprite::blit(SDL_Surface* screen) 
{ 
    // code goes here 
} 

またはこの(グラフィックスクラス):

void Graphics::blit(Sprite sprite) 
{ 
    // code 
} 

かさえ、この(もで

は、この(スプライトクラスの)のようなメソッドを持っていますグラフィッククラス):

void Graphics::blit(SDL_Surface* aSpritesImageBuffer) 
{ 
    // code 
} 

これらのすべてに問題があります。どちらのクラスでも、私はスプライトのイメージバッファとグラフィックスコンポーネントのスクリーンバッファの両方を隠すためにカプセル化を使用します。クラスで提供されている関数を使用しないと誰もそれらを操作できないように定数として返されます。これは私がそれをした方法です:

class Graphics 
{ 
public: 
    const getScreenBuffer() const {return screenBuffer;} 
private: 
    screenBuffer; 
}; 

^スプライトの画像バッファと同じです。 (私のメインクラスで)私が試したので、場合

非常に良いではないでしょう

void handleRendering() 
{ 
    graphics.blit(sprite.getImageBuffer()); 
} 

かさえ:

void handleRendering() 
{ 
    graphics.blit(sprite); 
} 

と私はこれが良いとは思わない:

void handleRendering() 
{ 
    sprite.blit(graphics.getScreenBuffer()); 
}    

は非constへのconstのようなエラーを取得せずにこれを行うのいずれかのより良い方法がありますか? < <このようなエラーが発生します。

+3

「スプライトを描くのは誰が責任ですか?」 –

+0

画面が表示されますが、スプライトのイメージを公開する必要があり、それが良いとは思わない – evolon696

答えて

2

あなたのスプライトクラスが低レベルのレンダリング要素(つまり、基本的にはSDL_Surface *のラッパーのみ)であるのか、それとも既にゲーム内のクリーチャーの実際の表現であるのか分かりません。後者の場合、異なるソリューションの代わりに、座標、サイズ、速度などの他のプロパティのうち、スプライトクラスのビットマップのIDだけを保持することができます。 "Graphics"、 "BitmapCollection"などの別のクラスセット...

したがって、片側では、位置、サイズ、速度などの単純なプロパティを持つ「クリーン」スプライトクラスがあります。 SDL_nnnオブジェクトとコールが低レベルの "汚いもの"です。そして、ある日、そのidはビットマップを表すのではなく、3Dモデルなどです。スプライトの画像が実際にプライベートであるか、または読み取り専用に持っている場合、私は知らない

void handleRendering() 
{ 
    graphics.blit(bitmapCollection.Get(sprite.getImageId()); 
} 

:そのような何かを与えるだろう

。いくつかのスプライトは同じイメージを共有することができ、 "SpecialEffects"のような他のクラスはスプライトビットマップを変更したり、スワップしたり、スクリーン上に半透明のゴーストを作成したりすることができます。

2

これを行う一般的な方法は、シーン内のすべてのスプライトを保持するコンテナをGraphicsオブジェクトに含めることです。メインループはGraphics::blit()と呼ばれ、Graphicsオブジェクトはスプライトのコンテナを繰り返し処理し、それぞれのスクリーンバッファに渡してSprite::blit(SDL_Surface* screen)関数を呼び出します。

関連する問題