インスタンス変数
インスタンス変数を使用することで、モンスターたちはそれぞれ別々に命を持つことが出来きます。変数は文字通り、変わることが出来る数。それをモンスターのインスタンス一匹づつに用意するのでインスタンス変数と呼ぶわけです。
では health インスタンス変数をモンスターに加えてみましょう。プロジェクトバー(かオブジェクトバー)のモンスターをクリックします。 レイアウトに戻ってモンスターをクリックしてもいいでしょう。プロパティーバーにモンスターのプロパティーが表示されます。 Edit variablesという項目にあるAdd/editをクリックします。.
Instance Variables ダイアログが表示されます。 前に見た Behaviors ダイアログに似ていますが、ここではオブジェクトのインスタンス変数を設定するのに使用します。 緑色のプラスボタン Add new、をクリックして新しく作成します。
ポップアップダイアログが表示されたら Nameの項目に health とキーボート入力します。Type項目はそのままNumberで構いません。Initial value(初期値)には 5を入力しましょう(スクリーンショットを参考にしてください)これでモンスターはそれぞれヘルスを5づつ持ってスタートするようになります。弾が当たる度にヘルスから1ずつ減算するようにし、値が0になった時にオブジェクトを破壊するようにします。
設定がすべて完了したらOKをクリックします。新たに加えられた変数がダイアログ、およびモンスターのプロパティーで確認できるでしょう。 (プロパティーバーを使って初期値を自由に設定できますが、変数を加えたり編集したりするにはAdd / Editリンクを使う必要があります。)
イベントを変更する
まずイベントシートに切り替えます。今の設定だとモンスターは弾が一発当たると死んでしまいます。 ヘルス変数から1を引くように変更しましょう。
イベントシートから Bullet - on collision with Monster というイベントを見つけてください。アクションとして "destroy monster" が設定されているのが分かります。これを"ヘルスから1を引く" というアクションに変更しましょう。"destroy monster" アクションを右クリックしたら、Replace(置き換える) メニューをクリックします。.
新しいアクションを加える時のダイアログが表示されますが、今回は既存のアクションの内容を置き換えます。 Monster を選んで -> Subtract from (Instance variables カテゴリー内にあります) -> Instance variable "health" インスタンス変数を選び、最後に 1 の値を指定します。Value. 終わったらDone をクリックします。アクションはこのように変更されているはずです。
これでモンスターに弾が当たって爆発する度に、そのモンスターのヘルスがひとつ減るようになりましたが、ヘルスが0になった時にモンスターが死ぬようにはまだなっていません。もうひとつイベントを加えましょう
コンディション: Monster -> Compare instance variable -> Health, Less or equal, 0
アクション: Monster -> Spawn another object -> Explosion, レイヤーは 1
アクション: Monster -> Destroy
なぜ表現に、“0と等しい”ではなく、"0と等しいかそれ以下0" を使うのでしょうか?こういうことです。仮に将来ヘルスを2づつ減らす協力な武器をゲームに加えたとしましょう。モンスターを撃つ度に、そのモンスターのヘルスは 5, 3, 1, -1, -3 と減っていきます。ただし、ヘルスが一度も”0と等しい”状態にならなかったのでモンスターは死なずすんでしまうのです。そういう理由で、ヘルスがなくなった状態を確認するには "等しい、またはそれ以下less or equal"を使うのが好ましいのです。
ゲームを実行してみましょう。今度はモンスターを殺すのに5回撃たなくてはなりません。
スコアをつける
プレイヤーの実績が分かるようにスコアをつけることにしましょう。これにはもうひとつ新しい変数が必要になります。そのためにはプレイヤーのインスタンス変数を新たに加えると良い、そう考えた方もいるかもしれませんね。発想としては悪くないのですが、インスタンス変数はインスタンスの一部として保存されることを思い出してください。つまり、インスタンスが存在しない限り、変数も存在できないわけです。ということはつまり、プレイヤーが破壊されてしますと、その一部であったスコア変数も一緒に無くなってしまうということなのです。
かわりにここでは、グローバル変数 を使います。インスタンス変数と同じように、グローバル変数も文字や数のデータを格納できます。ひとつの変数が値や文字を保存するわけですが、グローバル変数はゲーム内の全てのレイアウトからアクセスできるのが違います。これは例えばゲームのレベルなどにも利用できますね。
イベントシートの下部空白のどこかを右クリック して、Add global variable メニューを選択しましょう。.
名前の項目にはEnter Score と設定してください。他の項目はデファルト値のままで構いません。スコアの初期値は0から始まります。
完了したらイベントシートに新たに一行分、グローバル変数が表示されるようになりました。グローバル変数は、このシートだけでなく、他の全てのシートからもアクセスできます。
ヒント:他にも、グローバル変数より小さなスコープを持つ、 ローカルlocal 変数をいうものがありますが、今回は使用しません。
それでは、モンスターを一匹やっつける度に、プレイヤーに対して1ポイント与えるようにしてみましょう。モンスターが死ぬ時ですから、 "Monster: health less or equal 0" イベントをクリックしてAdd actionを選びます。さらに, System -> Add to (Global & local variables のグループにあります) -> Score 値を 1 と設定します。以下のようになったでしょうか。
やっとプレイヤーがスコアを持つことになりました。モンスターをやっつけるたびに1ポイントづつ加算されていきます。しかし!せっかくのスコアを見ることが出来ませんね。テキストオブジェクトを使ってスコアを表示させることにしましょう。