前の章で割愛した、Parameterについてお話していきましょう。前の章でも言った通り、前のシーンから次のシーンへ値を渡す時、グローバル変数を使った渡し方をしてはいけません。今回作ろうとしている仕組みはAndroidの設計手法と似ています。Androidも画面から画面へパラメータを渡したい時は「Intent」と呼ばれるものを使います。今回はこの機能をものすごく簡素化して、特定のint型のみ自由に渡せるようにしてみます。言っても、画面から画面へは巨大な独自クラスのような物を渡す必要はないので、int型で十分です。今回はTitleSceneで選択された難易度をGameSceneに渡すことをやってみます。Parameterの仕組みですが、特定のタグをキー値とした値を保持できるようにします。特定のキーと値をセットにするにはmapが便利ですね。std::mapを知らない人はググってください。mapは要するに配列要素に好きな物が使える奴です。1;これがC言語である通常の配列ですよね。1;こんなことができるのです。"レベル"というキーとなるタグに、1という値を持たせることが出来ました。Normal;こんな形でParameterに格納してやって、移った先のGameSceneではarr["レベル"]を取り出せばいいってわけです。}}特に難しいことはしていません。先ほど言ったことをクラスにしただけです。setでキーと値をセットします。getでセットしたキーの値を取り出します。エラー処理をしているのは、指定したキーが無かった時の為のものです。キーに対応した値はsecondに入るので、イテレータのsecondを返しています。これを利用しているパラメータの渡し先のGameSceneクラスをまず見てみましょう。_level);}TitleSceneから渡されるパラメータはコンストラクタに入ってきます。パラメータは読み込み専用です。書き込みをする必要はないのでconstです。呼び出すメソッドもconstでなければなりませんので、Parameter::get()はconstメンバ関数です。_level;として変数を一つ用意してみました。受け取ったパラメータをここで受け取って保持します。drawではこの受け取った値を表示しています。あ、そうそう、このdraw()にもconstが付いていることに注意してください。さっき付いていなかったかというと書き忘れていたからです(←draw()メソッド内でやってはいけないことがあります。乱数の使用draw()メソッドは処理落ちをした時に省略される可能性があります。従ってdraw()の呼び出しを省略した時に計算結果が変わるような処理を書いてはいけません。乱数を使わないように言語上守ることはできませんが、メンバ変数を書き換えないようにはできるのでconstメンバ関数としてください。基本的にゲームプログラミングの設計は「update()で全部御膳立てをして、draw()はただそれに従って表示するだけ」だと思ってください。パラメータを渡しているTitleSceneを見てみます。GetColor(255,255,255));}Eキーが押されていたら「Define::eLevel::Easy」を、Nキーが押されていたら「Define::eLevel::Normal」を渡すようにしてあります。今回シーンのスタックはクリアしないようにしました。stackClearにはfalseを渡しています。(今回しれっとDefineの定義を足してあるので、配布しているプロジェクト内を確認しておいてください)_implSceneChanedはLooperのインターフェイスポインタですから、ここでonSceneChaned()をコールすると、Looper::onSceneChaned()がコールされます。Looperを見てみましょう。}}今回変更したのはonSceneChaned()メソッド内だけです。stackClearがtrueならスタックをクリアします。switchで次の画面が何のシーンなのか条件分岐してインスタンスの生成をし、スタックにpushしています。実行結果(Nキーを押した場合)今回onSceneChaned()のみ変更しました。処理のコアとなっているLooper::loop()には一切手を加えずにシーンの切り替えが出来たことに着目してください。このようにnewするときだけ条件分岐し、抽象クラスのポインタを持って共通したI/Fでアクセスして処理することを先の章でも紹介したストラテージパターンと言います。C++の大事な要素なのでよく覚えておいてください。提示したソースコードの最後に「どうしようもないエラー発生」と書きました。通常そこに行くはずはないのですが、万が一来た時に処理できない、そんなときの対処方法を次の章で解説します。