ローカルイベントからグローバルに通知する
ローカルイベントの処理を行った結果として、グローバル (マルチプレイの全プレイヤー) に通知するには g.game.raiseEvent()
を利用します。
凡例
javascript
// 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;
}