ILayerBase/CLayerListについて




yaneSDK2ndでは、レイヤと言う概念を導入しました。これは、描画するときに、そのレイヤ群に対してコールバックを行なうというものです。

要するに、単なる描画時にコールバックするリストに登録/抹消する仕組みなのです。

こんなものがどうして必要なのかを考えてみましょう。

通常、描画ループを持ちます。

list-1
    while (IsThreadValid()){
        CFastPlane* pSecondary = GetDraw()->GetSecondary();
        pSecondary->BltFast(bg,0,0);    //  BGを描画

        GetDraw()->OnDraw();
        //  セカンダリサーフェースをプライマリサーフェースに転送
    }


コールバックなんてしなくとも、上記のプログラムならば、

枠-1
        GetDraw()->OnDraw();


この行の直前に行なえば良いじゃないかと言われるかも知れません。
それはそうなんですが、この関数が、シーン管理されている場合、描画の直前に新たな行を挿入することは難しいのです。

シーン管理という概念については、シーン管理クラスのところで詳説しますが、描画過程をすべてシーンクラスが請け負います。

レイヤ概念として一番わかりやすいのは、FPS(秒間のフレーム数)表示用レイヤや、デバッグ表示用のレイヤでしょう。これらは、動的に表示のON/OFFを行ないたいことが多いので、シーンクラス側にはそのへんの制御を記述したくないのです。

結局のところ、描画時コールバックの手段自体は外すわけにはいかないのです。

ただ、どのようにレイヤを実現するかは、いろいろ手段のわかれるところです。yaneSDK2ndのときは、テキストレイヤと呼ばれる、テキストを描画するだけのレイヤを用意していました。また、レイヤのコンストラクタで自動的に描画システムにフックして(レイヤ描画を開始して)、レイヤのデストラクタで自動的に描画システムからアンフックする(レイヤ描画を終了する)ようにしていました。

yaneSDK3rdでは、描画システムは複数選択できうる(かつ、マルチスレッドで描画しうる)ので、明示的に指定してやります。

list-2 ISurfaceの表示を行なうレイヤにCTextFastPlaneを食わせる
    //  テキストレイヤで描画
    CTextFastPlane* pText = new CTextFastPlane;
    pText->GetFont()->SetText("スペースキーを押すと次のシーンに");
    pText->GetFont()->SetSize(30);
    pText->UpdateTextAA();
    CSurfaceLayer textlayer(pText,GetDraw()->GetLayerList());
    textlayer.SetPos(40,400);


あるいは、FPS表示を行なうレイヤならば、こうなります。

list-3 FPS表示を行なうレイヤ
    //  FPS表示用レイヤ
    CFPSLayer fpslayer(&timer,GetDraw()->GetHDCLayerList());
    fpslayer.SetPos(480,10);


上の例で出てきたCSurfaceLayer,CFPSLayerや、yaneSDK2ndで存在していたテキストレイヤCTextLayerに相当するものは、Draw/yaneLayer.hに記述してあるので、そちらのほうもご覧ください。