Cocos2d-x 10円ゲーム講座 第13回、デモ画面を実装します。
これまででゲーム部分は完成しています。デモ画面は蛇足といっても過言ではありません(笑)。
タイトルを作ってシーン遷移、というのがチュートリアル的にはシーン遷移を学べて良いかもしれません。しかし、10円ゲームにタイトルからのシーンチェンジは不要でしょう。コインを入れてサクッとスタート。現実世界でもサクサク感は10円ゲームの醍醐味の1つだと思います。
私の思い出ですが、駄菓子屋に置いてあるゲーム機のデモ画面が好きでした。今でもそうですが、筐体機のデモ画面って非常に楽しそうな感じがしますよね。お菓子にするか、ゲームをするか……どれにお金を使おうか迷ってた子供時代、デモ画面は効果的な宣伝だったように思います。
そんなわけで、10円ゲームにコインを入れるまではデモ画面にしてみます。現実世界の10円ゲーム機のデモプレイはありえませんけどね。
前置きが長くなりましたが、10円ゲームのデモ画面というのを考えてみます。
こんな感じでしょうか。
デモプレイ画面であることは、このDEMO PLAY文字を明滅させることにします。
説明する部分は少ないのでコードを載せていきます。
class OneCoinGame : public cocos2d::Layer { public: // DEMO画面用update void demoUpdate(float delta); private: // デモモード bool _isDemo; cocos2d::Sprite *_demoSprite; };
デモ画面用のスケジュール関数と変数の定義です。
// デモモードかどうか _isDemo = false; // カスタム定期処理の開始(5.0秒毎の呼び出し) this->schedule(schedule_selector(OneCoinGame::demoUpdate), 5.0f);
コインの監視の際に説明したscheduleUpdate()メソッドはフレーム毎にupdate(float delta)を繰り返す呼び出す処理と決まっていましたが、デモ画面用のスケジュール処理は毎フレーム呼び出す必要はありません。そういった場合にschedule()を使用することで任意のメソッドを任意の間隔で呼び出す処理が可能です。今回は5.0秒毎に1回demoUpdate()を呼び出します。
// デモモード時の更新処理 void OneCoinGame::demoUpdate(float delta) { // デモ状態かどうか if (!_isDemo) { return; } // coinの状態を確認 // Enableがfalseなら、コイン投入処理 if (!_coin->getPhysicsBody()->isEnabled()) { this->coinEntry(); } // コインがレバー位置にあるなら、レバー処理 for (int i = 0; i < 4; i++) { // 範囲内ならコインにランダムな力を加える if (leverArea[i].containsPoint(_coin->getPosition())) { auto power = CCRANDOM_0_1(); if (i == 0 || i == 2) { this->applyForceCoin(1.0f, power); _lever[i]->setRotation(power * -90); _lever[i]->runAction(RotateTo::create(0.2, 0.0f)); } else { this->applyForceCoin(-1.0f, power); _lever[i]->setRotation(power * 90); _lever[i]->runAction(RotateTo::create(0.2, 0.0f)); } // 効果音を鳴らす CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("se/lever.wav"); } } }
CCRANDOM_0_1()はCocos2d-xでランダムを扱う場合に便利なマクロです。0~1までのfloat値を返してくれます。その他の説明は特に新しいことをしていないので省きます。
DEMO PLAYの明滅は、フェードイン・アウトの繰り返し処理で実現しています。Blinkを使わない理由としては、Blinkの点滅処理はbVisibleを操作するため、ボタンを押した際のsetVisibile処理と不整合が出るためです。ちなみにFadeIn, FadeOutはopacityを操作します。
デモプレイ。どうでしょうか。ソースコードはこちら
私はこういう勝手に操作しているのを眺めるのは大好きです。ランダムに力を加えているだけですが、見ていると結構楽しいですよね。
]]>