10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

phina.jsで簡単なメニューを作る

Last updated at Posted at 2017-08-19

メニューと言ってもとても簡単なものです。
#完成形

phina.globalize();

var selectNum = 0;

phina.define("MainMenuScene", {
    superClass: 'DisplayScene',
    init: function() {
        this.superInit();
        Label({
            text:"Title",
            fontSize:100,
            x:this.gridX.center(),
            y:this.gridY.span(3),
        }).addChildTo(this);
        this.labels = [];
        this.menuList = [["A",'SceneA'],["B",'SceneB'],["C",'SceneC'],["D",'SceneD']];
        (this.menuList.length).times(function(i){
            this.labels[i] = Label({
                text:this.menuList[i][0],
                fill:'black',
                fontSize:50,
                x:this.gridX.center(),
                y:this.gridY.span(8+i),
            }).addChildTo(this).setOrigin(0.5,0);
        },this);
    },
    update:function(app){
        key = app.keyboard;
        if(key.getKeyDown('up'))if(selectNum>0)selectNum --;
        if(key.getKeyDown('down'))if(selectNum<this.labels.length-1)selectNum ++;
        if(key.getKeyDown('enter'))this.exit(this.menuList[selectNum][1],{selectNum:selectNum});
        (this.menuList.length).times(function(i){
            if(i == selectNum){this.labels[i].fill = 'yellow';this.labels[i].stroke = 'red'}
            else{this.labels[i].fill = 'black';this.labels[i].stroke = 'transparent'}
        },this);
    }
});

phina.define("SceneAScene",{
    superClass:'DisplayScene',
    init:function(){
        this.superInit();
        that = this;
        Label({
            text:"SceneA",
            x:this.gridX.center(),
            y:this.gridY.center(),
        }).addChildTo(this);
        Button({
            text: "Back",
            fontSize:80,
          }
      ).addChildTo(this).setPosition(this.gridX.center(),this.gridY.span(10)).onpush = function(){
        that.exit('MainMenu');    
        };
    }
})

phina.define("SceneBScene",{
    superClass:'DisplayScene',
    init:function(){
        this.superInit();
        that = this;
        Label({
            text:"SceneB",
            x:this.gridX.center(),
            y:this.gridY.center(),
        }).addChildTo(this);
        Button({
            text: "Back",
            fontSize:80,
          }
      ).addChildTo(this).setPosition(this.gridX.center(),this.gridY.span(10)).onpush = function(){
        that.exit('MainMenu');    
        };
    }
})

phina.define("SceneCScene",{
    superClass:'DisplayScene',
    init:function(){
        this.superInit();
        that = this;
        Label({
            text:"SceneC",
            x:this.gridX.center(),
            y:this.gridY.center(),
        }).addChildTo(this);
        Button({
            text: "Back",
            fontSize:80,
          }
      ).addChildTo(this).setPosition(this.gridX.center(),this.gridY.span(10)).onpush = function(){
        that.exit('MainMenu');    
        };
    }
})

phina.define("SceneDScene",{
    superClass:'DisplayScene',
    init:function(){
        this.superInit();
        that = this;
        Label({
            text:"SceneD",
            x:this.gridX.center(),
            y:this.gridY.center(),
        }).addChildTo(this);
        Button({
            text: "Back",
            fontSize:80,
          }
      ).addChildTo(this).setPosition(this.gridX.center(),this.gridY.span(10)).onpush = function() {
        that.exit('MainMenu');    
        };
    }
})

var MyScenes = [
    {
        label: "MainMenu",
        className:"MainMenuScene",
    },
    {
        label: "SceneA",
        className:"SceneAScene",
    },
    {
        label: "SceneB",
        className:"SceneBScene",
    },
    {
        label: "SceneC",
        className: "SceneCScene",
    },
    {
        label: "SceneD",
        className: "SceneDScene",
    }
]

phina.main(function(){
    var app = GameApp({
        startLabel: 'MainMenu',
        scenes: MyScenes,
    });
    app.run();
});

Runstantで確認

#解説
##グローバル変数
selectNumをグローバル変数として宣言することでMainMenuSceneに戻ってきたときに遷移する前に選択していた番号が保持できます。
##MainMenuScene
下でphina.mainに定義してあるとおり最初に表示されるシーンです。
this.menuListが二次元配列になってて、それぞれメニューに表示する名前、MyScenesで定義しているラベルの順で入っています。
labelsにはループでメニューリストの名前のラベルを配列として入れてます。配置にはphinaの便利機能、Gridを使っていますが、別に使わなくても全く問題ありません。
updateで上下キーが押されたときにselectNumをインクリメント、もしくはデクリメントしてエンターキーが押されたときにselectNumの値に対応するラベルのシーン(SceneA,SceneB...)に遷移する処理をします。その下にselectNumの値のメニュー項目の色を変え、それ以外の色はもとに戻す処理が続きます。

#おわりに
まだまだ基本の段階ですが、phinaはtweenerなどを使えば簡単にアニメーションを実装できるので、もう少し見栄えのいいメニューも作ってみたいと思います。
今回がQiita初投稿となりますので、何かご指摘等あればコメントしてくださると助かります。

10
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?