モーリーのメモ

アプリ開発等(プログラミング、CG作成)、興味を持ったことを実践してまとめるブログです。

モーリーのメモ

マニュアルのチュートリアルをやってみる! その3(完):Cocos Creator

<今回やること!>

  • こちらの記事の続きを行います。
    mmorley.hatenablog.com
  • スコアの表示、ゲームが失敗した時のシーンのリロードや効果音の再生の処理等を追加します。
 
 今回でチュートリアル完了です。

使用環境

 私が使用している環境です。

スコアの追加

 キャラクターが星を採取した時の得点の加算と表示の処理を追加します。
 ゲーム開始時はスコアは0で、星を1つ採取したら1点加算します。

スコアのラベル(Label)を追加

スコアを表示するためにLabel』ノードを作成します。

  1. 『Node Tree』パネルで『Canvas』ノードを右クリックし、『Create』→『Create Renderer Nodes』→『Node With Label』をクリック
  2. 作成した『New Label』を右クリックして『Rename』をクリックし、名前を"score"に変更
  3. 『score』ノードを選択し、『Properties』パネルで『Label』コンポーネントを設定
    f:id:mmorley:20190428085059p:plain
  4. 『Properties』パネルで『Node』を設定
    f:id:mmorley:20190428085727p:plain

『Game』スクリプトに得点のロジックを追加

  1. 『Assets』パネルで、『Game』スクリプトをダブルクリックして開く
  2. コードエディタで、『Game』スクリプトの『properties』の最後に下記のコードを追加
    スコア表示用の『Label』を参照するためのプロパティです。
    前のプロパティの最後に『,(カンマ)』がなければ追加して下さい。

    // Game.js
        properties: {
            // ...省略
            // 『score』ラベル取得用の変数
            scoreDisplay: {
                default: null, // デフォルトの値をnullに設定
                type: cc.Label // プロパティの型をラベルに設定
            },
        },
    

  3. コードエディタで『Game』スクリプトを保存
  4. 『Node Tree』パネルで『Canvas』ノードをクリック
  5. 『Node Tree』パネルから『score』ノードを『Properties』パネルの『Game』コンポーネントの『Score Display』にドラッグ
  6. コードエディタで『Game』スクリプトの『onLoad』メソッドに下記のコードを追加
    得点用の変数を初期化します。

    // Game.js
        onLoad: function () {
            // ...省略
            // 得点を初期化
            this.score = 0;
        },
    

  7. 『Game』スクリプトの『update』メソッドの後ろに『gainScore』メソッドを追加

    // Game.js
        gainScore: function () {
            this.score += 1;
            // 『scoreDisplay』ラベルのスコア表示を更新
            this.scoreDisplay.string = 'Score: ' + this.score.toString();
        },
    

  8. コードエディタで『Game』スクリプトを保存
  9. 『Assets』パネルで『Star』をダブルクリックして開く
  10. 『Star』スクリプトの『onPicked』メソッドを下記のように変更
    『gainScore』の呼び出しを追加します。

    // Star.js
        onPicked: function() {
       // 『Game』コンポーネントの『spawnNewStar』メソッドを呼び出して、新しく星を生成
            this.game.spawnNewStar();
            // 『Game』スクリプトの得点用のメソッドを呼び出す
            this.game.gainScore();
            // 『star』ノードを破棄
            this.node.destroy();
        },
    

  11. コードエディタで『Game』スクリプトを保存
    プレビューボタンを押して、動作を確認します。
    f:id:mmorley:20190426120831p:plain
    星を採取した時、画面の上部に表示されたスコアが加算されます。
    f:id:mmorley:20160408232828p:plain

失敗の判定とリスタート

 時間ととも星が消える動作を追加します。採取する前に星をが完全に消えるとゲームオーバーとします。

