いくぞぉ!

と思ったのだが、ここんとこ悩まされているバグがまだ取れず頓挫。
まあついでだし、突然だがyaneSDKを用いたゲームプログラミングの本題に入ろう。

今自分が作ろうとしているのは、2Dの縦スクロールシューティング。「結局それかよ!」って感じかもしれないが、一応基本だし。
それによくあるサンプルのように、それを参考に他のゲームを作ろうとしてもどこから手を付けていけばいいのかわからないタイプではなくしようと思っている。

つまり、(現段階で)自分の最終的な目標は以下。
yaneSDKはその機能を組み合わせれば上質なゲームができるが、その作業にはそれなりのプログラミング技術が要求される。その点、あまり初心者向けとはいえないだろう。そこで、画像処理やキャラクタの動作といった表面的な部分をTODO:的にちょこちょこっと書き込むだけでゲームが作れるような、いわばゲームテンプレートを作ってみようと思っている。高望みかもしれないが。
そのためは、まずyaneSDKの機能をなるべく多く使って簡単なゲームを作り、それを一般化してテンプレートにしてみようかなという策略。


では、まず作るゲームの計画を立てる。

・2D縦STG
・全2面構成
・各面では一定条件を満たすとボスが出現
・スコア表示

できれば以下も実装したい
・自機のパワーアップ

このゲームをyaneSDKを用いて作るためにはどうすればよいか。
まず大まかでわかりやすいところから見ていこう。

全2面構成であり、それ以前にタイトル画面などもゲームには必要だろう。
こういったそれぞれの場面を「シーン」という単位であらわす。(詳しくはやねうらお著「Windowsプロフェッショナルゲームプログラミング」(通称やね本1)を参照)
この「シーン」をまずクラスとして用意し、ゲームが始まったら「タイトルシーン」クラスを実体化して、1面がスタートしたら「1面シーン」クラスへジャンプ、というようにすればいい。
ここで、シーンの基底クラスISceneやシーン間の移動などを行うためのシーンコントローラCSceneControlはyaneSDKに用意されているが、具体的にシーンを生成するところは自分で書かなくてはいけない。
さて、このシーン生成をスムーズに実現するために、「パラメタライズドファクトリー」というオブジェクト生成法を使うことがやね本1には書かれている。パラメタライズドファクトリーとは、まあ単純に番号かなんかを渡されたら、それに対応するオブジェクトをnewして返すという仕組みだ。実際に見ていただこう。自分の作ったシーンファクトリーはこんな感じ。(ほとんどやね本1にあるまんまだけど)

//グローバル
enum EScene {
SceneTitle,
SceneStage1,
};

//MySceneFactory.h
class CMySceneFactory : public ISceneFactory, public mediator<CApp> {
public:
CMySceneFactory(CApp* pv) : mediator<CApp>(pv){}

//ISceneはシーン基底クラス、smart_ptrは高機能なポインタ
//つまりsmart_ptr<IScene>はIScene*だと思えばよい
virtual smart_ptr<IScene> CreateScene(int nScene){

CSceneBase *p = NULL;

switch((EScene)nScene){
case SceneTitle : p = new CSceneTitle; break;
case SceneStage1 : p = new CSceneStage1; break;
}

p->SetOutClass(&outer); //これの説明はまた今度ね

return smart_ptr<IScene>(p);
//これはreturn IScene* pScene = p;と思って
}
}

こうすると、

//コントローラのコンストラクタにファクトリーを渡す
CSceneControl sc(smart_ptr<ISceneFactory>(new CMySceneFactory(this), true));

というふうにシーン操作を行う「シーンコントローラ」というものを用意してそれにファクトリーを組み込んでおけば、

sc.JumpScene(SceneTitle);


とやることでCSceneTitleクラスが実体化され、タイトルシーンがスタートする。
シーン内での具体的な処理は初期化、移動、描画に分けられており、シーンクラスのメンバ関数OnInit,OnMove,OnDrawでそれぞれ行う。

これがyaneSDKで製作するゲームのフレームワークだ。
(でも今はタスクシステムという機構を使うのが普通みたい…やねさんやね本1のときにそう言ってよ…もしくはタスク使わないサンプル作って〜)


んーと本日はまあこの辺で。なんとなく惰性だけどいちおう滑り出したか…。
yaneSDK触ったことない人にはちんぷんかんぷんかも…。これを機にぜひ使ってみよう!orz
次回は自機や弾を楽に管理するためのキャラクタコントローラを取り上げます。
では〜


追記
上のファクトリーでCSceneBaseは、ISceneから派生したベースシーンクラス。
いきなり個々のシーンを作る前に、共通の動作とかを付けるためにワンクッション置いてる。それにアプリケーションクラスからキー入力とかもらわないといけないからmediatorを多重継承して…ああ今度まとめて話そう(;´д`)