yaneSDKによるゲーム製作メモ:第2回「基本・ウィンドウの生成」

えーっと前回シーンうんたらを扱ったんだけど、なんかいきなり感がぬぐえないし、やっぱり初めから順序だててやっていこう。

ということで、yaneSDKの導入に戻りますヽ(´∀`)ノ

大体のことはここを見てもらえばよいだろう。
これに加えて、やっておくといいのが、プリコンパイル済みヘッダの設定。
まず自分のプロジェクトのプロパティでC/C++の中のプリコンパイル済みヘッダーの項目で、「プリコンパイル済みヘッダーファイルを使用する(/Yu)」を選ぶ。(その下の項目は初期設定でよい)
それから、

#include "stdafx.h"

とだけ書いたstdafx.cppというファイルを追加する。そしてこのファイルのプロパティで、上と同じ項目で「プリコンパイル済みヘッダーを作成する(/Yc)」を選ぶ。
あとは、自分のプロジェクトのすべてのcppファイルで最初に

#include "stdafx.h"


と書くようにすればOKだ。

ばっと、これでOKのはずなのだが、自分はこれ絡みでちょっとトラブってる…。
この方法でプロジェクトを作ると、なんかうまくいかないのだ。だいぶ前に作った一個だけがどうも成功しているようで、これはコンパイルが終わるとほぼ一瞬で窓が出る。ところが、それ以降に作ったプロジェクトはみんなダメっぽい。コンパイルが終わったあと、ウィンドウができるまでが異常に遅い。10秒くらいかかる。これがプリコンパイル済みヘッダの設定の影響なのかなあ。しかも最近は遅いどころか何もせずとも勝手に終了するようになった。しかたなくその昔のをずっと使ってるわけで…。設定とか見ても特に変なところはないし。もうまったく分けがわかりません!
(今作ってみたところ、強制終了はしないがやっぱり遅い…なんでや)

さて、上のサイトではサンプルということでキーデバイスクラスをMainThread関数内でローカルに保持したりしているが、これでは使いにくいので、自分は以下のようにCAppを構成している。

//    アプリケーションクラス

class CApp : public CAppFrame {
public:
virtual void MainThread();

CFastDraw* GetDraw() { return planeFactory_.GetDraw(); }

CKey2* GetKey() { return& m_Key; }
CMouse* GetMouse(){ return& m_Mouse; }
CDbg* GetDbg() { return& m_Dbg; }

protected:
CFastPlaneFactory planeFactory_;

private:
CKey2 m_Key;
CMouse m_Mouse;
CDbg m_Dbg;

};

CFastDrawは描画の統合的役割をするクラスで、具体的には

//セカンダリ(次の画面を用意するための裏画面)をクリア
GetDraw()->GetSecondary()->Clear();

//ここでキャラを配置したりしてセカンダリを構築

//セカンダリをプライマリ(実際の画面)に転送
GetDraw()->OnDraw();


と使う。
CKey2やCMouseはキーやマウスのデバイスクラスで、

//キー状態を取得
GetKey()->Input();
if(GetKey()->IsKeyPress(仮想キー番号)){
//このキーが押されているときの処理
};


というふうに使う。
(CDbgは変数や文字列を出力してデバッグを補助してくれるクラス)

しかし、実際のメイン処理はこのCAppのMainThread関数から、前回やった個別のシーンクラスに飛んで行うので、そうするとCAppのメンバにはアクセスできなくなる。
そこで前回のシーンファクトリーの仕掛けが効果を発揮する。
シーンファクトリーの宣言を見ると、ISceneFactoryとmediator<CApp>から多重継承されている。このmediatorが、ファクトリーとCAppを関連付けてくれているのだ。さらにファクトリーの中で、

p->SetOutClass(&outer);


としている。これにより、outerというキーワードはCAppクラスを指すようになるのだ。つまり、シーンクラスの中で、

outer.GetKey()


とすると、シーン内からでもキーデバイスが取得できるというわけ。


こんなところか。
一通りすんだらサンプルソースでも上げないとわけわからないまま進んでしまいそうだねえ。
しっかしプリコンパイル済みヘッダわからん…orz