概要
同じオブジェクトから「this.メッセージする()」コマンドを使った時に、処理を振り分ける方法です。
説明
例えば、プレイヤーが攻撃した時、攻撃された時それぞれに「青色のスライム」にメッセージするプログラムが用意されているとします。
//プレイヤーの中身
rule.こうげきするとき(async function() ){
this.メッセージする('青色のスライム')
}
rule.こうげきされたとき(async function(item) ){
this.メッセージする('青色のスライム')
}
//青色のスライムの中身
rule.メッセージされたとき(async function(item) ){
this.はなす('攻撃された?攻撃した?') //どちらからメッセージされたか判断つかない
}
この場合、プレイヤーが攻撃する時、攻撃された時、それぞれから青色のスライムがメッセージを受け取りますが「メッセージをうけとったとき」トリガーが発火した後、どちらから来たメッセージか判断がつきません。
実はitemという引数を使えばなんとかなります。
この場合は、2つの方法をご紹介します。
<プレイヤー側で変数を用意して判定する方法>
//プレイヤーの中身
rule.つくられたとき(async function() ){
//省略
this.myState = "" // myState変数を用意
}
rule.こうげきするとき(async function() ){
this.myState = "攻撃した" // myState変数に「攻撃した」と入れる
this.メッセージする('青色のスライム')
}
rule.こうげきされたとき(async function(item) ){
this.myState = "攻撃された" // myState変数に「攻撃された」と入れる
this.メッセージする('青色のスライム')
}
//青色のスライムの中身
rule.メッセージされたとき(async function(item) ){
if (item.myState === "攻撃した"){ //変数の中身で判定する
this.はなす('攻撃した')
} else {
this.はなす('攻撃された')
}
}
プレイヤーの「つくられたとき」に「myState」という変数を作っておきます。
そして「こうげきするとき」と「こうげきされたとき」のそれぞれでメッセージする直前に「myState」に違う値を入れておきます。(上の例では"攻撃した"と"攻撃された"を入れてます)
すると、青色のスライムの「メッセージされたとき」の引数「item」がプレイヤー(メッセージ送信元)になっているので、「item.myState」で変数の中身を取り出し、判定に使用する流れになります。
もちろん、プレイヤー以外のオブジェクト間でメッセージを渡し合う場合も同じことができます。
<behaviorで判定する方法>
今回の場合は「攻撃したかどうか」を判定できれば良いので、プレイヤーの状態(behavior)を利用することもできます。
//青色のスライムの中身
rule.メッセージされたとき(async function(item) ){
if (item.behavior === "attack"){ //攻撃中は"attack"が入る
this.はなす('攻撃した')
} else {
this.はなす('攻撃された')
}
}
ちなみに、behaviorには以下が定義されているようです。(2020/7/7時点)
引用元:GitHub
- null // 無状態 (デフォルトではEventは発火されません)[deprecated]
- init // スキン適用時にアニメーションが未定義だった場合のみ使用される(状態ではない)
- idle // 立ち状態
- walk // 歩き状態
- attack // 攻撃状態
- undefined // 被撃状態[deprecated]
- dead // 死亡状態
コメント
最新を表示する
NG表示方式
NGID一覧