[これが SO に適していることを願っています。「プログラマー」にとっては少し実用的すぎ、「ゲーム開発者」にとっては技術的すぎると思いましたが、合わない場合は自由に移動してください。]
基本的に、画像 (レンダリング ライブラリは関係ありません) とアニメーション化されたスプライトを単純に描画できるマイクロ ビデオ エンジンの実際の設計を簡単にチェックしたかっただけです。レンダリングは VideoEngine クラスで行う必要があると思いますが (したがって、Image ではありません)、このタスクの適切な設計に頭を悩ませていますが、これを使用することを余儀なくされfriend
、extern
これは適切な設計ではありません。聞こえます。これは、私がこれを適切にコーディングしていないためかもしれませんが、より設計上の問題だと思います。
// Sprite.h
class Image
{
public:
Image();
Image(std::string path);
~Image();
bool IsDisplayable() { return displayed; }
void LoadImage(std::string path);
static std::vector<Image*> image_list;
private:
SDL_Surface* image_surface;
bool displayed;
friend class VideoEngine;
};
// VideoEngine.h
extern class Image;
class VideoEngine
{
public:
VideoEngine();
VideoEngine(int width, int height);
~ VideoEngine();
void Initialize(int width, int height);
void RenderImages();
void ShutdownVE();
private:
SDL_Surface* main_display;
SDL_Rect main_display_area;
};
// VideoEngine.cpp
void VideoEngine::RenderImages()
{
std::vector<Image*>::const_iterator ci;
for(ci = Image::image_list.cbegin(); ci != Image::image_list.cend(); ci++)
{
if((*ci) != 0 && (*ci)->IsDisplayable())
{
SDL_BlitSurface((*ci)->image_surface, 0, main_display, 0);
SDL_Flip(main_display);
}
}
}
ご覧のとおり、クラスからimage_surface
内部にアクセスする必要があるという事実により、and を使用する必要があり、その逆 (Image はレンダリング機能を持っています) は、正反対の方法を使用せざるを得ません (VideoEngine は Image と友達であり、私は醜いと思います)。Image
VideoEngine
friend
extern
TLDR:この種の二重関係は、きれいな方法で解決できますか? 私が実行できると思うことの 1 つは、画像が作成されるたびに何らかの方法で VideoEngine に通知し、SDL_Surface ポインターを渡してリストに保存することです。これはより良いデザインでしょうか?