Skip to content

ローカルイベントからグローバルに通知する

ローカルイベントの処理を行った結果として、グローバル (マルチプレイの全プレイヤー) に通知するには g.game.raiseEvent() を利用します。

凡例

javascript
// raiseEvent()で全プレイヤーに難易度を通知
g.game.raiseEvent(new g.MessageEvent({ level: "easy" }));
// raiseEvent()で全プレイヤーに難易度を通知
g.game.raiseEvent(new g.MessageEvent({ level: "easy" }));

詳細

ローカルイベントの処理中に、グローバル (マルチプレイの全プレイヤー) に通知したい時に g.game.raiseEvent() 利用します。

INFO

ローカルイベントは、そのイベントを発生させたプレイヤーにだけ通知されるイベントです。 特に、 touchable なローカルエンティティをクリック・タッチした場合に発生します。

参考: 逆引きリファレンス » ローカルエンティティを使う

この関数は、特にゲーム開発者が自由に使える汎用のイベント g.MessageEvent と組み合わせて利用します。 g.game.raiseEvent()g.MessageEvent を与えると、マルチプレイの全プレイヤーのデバイス上で g.Scene#onMessage のハンドラが呼び出されます。

WARNING

raiseEvent() は、ローカル処理 (ローカルイベントの処理と、それに起因して発生した処理) の中 でのみ 利用してください。 ローカル処理でないコードから呼び出すと、全員のデバイスから全員に向けてイベントを送ることになり、輻輳・重複します。

利用例

下記のコードでは、放送者にのみ表示した難易度選択ボタンが押下され、一定時間経過した時に g.game.raiseEvent() で選択された難易度を全体に通知します。

javascript
let difficultyLevel = "normal";

function main(param) {
  const scene = new g.Scene({ game: g.game });

  let firstJoinedPlayerId = null;
  let remainingTime = 10;
  let intervalId;
  let labelGroup;

  g.game.onJoin.addOnce(function (ev) {
    firstJoinedPlayerId = ev.player.id;
  });

  scene.onLoad.add(function() {
    // 難易度のラベル作成
    const easyLabel = createDifficultyLabel(scene, "easy", 0, 0);
    const normalLabel = createDifficultyLabel(scene, "normal", 0, 30);
    const hardLabel = createDifficultyLabel(scene, "hard", 0, 60);

    labelGroup = new g.E({ scene: scene, hidden: true });
    labelGroup.append(easyLabel);
    labelGroup.append(normalLabel);
    labelGroup.append(hardLabel);
    scene.append(labelGroup);

    const timerLabel = new g.Label({
      scene: scene,
      text: `開始まで ${remainingTime} 秒`,
      font: font,
      y: g.game.height - 50
    });
    intervalId = scene.setInterval(function() {
      remainingTime--;
      if (remainingTime >= 0) {
        timerLabel.text = `開始まで ${remainingTime} 秒`;
        timerLabel.invalidate();
      }
    }, 1000);
    scene.append(timerLabel);
  });

  scene.onMessage.add(function (ev) {
    if (ev.data.level) {
      // 難易度の値を受け取る
      console.log(ev.data.level);
    }
  });

  scene.onUpdate.add(function (ev) {
    if (g.game.selfId === firstJoinedPlayerId) {
      if (!labelGroup.visible()) {
        labelGroup.show(); // 最初に join したプレイヤーのみ難易度のラベルを表示
      }

      if (remainingTime < 0 && !intervalId.destroyed()) {
        scene.clearInterval(intervalId);
        // 残り時間が 0 となった時、現在の難易度を raiseEvent() でブロードキャスト
        g.game.raiseEvent(new g.MessageEvent({ level: difficultyLevel }));
        ...
      }
    }
  });
  g.game.pushScene(scene);
}

function createDifficultyLabel(scene, text, x, y) {
	const label = new g.Label({
        ... // 必要プロパティ
    });
    label.onPointDown.add(function (ev) {
        difficultyLevel = label.text;
    });
    return label;
}
let difficultyLevel = "normal";

function main(param) {
  const scene = new g.Scene({ game: g.game });

  let firstJoinedPlayerId = null;
  let remainingTime = 10;
  let intervalId;
  let labelGroup;

  g.game.onJoin.addOnce(function (ev) {
    firstJoinedPlayerId = ev.player.id;
  });

  scene.onLoad.add(function() {
    // 難易度のラベル作成
    const easyLabel = createDifficultyLabel(scene, "easy", 0, 0);
    const normalLabel = createDifficultyLabel(scene, "normal", 0, 30);
    const hardLabel = createDifficultyLabel(scene, "hard", 0, 60);

    labelGroup = new g.E({ scene: scene, hidden: true });
    labelGroup.append(easyLabel);
    labelGroup.append(normalLabel);
    labelGroup.append(hardLabel);
    scene.append(labelGroup);

    const timerLabel = new g.Label({
      scene: scene,
      text: `開始まで ${remainingTime} 秒`,
      font: font,
      y: g.game.height - 50
    });
    intervalId = scene.setInterval(function() {
      remainingTime--;
      if (remainingTime >= 0) {
        timerLabel.text = `開始まで ${remainingTime} 秒`;
        timerLabel.invalidate();
      }
    }, 1000);
    scene.append(timerLabel);
  });

  scene.onMessage.add(function (ev) {
    if (ev.data.level) {
      // 難易度の値を受け取る
      console.log(ev.data.level);
    }
  });

  scene.onUpdate.add(function (ev) {
    if (g.game.selfId === firstJoinedPlayerId) {
      if (!labelGroup.visible()) {
        labelGroup.show(); // 最初に join したプレイヤーのみ難易度のラベルを表示
      }

      if (remainingTime < 0 && !intervalId.destroyed()) {
        scene.clearInterval(intervalId);
        // 残り時間が 0 となった時、現在の難易度を raiseEvent() でブロードキャスト
        g.game.raiseEvent(new g.MessageEvent({ level: difficultyLevel }));
        ...
      }
    }
  });
  g.game.pushScene(scene);
}

function createDifficultyLabel(scene, text, x, y) {
	const label = new g.Label({
        ... // 必要プロパティ
    });
    label.onPointDown.add(function (ev) {
        difficultyLevel = label.text;
    });
    return label;
}