さらにゲーム機能を加える
ここまではひとつのイベントの設定のために詳しく解説をしてきましたが、残りのイベントのひとつひとつに同じように解説していくとなるとチュートリアルがとても長くなってしまいます。ここからはイベント設定の説明はすこし簡略化することにしましょう。 一般的に、コンディションおよびアクションの設定方法は以下の手順の通りだということを覚えておいてください。
1. 新しくイベントを挿入するには空欄をダブルクリック(新しくアクションを挿入するには Add action リンクをクリック。)
2. 新しいイベントのコンディションのためのオブジェクトをダブルクリック(新しいアクションのためのオブジェクトをダブルクリック。)
3. コンディションのリストからひとつ選んでダブルクリック(アクションのリストからひとつ選んでダブルクリック。)
4. パラメーターを要求されたら入力する。
ここからは、新しく作成するイベントの説明は、コンディション(もしくはアクション)、対象のオブジェクト名、コンディション名(もしくはアクション名)、パラメーター(必要な場合)、という順に指定することにします。例えば、前項で作成したイベントは以下のように指定することが出来ます。
コンディション: System (オブジェクト名)-> Every tick (コンディション名)
アクション: Player (オブジェクト名)-> Set angle towards position (アクション名) -> X: Mouse.X, Y: Mouse.Y (パラメーター)
プレイヤーが弾を撃つようにする
ゲームプレイヤーがマウスをクリックしたら弾が発射されるようにしましょう。Playerオブジェクトに対してSpawn an object(オブジェクトをスポーンする) アクションを設定することで、オブジェクトの現在の位置と角度から別のオブジェクトを作成することが出来ます。前に使用した Bullet movement アクションはここでも弾を前に進ませることに使えます。下の手順に従ってイベントを作成しましょう。
コンディション: Mouse -> On click -> Left clicked (デフォルトのままthe default)
アクション:Player -> Spawn another object -> 対象Objectのパラメーターには Bullet オブジェクトを指定します。Layer パラメーターには, 1 を設定します("Main" レイヤーは1ですね。Construct 2 は0から数を数えること、覚えていたでしょうか) Image point パラメーターは0のままにしておきます。.
以下のようなイベントが出来たはずです。
ゲームを実行してみると、弾はプレイヤーの銃の先端からではなく、プレイヤーの中心から発射されるのが分かります。このバグは image point(イメージポイント) というものを銃の先端付近に設置することで解決できます。 (イメージポイントとは、あるイメージ上で別のオブジェクトを生み出すことができる位置のことをいいます)
プレイヤーのアイコンを右クリックして、Edit animations リンクをクリックします。(もしくはプレイヤーを選択して、プロパティーバーのAnimations Editリンクをクリックします)
プレイヤーのイメージエディターが表示されたら “Set origin and image points tool” アイコンをクリックします。
そうすると ”Image points” ダイアログが表示されます:
object origin という点がすでに存在しています。これはオブジェクトの "hotspot" もしくは "pivot point" のことです。この点を軸にオブジェクトは回転するわけです。これとは別に、銃の先端を示すためのイメージポイントを新に加えるために、プラスアイコンをクリックします。 add button. 小さな四角の点が新たに加えられますが、それがイメージポイントです。この状態のまま、プレイヤーの銃口の辺りをクリックすることでイメージポイントの位置を決定・変更できます。
イメージエディターは閉じてください。先ほど設定した Spawn an object アクションをダブルクリックして、Image point パラメーターの値を 1 に変更しましょう(origin は常に最初のイメージポイントで、0です。Construct 2 はゼロから数えるんでしたね。) 編集が完了したイベントはImage point 1に変更されて、以下のようになっているはずです。
ゲームを実行してみましょう。 今度は銃の先端から弾が発射されるようになりました! ただ、弾が当たってもまだ何にも起きませんが、一旦イベントシステムを理解すれば、様々な機能を簡単に素早く実装できるようになる、ということがお分かりになったと思います。
では、弾がモンスターを殺すようにしてみましょう。次のようにイベントを加えます。
コンディション: Bullet -> On collision with another object -> Monster を選びます
アクション: Monster -> Destroy
アクション: Bullet -> Spawn another object -> Explosion, レイヤーは 1 を指定します
アクション: Bullet -> Destroy
爆発効果
ゲームを実行して、モンスターを撃ち落してみましょう。おや、爆発イメージの周りに黒いボーダーが見える状態になってしまいますね。
ひょっとしたらこうなることを予想していて、完成したゲームもそうなってしまうんじゃないか、っと思ってたかもしれませんね。でも 心配いりません、そうはなりません。右下にあるオブジェクトバー、もしくは(レイヤーバーと一緒にタブとしてまとめられている)プロジェクトバーから、Explosion オブジェクトを選んでダブルクリック します。すると左側のプロパティーバーにExplosionオブジェクトのプロパティーが表示されます。下のほうにある Blend mode プロパティーの値をproperty to Additiveに設定します。終わったらまたゲームを実行してみましょう。
今度はうまくいきましたね。いったいどういう仕組みになっているんでしょう? 細かい説明を省くとすると、普通のイメージはレイヤーの 上に重ねた状態で貼り付けられるわけですが、。 Additive効果を設定している場合は、イメージのピクセルは背景のそれぞれのピクセルに足し算されることになるのです。そして、黒のピクセルは値が0なので、背景のピクセルに対して何も足すものがない、つまり黒のボーダーの代わりに背景の絵だけが見える状態になるわけです。さらに、明るい色はより強く表示されますから、爆発の光を表現するのにもってこいなのです。
モンスターをもう少し賢くさせてみよう
今の状態では、モンスターはレイアウトの右端から出て、どこかへ行ってしまいますね。もうちょっと面白い動きをさせてみましょう。 まずはモンスターにランダムな角度で動いてもらいましょう。
コンディション: System -> On start of Layout
アクション: Monster -> Set angle -> random(360)
モンスターたちはまだレイアウトから外に向かって永遠に出ていってしまい、二度と帰ってくることはありません。レイアウトの内側に留まるようにさせましょう。レイアウトから出たら直ぐに方向転換させてプレイヤーの方に動き出すようにします。これは二つの効果があります: まず、モンスターたちは全員レイアウトの内側に留まるようになります、そしてプレイヤーが立ったままでいる、その方向に向かってどんどん襲ってくるようになります。
コンディション: Monster -> Is outside layout
アクション: Monster -> Set angle toward position -> X項目にPlayer.X - Y項目にPlayer.Y.
ゲームを実行します。しばらく見ているとわかりますが、モンスターたちはきちんとレイアウトの内側で動き回りますね。とうていAI(人工知能)などとは言えませんが、このぐらいで十分でしょう。
ところで、モンスターは今のままだと弾が一発当たっただけで即死してしまいます。そこで、弾が5回当たったら死ぬようにしてみましょう。この機能を実装するにはいったいどうすればいいでしょう? もし"Health(ヘルス、健康・命)"カウンターを一つだけ設けることにしたら、一匹のモンスターに弾が5回当たったら瞬間に すべてのモンスターが一斉に死んでしまうことになります。そうではなく、それぞれのモンスターに個別のカウンターを用意してあげる必要があります。このために instance variablesインスタンス変数というものを利用します。