ランキングゲーム
ランキングゲーム (ランキング対応ニコ生ゲーム) は、一人プレイのミニゲームを放送者・視聴者がそれぞれで遊び、その得点を競う形式のニコ生ゲームです。
ランキングゲームは、シングルプレイの通常の Akashic ゲームです。 ただしゲームは 一定時間で終了され、終了時の得点が自動的に集計・結果発表されます 。
この性質から、ランキングゲームは次の条件を満たす必要があります。
supportedModes
を指定し、ランキングゲームであることを宣言する- ゲーム内で「得点」にあたる数値を特別な変数に代入する
- ファイルサイズなどの制限に従う
- game.json で希望ゲーム時間を申告する (オプション)
- ゲーム内で実際のゲーム時間を受け取る (オプション)
以下、このページではこれらの詳細を説明します。
ランキングゲームテンプレート
実際にランキングゲームを作成する場合、Akashic Engine の開発ツール akashic init
コマンドが提供する ランキングゲームテンプレート が利用できます。
このテンプレートを使うと、上述の supportedModes
の設定など、ランキングゲームに必要な最低限の作業が済んだ状態のゲームが生成されます。 後述するセッションパラメータの受け取りなど煩雑な作業を避けられるため、テンプレートの利用を推奨します。
詳細は ランキングゲームテンプレート を参照してください。
ゲーム自体は、Akashic Engine 入門 » シングルプレイのゲーム作成 を参考に作成してください。
INFO
ランキングゲームテンプレートを使って、実際にゲームを作成するチュートリアル ランキングゲームを作ろう も併せて参照してください。
要求仕様
ランキング対応ニコ生ゲームは、以下の条件を満たす Akashic ゲームです。
supportedModes の指定
ランキングゲームは、 game.json の environment.nicolive.supportedModes
の値に ["ranking"]
を指定している必要があります。
{
"environment": {
"nicolive": {
"supportedModes": ["ranking"]
}
}
}
スコアの代入
ランキングゲームは、ゲーム内でのスコアを g.game.vars.gameState.score
に代入する必要があります。
ゲーム開始時に一度だけ初期化しておき、
g.game.vars.gameState = { score: 0 };
スコアが変化するたびに更新してください。
// スコアを 100 点にする例
g.game.vars.gameState.score = 100;
// スコアを 10 点加算する例
g.game.vars.gameState.score += 10;
値は 0 以上の整数である必要があります。 上限は今のところありませんが、現実的に表示が崩れてしまうので、10 万未満 (5 桁以内) を推奨します。
IMPORTANT
スコアは、ゲーム中も常に g.game.vars.gameState.score
に代入してください。
つまり「スコアを中間変数に保持しておいて、最後に g.game.vars.gameState.score
に代入する」というような処理にはしないでください。 というのも、通信遅延などで起動が遅れた場合などでは、最悪スコアの代入が間に合わずにゲームが終了されてしまう可能性があるためです。 途中までプレイできていたのに 0 点扱いになってしまうと、プレイヤーからは不具合に見える動作になってしまいます。
TIP
g.game.vars
は、Akashic Engine が「ゲーム開発者が自由に使える領域」として提供している値で、初期値は空オブジェクト {}
です。 ニコ生ゲームのランキングゲームでは、この一部をスコアを入れる変数として特別扱いしています。
ゲームの開始時に gameState
プロパティを初期化する必要があるのはこのためです。
解像度・FPS・サイズの制限
次の条件を満たす必要があります。
- 画面解像度: 1280x720 以下 (16:9 を推奨)
- FPS: 1 以上 60 以下 (30 または 60 を推奨)
- zip圧縮前の合計サイズ: 30MB 以下
- game.jsonのサイズ: 100KB 以下
固有の機能と動作
制限時間の申告
ランキングゲームは起動後一定時間で終了されます。 ゲームからは、この時間 (ゲームの制限時間) の希望を申告することができます。 game.json の environment.nicolive.preferredSessionParameters.totalTimeLimit
に秒数を指定してください。
次の例では、希望制限時間を 30 秒としています。
{
// ... その他の記述 ...
"environment": {
"nicolive": {
"supportedModes": ["ranking"],
"preferredSessionParameters": {
"totalTimeLimit": 30
}
}
}
}
totalTimeLimit
には 20 以上 200 以下の整数を指定できます。 指定されなかった場合、適当なデフォルト値が使われます (現在は 80 秒程度になります)。
INFO
後方互換性のため、 environment.nicolive
がなく environment.niconico
がある場合、そちらが参照されます。
制限時間の参照
ランキングゲームの実際の制限時間は、起動時に決定されます。 この「実際の制限時間」はゲーム開始時に受信できる特別な g.MessageEvent
から取得できます。詳細は セッションパラメータ を参照してください。
TIP
akashic init
が提供するランキングゲームテンプレートには、セッションパラメータから制限時間を取得するコードが含まれています。 そのため ゲーム開発者がセッションパラメータを自力で取り扱う必要は通常ありません 。詳細は ランキングゲームテンプレート を参照してください。
共通乱数シード
ランキングゲームでは、g.game.random
の生成する乱数がプレイヤー間で一致しません 。 これはランキングゲームが、放送者・各視聴者の手元で個別に実行されるシングルプレイのゲームであるためです。 お互いのプレイが独立しているため、乱数も一致しません。
クイズの出題順や、パズルゲームの初期配置など、ゲームによってはプレイヤー間で共通の乱数が使いたい場合があります。 セッションパラメータには、この目的で利用できる「プレイヤー間で共通の乱数シード」が含まれています。 詳細は セッションパラメータ を参照してください。
TIP
akashic init
が提供するランキングゲームテンプレートには、この共通乱数シードを使った「共通乱数生成器」が最初から実装されています。 そのため ゲーム開発者がセッションパラメータを自力で取り扱う必要は通常ありません 。詳細は ランキングゲームテンプレート を参照してください。
動作確認
akashic sandbox コマンドを用いることで、スコアが正しく設定されているかなどを確認することができます。
ランキング対応ゲームのディレクトリ内で akashic sandbox を起動します。
akashic sandbox .
TIP
以下のスクリーンショットでは、ランキング対応ゲームのサンプル block-shooter を起動しています。 このコンテンツは、 こちら から zip ファイルをダウンロードすることができます。
任意の Web ブラウザから http://localhost:3000/game
にアクセスすると、以下のスクリーンショットのようにゲーム画面が表示されます
画面の右上の歯車アイコンをクリックするとディベロッパーツールが表示されます。 Niconico タブをクリックすると、下記のような画面(v0.13.54 時点のもの)が表示されます。
「ランキングモードで参照される値」でゲーム中の g.game.vars.gameState
の次のプロパティを確認できます。
- スコア (
score
) - プレイ閾値 (
playThreshold
) - クリア閾値 (
clearThreshold
)
「セッションパラメータを送る」にチェックを入れることによって、下記の画面から mode や totalTimeLimit 等のゲームに送られるセッションパラメータの値を設定することができます。(実際にそれらの値を送るには、ページをリロードする必要があります。)
mode で「ランキング(ranking)」を選択することで、akashic sandbox は次のように動作します。
totalTimeLimit
(制限時間) がゲーム開始時に送られます。また、この値を指定することができます。- ただしこの値は、あくまで akashic sandbox 上でのデバッグのためのもので、ニコニコ生放送で実際に起動された時の値は保証されません。
- 制限時間までの残り時間がカウントされます。
- 「制限時間経過後にゲームを停止」にチェックを入れていれば、残り時間が 0 になった時にゲームの実行が停止されます。
投稿
作成したゲームを実際にニコニコ生放送上で遊ぶには、ニコ生ゲームを投稿しよう を参照してください。