0

[これが SO に適していることを願っています。「プログラマー」にとっては少し実用的すぎ、「ゲーム開発者」にとっては技術的すぎると思いましたが、合わない場合は自由に移動してください。]

基本的に、画像 (レンダリング ライブラリは関係ありません) とアニメーション化されたスプライトを単純に描画できるマイクロ ビデオ エンジンの実際の設計を簡単にチェックしたかっただけです。レンダリングは VideoEngine クラスで行う必要があると思いますが (したがって、Image ではありません)、このタスクの適切な設計に頭を悩ませていますが、これを使用することを余儀なくされfriendexternこれは適切な設計ではありません。聞こえます。これは、私がこれを適切にコーディングしていないためかもしれませんが、より設計上の問題だと思います。

// 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 と友達であり、私は醜いと思います)。ImageVideoEnginefriendextern

TLDR:この種の二重関係は、きれいな方法で解決できますか? 私が実行できると思うことの 1 つは、画像が作成されるたびに何らかの方法で VideoEngine に通知し、SDL_Surface ポインターを渡してリストに保存することです。これはより良いデザインでしょうか?

4

1 に答える 1

0

Image をロードする以外に、実際には何もできないと思います。おそらく、ある種の描画コンテキスト インターフェイスが必要です。つまり、 ?image->drawTo(x, y, screen)の定義について言うことができるように。screen

s を最低レベルのプリミティブとして使用しているように見えるのでSDL_Surface、メソッドを持つことは理にかなっているかもしれませんvoid Image::drawTo(..., SDL_Surface* )。これにより、少なくともある程度のカプセル化が可能になります。

また、どこにでも静的またはグローバルvectorがあるImagesと、発生するのを待っている問題として私を襲います。特に、それvectorまたはその内容が最初のロード後に変更される可能性がある場合。

于 2012-07-03T04:10:18.083 に答える