Chapter 09

Sceneをプッシュしてポーズ画面を作成する

alkn203
alkn203
2021.09.12に更新

pausescene

ポース画面の作成

シーンをプッシュしてポーズ画面を作ります。

シーンを継承して独自ポーズシーンを作成する

今回作ったポーズシーンは以下のとおりです。

/*
 * ポーズシーン
 */
phina.define("MyPauseScene", {
  // 継承
  superClass: 'DisplayScene',
  // コンストラクタ
  init: function() {
    // 親クラス初期化
    this.superInit();
    // 背景を半透明化
    this.backgroundColor = 'rgba(0, 0, 0, 0.7)';
    
    var self = this;
    // ポーズ解除ボタン    
    Button({
      text: 'Resume',
    }).addChildTo(this)
      .setPosition(this.gridX.center(), this.gridY.center(-3))
      .onpush = function() {
        // 自身を取り除く
        self.exit();    
      };
  },
});
  • ポーズ画面用のSceneDisplaySceneを継承して作ります。
  • 背景色は黒にしますが、rgba でアルファ値を指定して半透明にします。
  • ポーズ画面解除用のボタンを作成してシーンに追加します。
  • onpushにボタンが押された時の処理を書きますが、今回はexitで自分自身を取り除いています。

ポーズ画面を表示する

作成したポーズ画面は現在のSceneに上乗せ(push)して表示します。

// ポーズボタン
Button({
  text: 'Pause',
}).addChildTo(this)
  .setPosition(this.gridX.center(), this.gridY.center(3))
  .onpush = function() {
    // ポーズシーンをpushする
    self.app.pushScene(MyPauseScene());    
  };
  • Sceneを上乗せするにはpushSceneを使います。
  • phina.jsでは、 Sceneが重ねられると下に隠れたSceneの更新処理がストップしますので、ポーズ画面のように機能させることができます。

サンプルコード

コードを見る
// グローバルに展開
phina.globalize();
/*
 * メインシーン
 */
phina.define("MainScene", {
  // 継承
  superClass: 'DisplayScene',
  // コンストラクタ
  init: function() {
    // 親クラス初期化
    this.superInit();
    // 背景色
    this.backgroundColor = 'black';
    // 回転する矩形    
    RectangleShape().addChildTo(this)
           .setPosition(this.gridX.center(), this.gridY.center())
           .update = function() {
             this.rotation += 8;
           };
           
    var self = this;
    // ポーズボタン
    Button({
      text: 'Pause',
    }).addChildTo(this)
      .setPosition(this.gridX.center(), this.gridY.center(3))
      .onpush = function() {
        // ポーズシーンをpushする
        self.app.pushScene(MyPauseScene());    
      };
  },
});
/*
 * ポーズシーン
 */
phina.define("MyPauseScene", {
  // 継承
  superClass: 'DisplayScene',
  // コンストラクタ
  init: function() {
    // 親クラス初期化
    this.superInit();
    // 背景を半透明化
    this.backgroundColor = 'rgba(0, 0, 0, 0.7)';
    
    var self = this;
    // ポーズ解除ボタン    
    Button({
      text: 'Resume',
    }).addChildTo(this)
      .setPosition(this.gridX.center(), this.gridY.center(-3))
      .onpush = function() {
        // 自身を取り除く
        self.exit();    
      };
  },
});
/*
 * メイン処理
 */
phina.main(function() {
  // アプリケーションを生成
  var app = GameApp({
    // MainScene から開始
    startLabel: 'main',
  });
  // 実行
  app.run();
});

runstantプロジェクト

https://runstant.com/alkn203/projects/53a2d675