Skip to content

ランキングゲーム

ランキングゲーム (ランキング対応ニコ生ゲーム) は、一人プレイのミニゲームを放送者・視聴者がそれぞれで遊び、その得点を競う形式のニコ生ゲームです。

得点と残り時間を表示している典型的なランキングゲーム『泥棒バスター』

ランキングゲームは、シングルプレイの通常の Akashic ゲームです。 ただしゲームは 一定時間で終了され、終了時の得点が自動的に集計・結果発表されます

この性質から、ランキングゲームは次の条件を満たす必要があります。

  • supportedModes を指定し、ランキングゲームであることを宣言する
  • ゲーム内で「得点」にあたる数値を特別な変数に代入する
  • ファイルサイズなどの制限に従う
  • game.json で希望ゲーム時間を申告する (オプション)
  • ゲーム内で実際のゲーム時間を受け取る (オプション)

以下、このページではこれらの詳細を説明します。

ランキングゲームテンプレート

実際にランキングゲームを作成する場合、Akashic Engine の開発ツール akashic init コマンドが提供する ランキングゲームテンプレート が利用できます。

このテンプレートを使うと、上述の supportedModes の設定など、ランキングゲームに必要な最低限の作業が済んだ状態のゲームが生成されます。 後述するセッションパラメータの受け取りなど煩雑な作業を避けられるため、テンプレートの利用を推奨します。

詳細は ランキングゲームテンプレート を参照してください。

ゲーム自体は、Akashic Engine 入門 » シングルプレイのゲーム作成 を参考に作成してください。

INFO

ランキングゲームテンプレートを使って、実際にゲームを作成するチュートリアル ランキングゲームを作ろう も併せて参照してください。

要求仕様

ランキング対応ニコ生ゲームは、以下の条件を満たす Akashic ゲームです。

supportedModes の指定

ランキングゲームは、 game.json の environment.nicolive.supportedModes の値に ["ranking"] を指定している必要があります。

json
{
  "environment": {
    "nicolive": {
      "supportedModes": ["ranking"]
    }
  }
}

スコアの代入

ランキングゲームは、ゲーム内でのスコアを g.game.vars.gameState.score に代入する必要があります。

ゲーム開始時に一度だけ初期化しておき、

javascript
g.game.vars.gameState = { score: 0 };

スコアが変化するたびに更新してください。

javascript
// スコアを 100 点にする例
g.game.vars.gameState.score = 100;
javascript
// スコアを 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 秒としています。

json
{
  // ... その他の記述 ...

  "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 を起動します。

sh
akashic sandbox .

TIP

以下のスクリーンショットでは、ランキング対応ゲームのサンプル block-shooter を起動しています。 このコンテンツは、 こちら から zip ファイルをダウンロードすることができます。

任意の Web ブラウザから http://localhost:3000/game にアクセスすると、以下のスクリーンショットのようにゲーム画面が表示されます

akashic-sandbox起動時

画面の右上の歯車アイコンをクリックするとディベロッパーツールが表示されます。 Niconico タブをクリックすると、下記のような画面(v0.13.54 時点のもの)が表示されます。

niconicoタブ

「ランキングモードで参照される値」でゲーム中の g.game.vars.gameState の次のプロパティを確認できます。

  • スコア (score)
  • プレイ閾値 (playThreshold)
  • クリア閾値 (clearThreshold)

「セッションパラメータを送る」にチェックを入れることによって、下記の画面から mode や totalTimeLimit 等のゲームに送られるセッションパラメータの値を設定することができます。(実際にそれらの値を送るには、ページをリロードする必要があります。)

セッションパラメータ

mode で「ランキング(ranking)」を選択することで、akashic sandbox は次のように動作します。

  • totalTimeLimit (制限時間) がゲーム開始時に送られます。また、この値を指定することができます。
    • ただしこの値は、あくまで akashic sandbox 上でのデバッグのためのもので、ニコニコ生放送で実際に起動された時の値は保証されません。
  • 制限時間までの残り時間がカウントされます。
  • 「制限時間経過後にゲームを停止」にチェックを入れていれば、残り時間が 0 になった時にゲームの実行が停止されます。

投稿

作成したゲームを実際にニコニコ生放送上で遊ぶには、ニコ生ゲームを投稿しよう を参照してください。