Collision した Actor からデータをもらう

Actor A と Actor B で Collision した場合に、B から A にデータを受け渡すというケースです。以下の 2 つを例にしてみます。

  1. Actor B から A に send する
    • A が B に Collision した時に、 B 側から A にメッセージを送る形でデータを渡します
  2. Actor B の custom variable から取得する
    • A が B に Collision した時に、A が B を参照し、custom variable の値を読み出す形でデータを受け取る

Actor B から A に send する

Actor B

Damage とかとだいたい同じです。

f:id:dany1468:20190711073000p:plain f:id:dany1468:20190711073021p:plain

Send Any Message の CODE

export const PROPS = [
  propCardTargetActor("Target", {
    label: "Send to:"
  })
];

/**
 * @param {GActionMessage} actionMessage
 */
export function onAction(actionMessage) {
  const target = getCardTargetActor("Target", actionMessage);

  if (!target) {
    return;
  }
  
  send(target, "ReceiveAnyMessage", "送りたいデータ");
}

Actor A

単に send あれたイベントを Receive するだけだとデータが取れないので、以下のようなイベントを作成します。

f:id:dany1468:20190711095527p:plain

まず、Receive Any Message CARD です。
もともとの ReceiveMessage CARD の CODE では card.triggeredEvent{} が入っていて、後続の Action に値を渡せません。よって、以下のように onReceiveAnyMessage で渡ってきた値をそのまま渡しています。

/**
 * @return {GEvent|undefined} The event, if one occurred.
 */
export function onCheck() {
  if (card.triggeredEvent !== undefined) {
    const rv = card.triggeredEvent;
    delete card.triggeredEvent;
    return rv;
  }
  else {
    return undefined;
  }
}

export function onReceiveAnyMessage(properties) {
  card.triggeredEvent = properties;
}

export function onResetGame() {
  delete card.triggeredEvent;
}

次に Say Message CARD です。Say Something CARD とほぼ同じなので、受け取ったデータをどう取り出すかだけ。

export function onAction(actionMessage) {
  const receivedData = actionMessage.event;
}

Actor B の custom variable から取得する

Actor A

custom variable は他の actor からも読めるので、それを利用します。

逆にどの actor からも読めてしまいます

一つ目の例と同じように Collision Event と組み合わせた場合の Action 側の CARD の CODE です。

export const PROPS = [
  propCardTargetActor("Target", {
    label: "Receive from:"
  })
];

/**
 * @param {GActionMessage} actionMessage
 */
export function onAction(actionMessage) {
  const target = getCardTargetActor("Target", actionMessage);

  if (!target) {
    return;
  }
  
  const receivedData = getVar('受け取りたいデータの key', target)
}

Actor B

渡すデータをあらかじめ設定しておきたいとします。

GAME START panel で設定するような Action の CARD を用意します。

f:id:dany1468:20190711092434p:plain

export function onAction() {
  setVar('渡したいデータの key', '渡したいデータ');
}

setVar に関しては object も渡せます。
http://gamebuilder.area120.com/setVar.html

props を使って、CARD の properties として setVar に渡す値を設定できるようにしてもよさそうです。