ゲームを作っているとswitchを使いたくなると思います。私はswitchを使うのは処理が少ない場合(一行とか二行とか)に限定しています。もし、case中に何行も書くことになってしまったり、またはcaseを何十個も書こうとしている状況はできるだけ回避した方がいいと思われます。
例えば以下のような例があります。
・プレイヤーが選択できる行動
→1.家に帰る
→2.店に行く
→3.バトルする
・さらに1,2,3の行動をした時間による文章変更機能
例1:店に行く時間が6時だったとき
例2:バトルする時間が12時だったとき
”プレイヤーが選択できる行動”だけであれば素直にswitch-caseを使ってもいいと思います。ところが、その行動をした時間によって何かが変わるといった場合や、他の機能をつけたいといった場合は管理が面倒になります。
この書き方だと新しく「case Go_***」を追加するとさらにswitch-caseが長くなってしまいます。もちろんその中の「case ***_OCLOCK」についても同様です。
従って「case」の中身をクラス化してアクセスすることにします。
上記のように書きなおすとスッキリしたように見えると思います。
何をしているのかというと、例えば家に帰る時(case GO_HOME)は「GoHome」クラスのインスタンスを実行するためにセットしています。これにより、「doSixOclock」を実行するだけで家に帰る(6時の場合の動作:CCLog("朝ごはん"))処理を行うことができます。
では、それぞれ作っていきます。
以上でコアが完成しました。あとは実行したい処理を書いていくだけです。
「GoHome」クラス以外も同様に追加することができるので、拡張性に優れていると思います。 GoHome.h、GoHome.cppを作成していますが、必ずしも作成する必要はありません。個人的にファイルを分けた方が見やすいのでそのようにしています。
今回は、2重にswitch-caseがある例を試してみました。
次回は、case中に数行コードがあり、caseが大量に必要な場合を試してみたいと思います。
例えば以下のような例があります。
・プレイヤーが選択できる行動
→1.家に帰る
→2.店に行く
→3.バトルする
・さらに1,2,3の行動をした時間による文章変更機能
例1:店に行く時間が6時だったとき
例2:バトルする時間が12時だったとき
”プレイヤーが選択できる行動”だけであれば素直にswitch-caseを使ってもいいと思います。ところが、その行動をした時間によって何かが変わるといった場合や、他の機能をつけたいといった場合は管理が面倒になります。
switch (arc4random()%3) { case GO_HOME: switch (arc4random()%3) { case SIX_OCLOCK: CCLog("朝ごはん"); break; case TWELVE_OCLOCK: CCLog("昼ごはん"); break; case EIGHTEEN_OCLOCK: CCLog("夜ごはん"); break; case default: break; } break; case GO_SHOP: ・・・ break; case GO_BATTLE: ・・・ break; default: break; }
この書き方だと新しく「case Go_***」を追加するとさらにswitch-caseが長くなってしまいます。もちろんその中の「case ***_OCLOCK」についても同様です。
従って「case」の中身をクラス化してアクセスすることにします。
PlayerContextState* state = new PlayerContextState(); switch (arc4random()%3) { case GO_HOME: state->setContextState(new GoHome()); break; case GO_SHOP: state->setContextState(new GoShop()); break; case GO_BATTLE: state->setContextState(new GoBattle()); break; default: ・・・ break; } state->doSixOclock();
上記のように書きなおすとスッキリしたように見えると思います。
何をしているのかというと、例えば家に帰る時(case GO_HOME)は「GoHome」クラスのインスタンスを実行するためにセットしています。これにより、「doSixOclock」を実行するだけで家に帰る(6時の場合の動作:CCLog("朝ごはん"))処理を行うことができます。
では、それぞれ作っていきます。
#include <iostream> #include "State.h" class PlayerContextState { private: State* contextState; public: PlayerContextState(); void setContextState(State* state); void doSixOclock(); void doTwelveOclock(); void doEighteenOclock(); };
#include "PlayerContextState.h" #include "GoHome.h" PlayerContextState { this->contextState = new GoHome(); } void PlayerContextState::setContextState(State *state) { this->contextState = state; } void PlayerContextState::doSixOclock() { this->contextState->sixOclock(); } void PlayerContextState::doTwelveOclock() { this->contextState->twelveOclock(); } void PlayerContextState::doEighteenOclock() { this->contextState->eighteenOclock(); }
#include <iostream> class State { public: virtual ~State(){} virtual void sixOclock() = 0; virtual void twelveOclock() = 0; virtual void eighteenOclock() = 0; };
以上でコアが完成しました。あとは実行したい処理を書いていくだけです。
#include <iostream> #include "State.h" #include "cocos2d.h" class GoHome : public State { public: void sixOclock(); void twelveOclock(); void eighteenOclock(); };
#include "GoHome.h" USING_NS_CC; void GoHome::sixOclock() { CCLog("朝ごはん"); } void GoHome::twelveOclock() { CCLog("昼ごはん"); } void GoHome::eighteenOclock() { CCLog("夜ごはん"); }
「GoHome」クラス以外も同様に追加することができるので、拡張性に優れていると思います。 GoHome.h、GoHome.cppを作成していますが、必ずしも作成する必要はありません。個人的にファイルを分けた方が見やすいのでそのようにしています。
今回は、2重にswitch-caseがある例を試してみました。
次回は、case中に数行コードがあり、caseが大量に必要な場合を試してみたいと思います。