制限時間内に消えるロジックを星に追加

  • 『Game』スクリプトの『onLoad』メソッドを下記のように変更
    『spawnNewStar』を呼び出す前に時間のカウントに必要な変数の宣言を追加します。

    // Game.js
        onLoad: function () {
            // 『ground』のアンカーポイントのy座標を取得
            this.groundY = this.ground.y + this.ground.height / 2;
            // タイマーを初期化
            this.timer = 0;
            // 星の持続時間(星が消えるまでの時間)を初期化
            this.starDuration = 0;  
            // 新しい星を生成
            this.spawnNewStar();
            // 得点を初期化
            this.score = 0;
        },
    

  • 『Game』スクリプトの『spawnNewStar』メソッドを下記のように変更
    メソッドの最後にタイマーをリセットする処理を追加します。
    『this.minStarDuration』と『this.maxStarDuration 』は『Game』スクリプトで定義したプロパティです。星の持続時間の乱数の幅です。

    // Game.js
        spawnNewStar: function() {
            // ...省略
            // タイマーをリセットし、星の持続時間に乱数値(min〜max)を設定
            this.starDuration = this.minStarDuration + Math.random() * (this.maxStarDuration - this.minStarDuration);
            // タイマーをリセット
            this.timer = 0;
        },
    

  • 『Game』スクリプトに下記のように『update』メソッドを追加
    タイマーが星の持続時間を超えたかを判定を行う処理を追加します。

    // Game.js
        update: function (dt) {
            if (this.timer > this.starDuration) { // タイマーが星の持続時間を超えた場合
                this.gameOver();  // ゲーム失敗のロジックを呼び出す
                return;
            }
            this.timer += dt; // タイマーを加算
        },
    

  • 『Game』スクリプトに『gameOver』メソッドを追加
    失敗した場合に、実行中のアクションを停止し、シーンをリロードします。

    // Game.js
        gameOver: function () {
            this.player.stopAllActions(); // 『Player』ノードのジャンプアクションを停止
            cc.director.loadScene('game'); // 『game』シーンをロードする
        },
    

  • コードエディタで『Game』スクリプトを保存
  • 『Star』スクリプトの『update』メソッドの最後に下記のコードを追加
    時間とともに星が消える処理を追加します。

    // Star.js
        update: function() {
            // ...省略
            // 経過時間と星の持続時間から、透明度の割合を計算
            var opacityRatio = 1 - this.game.timer / this.game.starDuration;
            // 透明度の最小値
            var minOpacity = 50; 
            // 星のノードの透明度を設定
            this.node.opacity = minOpacity + Math.floor(opacityRatio * (255 - minOpacity));
        },
    

  • コードエディタで『Star』スクリプトを保存
    これでゲームのプレイに関する基本的な処理は完成です。
    プレビューボタンを押して、動作を確認します。

  • 効果音を追加

     次にゲームに効果音を追加します。

    ジャンプの効果音

     ジャンプの効果音を追加します。

    1. 『Player』スクリプトの『properties』に『jumpAudio』を追加

      // Player.js
          properties: {
              // ...省略
              // ジャンプの効果音のリソース
              jumpAudio: {
                  default: null, // デフォルトをnullにする
                  type: cc.AudioClip // AudioClip型にする
              },
          },
      

    2. 『Player』スクリプトの『setJumpAction』メソッドを下記のように変更
      効果音を再生するコールバックを『playJumpSound』メソッドを追加して音を再生します。

      // Player.js
          setJumpAction: function () {
              // ジャンプアップ(ジャンプの最高地点まで移動)するアクションを定義
              var jumpUp = cc.moveBy(this.jumpDuration, cc.v2(0, this.jumpHeight)).easing(cc.easeCubicActionOut());
              // ジャンプダウン(ジャンプで地上まで落下)するアクションを定義
              var jumpDown = cc.moveBy(this.jumpDuration, cc.v2(0, -this.jumpHeight)).easing(cc.easeCubicActionIn());
              // アクションが終わった後に呼び出されるコールバック関数を追加
              var callback = cc.callFunc(this.playJumpSound, this);
              // リピート(ジャンプアップ→ジャンプダウン→着地音再生→ジャンプアップ→・・・の繰り返し)するアクションを返す
              return cc.repeatForever(cc.sequence(jumpUp, jumpDown, callback));
          },
      
          playJumpSound: function () {
              // 着地音を再生
              cc.audioEngine.playEffect(this.jumpAudio, false);
          },
      

    3. コードエディタで『Player』スクリプトを保存
    4. 『Node Tree』パネルで、『Player』ノードをクリック
    5. 『Assets』パネルの『audio』フォルダの『jump』を『Properties』パネルの『Player』コンポーネントの『Jump Audio』にドラッグ
      f:id:mmorley:20190428204125p:plain

    得点時の効果音

    1. 『Game』スクリプトの『properties』に『scoreAudio』を追加

      // Game.js
          properties: {
              // ...省略
              // 得点の効果音のリソース
              scoreAudio: {
                  default: null, // デフォルトをnullにする
                  type: cc.AudioClip // AudioClip型にする
              },
          },
      

    2. 『Game』スクリプトに『gainScore』メソッドを追加

      // Game.js
          gainScore: function () {
              this.score += 1;
              // 『scoreDisplay』ラベルのスコア表示を更新
              this.scoreDisplay.string = 'Score: ' + this.score.toString();
              // 得点時の効果音を再生
              cc.audioEngine.playEffect(this.scoreAudio, false);
          },
      

    3. コードエディタで『Game』スクリプトを保存
    4. 『Node Tree』パネルで、『Canvas』ノードをクリック
    5. 『Assets』パネルの『audio』フォルダの『score』を『Properties』パネルの『Game』コンポーネントの『Score Audio』にドラッグ
      f:id:mmorley:20190428205744p:plain
     ここまでの作業で、このチュートリアルは完成です。
     
     なお、チュートリアルの原本ではゲームの完成度を高めるため下記の機能を加えることを提案しています。
    • スタートメニューを追加します。ゲーム開始時にスタートボタンを表示します。ボタンをクリックした場合のみ、ゲームが開始します。
    • ゲーム失敗時のシンプルなメニューを追加します。失敗した後にボタンをクリックした場合のみ、ゲームが再開します。
    • メインキャラクタの移動範囲をウインドウの境界までに制限します。
    • 主人公のジャンプのアクションにもっと凝ったアニメーションのパフォーマンスを追加します。
    • 星が消えた時の状態表示にカウントダウンのプログレスバーを追加します。
    • 星を採取した時にもっと豪華なエフェクトを追加します。
    • タッチスクリーンデバイス向けの入力コントロールを追加します。
      
    『Cocos Creator』について更に知識を深めるには、下記の公式のドキュメントやフォーラム、『Cocos Creator』の『Example Collection』が参考になります。

    あとがき

     マニュアル、公式フォーラムは英語ですが、Googleのページ翻訳のおかげで、それなりに読むことが出来ます。便利な世の中です。

    おすすめ・関連する記事