• チュートリアル
  • 機能解説
  • リファレンス
  • 初代Altseedはコチラ

    • チュートリアル
    • 0章 : Altseedを初めよう
    • 1章 : ウィンドウを表示してみよう
    • 2章 : キャラクターを描画してみよう
    • 3章 : キャラクターに弾を撃たせてみよう
    • 4章 : クラスを自分で設計してみよう
    • 5章 : 敵・敵のショットを表示してみよう
    • 6章 : 当たり判定の機能を使ってみよう
    • 7章 : 音を鳴らしてみよう
    • 8章 : 得点を表示してみよう
    • 9章 : タイトル・ゲームオーバー画面を作ってみよう
    • 10章 : いざ、公開準備

    8章 : 得点を表示してみよう

    前章では音を鳴らすところまで進みました。

    今回は5章で設定したスコア(score)を、画面に表示してみましょう!

    まずは、スコアを表示させるためのTextNodeを作り、それを表示するところまでやってみます。

    これが表示できたら、あとは表示するテキストをスコアに切り替えます。

    テキストを表示

    まずは、スコア変数とスコア表示用のTextNodeを追加していきます。

    以下のコードを追加してください。

    using Altseed2;
    using System.Collections.Generic;
    
    namespace Tutorial
    {
        // メインステージのクラス
        public class MainNode : Node
        {
            // BGMのID
            private int? bgmID = null;
    
            // カウンタ
            private int count = 0;
    
            // 敵を格納するキュー
            private Queue<Enemy> enemies = new Queue<Enemy>();
    
            // キャラクターを表示するノード
            private Node characterNode = new Node();
            
            // プレイヤーの参照
            private Player player;
    
    +       // スコアを表示するノード
    +       private TextNode scoreNode;
    
    +       // スコア
    +       public int score;
    
            ...略...
    

    二つのTextNode用の変数を書いたら、

    次は敵を倒したときにスコア加算が行われるようにします。

    以下のコードを追加してください。

    using Altseed2;
    
    namespace Tutorial
    {
        // 敵の基礎となるクラス
        public class Enemy : CollidableObject
        {
    
            ...略...
    
            // 衝突時に実行
            protected override void OnCollision(CollidableObject obj)
            {
                // 衝突対象が自機弾だったら
                if (obj is PlayerBullet)
                {
    +               // スコアを加算
    +               mainNode.score += score;
    
                    // 死亡時エフェクトを再生
                    Parent.AddChildNode(new DeathEffect(Position));
    
                    // 自身を削除
                    Parent.RemoveChildNode(this);
    
                    // 死亡時サウンドを読み込み
                    var deathSound = Sound.LoadStrict("Resources/Explosion.wav", true);
    
                    // 死亡時サウンドを再生
                    Engine.Sound.Play(deathSound);
                }
            }
    
            ...略...
    
        }
    }
    

    次はこのTextNodeの設定していきます。

    using Altseed2;
    using System.Collections.Generic;
    
    namespace Tutorial
    {
        // メインステージのクラス
        public class MainNode : Node
        {
    
            ...略...
    
            // エンジンに追加された時に実行
            protected override void OnAdded()
            {
                // キャラクターノードを追加
                AddChildNode(characterNode);
    
                // UIを表示するノード
                var uiNode = new Node();
    
                // UIノードを追加
                AddChildNode(uiNode);
    
                // 背景に使用するテクスチャ
                var backTexture = new SpriteNode();
                // 背景のテクスチャを読み込む
                backTexture.Texture = Texture2D.LoadStrict("Resources/Background.png");
                // 表示位置を奥に設定
                backTexture.ZOrder = -100;
    
                // 背景テクスチャを追加
                AddChildNode(backTexture);
    
                // プレイヤーを設定
                player = new Player(this, new Vector2F(100, 360));
    
                // キャラクターノードにプレイヤーを追加
                characterNode.AddChildNode(player);
    
    +           // スコアを表示するノードを設定
    +           scoreNode = new TextNode();
    +           // スコア表示に使うフォントを読み込む
    +           scoreNode.Font = Font.LoadDynamicFontStrict("Resources/GenYoMinJP-Bold.ttf");
    +           // スコア表示に使う文字のサイズを設定
    +           scoreNode.FontSize = 30;
    +           // スコア表示の位置を設定
    +           scoreNode.Position = new Vector2F();
    +           // スコア表示の文字を設定
    +           scoreNode.Text = "スコア";
    +
    +           // UIノードにスコア表示ノードを追加
    +           uiNode.AddChildNode(scoreNode);
    
                // ウェーブを初期化する
                InitWave();
    
                // BGMを初期化する
                InitBGM();
            }
    
            ...略...
    
        }
    }
    

    設定した内容は、

    • TextNodeインスタンスの代入
    • フォントの読み込みと設定
    • 表示位置を設定
    • uiNodeに追加 の4点です。

    この4つの設定をスコアのテキストにしています。

    ここで一度実行してみます。

    「スコア」が画面上部に表示されているのが確認できました。

    ここまできたら次は、実際のスコアを表示してみましょう。

    実際のスコアを表示

    スコアはscoreに格納されていますね。

    これらをテキストに設定していきます。

    では、以下のコードを追加・削除してください。

    using Altseed2;
    using System.Collections.Generic;
    
    namespace Tutorial
    {
        // メインステージのクラス
        public class MainNode : Node
        {
    
            ...略...
    
            // エンジンに追加された時に実行
            protected override void OnAdded()
            {
                // キャラクターノードを追加
                AddChildNode(characterNode);
    
                // UIを表示するノード
                var uiNode = new Node();
    
                // UIノードを追加
                AddChildNode(uiNode);
    
                // 背景に使用するテクスチャ
                var backTexture = new SpriteNode();
                // 背景のテクスチャを読み込む
                backTexture.Texture = Texture2D.LoadStrict("Resources/Background.png");
                // 表示位置を奥に設定
                backTexture.ZOrder = -100;
    
                // 背景テクスチャを追加
                AddChildNode(backTexture);
    
                // プレイヤーを設定
                player = new Player(this, new Vector2F(100, 360));
    
                // キャラクターノードにプレイヤーを追加
                characterNode.AddChildNode(player);
    
                // スコアを表示するノードを設定
                scoreNode = new TextNode();
                // スコア表示に使うフォントを読み込む
                scoreNode.Font = Font.LoadDynamicFontStrict("Resources/GenYoMinJP-Bold.ttf");
                // スコア表示に使う文字のサイズを設定
                scoreNode.FontSize = 30;
                // スコア表示の位置を設定
                scoreNode.Position = new Vector2F();
    -           // スコア表示の文字を設定
    -           scoreNode.Text = "スコア";
    
                // UIノードにスコア表示ノードを追加
                uiNode.AddChildNode(scoreNode);
    
                // ウェーブを初期化する
                InitWave();
    
                // BGMを初期化する
                InitBGM();
            }
    
            ...略...
    
            // フレーム毎に実行
            protected override void OnUpdate()
            {
    +           // スコア表示の更新
    +           scoreNode.Text = "Score : " + score;
    
                // ステージの更新
                UpdateStage();
    
                // カウントを進める
                count++;
            }
    
            ...略...
    
        }
    }
    

    まず、先ほど追加した仮テキストを代入する箇所を削除します。

    次に、それぞれのテキスト表示を更新する箇所ですが、

    scoreNode.Text = "Score : " + score;

    このようになっています。

    これは、"Score : " と score変数を合体させて、"Score : 210" という形式で表示しようとしています。

    この処理を毎フレーム実行することで、現在のスコアを表示することができるようになる、ということです。

    では実行してみます

    左上の方に「Score」が表示できてますね。

    さて、これで現在のスコアを表示できるようになりました。

    次回は自機がダメージを受けたときの処理を書いていきます!

    コード全体

    最後に、今回修正を加えた、今回のMainNode全体を載せておきます。困ったときは見比べたりコピペしてみてください。

    using Altseed2;
    using System.Collections.Generic;
    
    namespace Tutorial
    {
        // メインステージのクラス
        public class MainNode : Node
        {
            // BGMのID
            private int? bgmID = null;
    
            // カウンタ
            private int count = 0;
    
            // 敵を格納するキュー
            private Queue<Enemy> enemies = new Queue<Enemy>();
    
            // キャラクターを表示するノード
            private Node characterNode = new Node();
            
            // プレイヤーの参照
            private Player player;
    
            // スコアを表示するノード
            private TextNode scoreNode;
    
            // スコア
            public int score;
    
            // エンジンに追加された時に実行
            protected override void OnAdded()
            {
                // キャラクターノードを追加
                AddChildNode(characterNode);
    
                // UIを表示するノード
                var uiNode = new Node();
    
                // UIノードを追加
                AddChildNode(uiNode);
    
                // 背景に使用するテクスチャ
                var backTexture = new SpriteNode();
                // 背景のテクスチャを読み込む
                backTexture.Texture = Texture2D.LoadStrict("Resources/Background.png");
                // 表示位置を奥に設定
                backTexture.ZOrder = -100;
    
                // 背景テクスチャを追加
                AddChildNode(backTexture);
    
                // プレイヤーを設定
                player = new Player(this, new Vector2F(100, 360));
    
                // キャラクターノードにプレイヤーを追加
                characterNode.AddChildNode(player);
    
                // スコアを表示するノードを設定
                scoreNode = new TextNode();
                // スコア表示に使うフォントを読み込む
                scoreNode.Font = Font.LoadDynamicFontStrict("Resources/GenYoMinJP-Bold.ttf");
                // スコア表示に使う文字のサイズを設定
                scoreNode.FontSize = 30;
                // スコア表示の位置を設定
                scoreNode.Position = new Vector2F();
    
                // UIノードにスコア表示ノードを追加
                uiNode.AddChildNode(scoreNode);
    
                // ウェーブを初期化する
                InitWave();
    
                // BGMを初期化する
                InitBGM();
            }
    
            // エンジンから削除されたときに実行
            protected override void OnRemoved()
            {
                // 衝突判定を全てリセット
                CollidableObject.objects.Clear();
            }
    
            // BGMを初期化
            private void InitBGM()
            {
                // BGMを読み込む
                var bgm = Sound.LoadStrict("Resources/BGM.wav", false);
    
                // BGMをループするように設定
                bgm.IsLoopingMode = true;
    
                // ループ開始位置を設定
                bgm.LoopStartingPoint = 11.33f;
    
                // ループ終了位置を設定
                bgm.LoopEndPoint = 33.93f;
    
                // BGMのプレイ開始
                bgmID = Engine.Sound.Play(bgm);
            }
    
            // ウェーブの初期化
            private void InitWave()
            {
                // enemies.Enqueue~でウェーブに敵を追加
                // 追加した順番に敵が出現する
    
    
                enemies.Enqueue(new ChaseEnemy(player, new Vector2F(700, 160), 2.0f));
    
                enemies.Enqueue(new StraightShotEnemy(player, new Vector2F(600, 620)));
    
                enemies.Enqueue(new Meteor(player, new Vector2F(910, 400), new Vector2F(-4.0f, 0.0f)));
    
                enemies.Enqueue(new RadialShotEnemy(player, new Vector2F(400, 160), 3));
            }
    
            // フレーム毎に実行
            protected override void OnUpdate()
            {
                // スコア表示の更新
                scoreNode.Text = "Score : " + score;
    
                // ステージの更新
                UpdateStage();
    
                // カウントを進める
                count++;
            }
    
            // 敵召還関連
            private void UpdateStage()
            {
                // カウントが100の倍数だったら
                if (count % 100 == 0)
                {
                    // 敵が残っていたら画面に追加
                    if (enemies.Count > 0)
                    {
                        characterNode.AddChildNode(enemies.Dequeue());
                    }
                }
            }
        }
    }
    
    Copyright © 2020 Altseed .