プレイヤーごとに異なる乱数を使う
プレイヤーごとに異なる乱数を使うには、g.Game#localRandom
を利用します。
凡例
const randomValue = g.game.localRandom.generate(); // 0 以上 1 未満の乱数を生成。この値は各プレイヤーで異なる
プレイヤー全員に同じ乱数を生成するには g.game.random
を利用してください。
詳細
g.game.localRandom
は、各プレイヤーでシード値が異なる乱数生成器です。すなわち、同じ回数生成しても、プレイヤーごとに異なる値が得られます。
Akashic Engine の乱数生成器には、他に g.game.random
があります。こちらは全プレイヤーが同じシード値を持ちます。 例えば対戦型のゲームで、ステージをランダムに生成する時は、全プレイヤーが同じデータを生成する必要があるので g.game.random
を使います。
これに限らず、ほとんどの状況で乱数生成には g.game.random
を使用してください。 例えば「各プレイヤーの初期ステータスを乱数で決める」ような、一見プレイヤーごとに異なる場合でも、 g.game.random
が適当です。 Akashic Engine のマルチプレイでは「全員のデバイス上で、全プレイヤーの初期ステータスを、同じ順序で生成した乱数で決める」ことによって、状態 (初期ステータス) を共有するからです。
この例外がローカルイベントの処理です。 ローカルイベントの処理中に乱数を生成する場合は、常に g.game.localRandom
を使用してください 。 ローカルイベントは、それを発生させたプレイヤー自身にしか通知されないイベントです。 その処理中に g.game.random
を使ってしまうと以降の乱数の系列がずれてしまい、他プレイヤーと状態が一致しなくなってしまいます。
const localRect = new g.FilledRect({
..., // その他のプロパティ
local: true, // ローカルであることを指定
touchable: true // クリック・タッチ可能
});
scene.append(localRect);
localRect.onPointDown.add(function() {
// 0 以上 100 未満の乱数を得る。
// localRect はローカルエンティティなので、ここで g.game.random は *使ってはならない* 。
const randomWidth = g.game.localRandom.generate() * 100;
// クリック・タッチしたプレイヤーの手元でのみ、localRect の幅を変える。
// 幅はプレイヤーごとに、またクリックする度に異なる値になる。
localRect.width = 30 + randomWidth;
localRect.modified();
});
補足
ランキングモードで動作する場合のニコ生ゲームは、実行方法が通常のマルチプレイと異なるため g.game.random
もプレイヤーごとに異なります。詳細はこちらを参照してください。