レイヤー管理

ちょっとずつ。

class Canvas
{
public:
    bool SetPos(int nPosX, int nPosY);
    /// キャンパスを前後左右に移動

    Campus();
    ~Campus();

protected:
    vector<Layer>        m_vLayer;
    vector<Layer>        m_vResampled;    // 縮小済みのレイヤー

    int                  m_nPosX;         // スクロール位置
    int                  m_nPosY;         // 
    int                  m_nSizePer;&     // 拡縮率(%)

    CDIBSurface          m_Drawed;        // 書き込みはこのサーフェースへ
    CUpdatedRect         m_Update;        // 更新矩形(各レイヤーへの通知と描画)
};

#define TILE_SIZE 128    // タイルは正方形で生成される

class Layer
{
public:
    bool Create(int nSizeX, int nSizeY);
    /// 指定サイズのレイヤーを生成

    bool SetPos(int nPosX, int nPosY);
    /// レイヤーを前後左右に移動

    bool Input(ISurface* pSrc, int nPosX, int nPosY, int nSizeX, int nSizeY)
    /// 対象のサーフェースから入力(ここでタイルを判定して生成)

    bool Output(ISurface* pDst, int nPosX, int nPosY);
    /// 対象のサーフェースへ出力

    Layer();
    ~Layer();

protected:
    smart_array<Tile>    m_pTiles;        // 領域をタイル化
};

class Tile
{
/**
    Create()して初めてメモリを消費
*/

public:
    bool Create(int nSizeX, int nSizeY);
    /// タイルを生成(白でクリア)

    bool IsCreated() { m_pSurface.get()!=NULL; }
    /// 生成済みかどうか

    bool Input(ISurface* pSrc, int nPosX, int nPosY);
    /// 対象のサーフェースから入力

    bool Output(ISurface* pDst, int nPosX, int nPosY);
    /// 対象のサーフェースへ出力

    bool Release();
    /// タイルを未使用状態に

    Tile();
    ~Tile();

protected:
    smart_ptr<CDIBSurface*>    m_pSurface;    // サーフェース
    int                        m_nSizeX;
    int                        m_nSizeY;
};