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());
}
}
}
}
}