Akashic Engine 更新情報

  • 2021 年 10-12 月

更新情報 (〜2021/12/24)

GUI ライブラリ AimGui を公開

Akashic Engine 用のシンプルな GUI ライブラリ AimGui を公開しました。

ラベル、ボタン、ラジオボタン、チェックボックス、スライダー、テキストボックスなどに加え、 リサイズ可能なウィンドウ、モーダルウィンドウなどを手軽に作成することができます。 たとえば次のような UI を、

AimGui サンプル

以下のコードで実現できます。

const guiE = new aimgui.GuiE({
  scene,
  width: g.game.width,
  height: g.game.height,
  font
});

scene.append(guiE);

// GUIで操作するデータ。
const gameSetting = {
  volume: 0.5
};

// GUIの配置と応答の実装。
guiE.run = gui => {
  gui
    .window("Debug Tool") // ウインドウを配置。
    .position(16, 16) // 初期位置の指定。
    .size(240, 240) // 初期サイズの指定。
    .show(gui => {
      // 表示。
      // ラベルの表示。
      gui.label("サウンドテスト");
      // ボリュームを変更するスライダー。
      gui.slider("ボリューム", gameSetting, "volume", 0, 1);
      // 音声を再生するボタン。
      if (gui.button("再生")) {
        scene.asset
          .getAudio("/audio/se")
          .play()
          .changeVolume(gameSetting.volume);
      }
    });
};

詳細な利用方法は以下を参照してください:

SVG ファイルをアセットとして利用できるように (実験的機能追加)

Akashic Engine v3.2.0 以降では、新たに SVG ファイルを画像アセットとして利用できます。 SVG ファイルを利用することで、PNG ファイルではぼやけてしまう画像の拡大描画を行うことができます。 また今まで Akashic Engine で表現することが難しかった円や曲線などを手軽に描画することが可能になります。

以下は、 画面をドラッグするとそのサイズの円を置く コンテンツです。

SVG ファイルを利用するには、ゲームの image/ フォルダまたは assets/ フォルダに拡張子 .svg のファイルを置き、 akashic scan asset を実行します。 すると他のアセット同様 game.json に登録されます。

"circle": {
  "type": "vector-image",
  "width": 100,
  "height": 100,
  "path": "image/circle.svg"
}

SVG ファイルを使うベクタ画像アセットは、そのままでは g.Sprite などに利用できません。 createSurface() でサーフェス (g.Surface) に変換 (ラスタライズ) する必要があります。

var asset = scene.asset.getVectorImage("image/circle.svg");
var surface = asset.createSurface(200, 200); // SVG 画像を 200x200 のサーフェスにラスタライズ

if (!surface) {
  // ! SVG が利用できない場合のフォールバック対応
}

var sprite = new g.Surface({
  scene: scene,
  src: surface // g.Sprite のソース画像として利用
});

ゲーム開発者自身が生成した g.Surface はエンジンによるリソース開放処理が行われません。 描画用メモリの枯渇を防ぐためにも、適切なタイミングで g.Surface を開放してください。 また、現時点では上の例のように createSurface()null を返す状況を考慮する必要があります (ブラウザ環境以外での実行時に失敗することがあるため。"ranking" 形式以外のニコ生ゲームにも当てはまります) 。 詳細は逆引きリファレンスの SVG ファイルを画像アセットとして利用する を参照してください。

マルチプレイへの途中参加時などの "早送り" 処理を短縮できるように

Akashic Engine は、ゲームプレイ中に行われた全操作を原則全プレイヤーに共有します。 この動作によって、細かな通信を意識することなく手軽にマルチプレイゲームを作成することが可能です (参考: Akashic におけるマルチプレイ)。

ただしこの動作には「長時間起動されるゲームに弱い」という弱点があります。 プレイ中のゲームに途中から参加する場合、まず「それまでに行われた全操作」を早送りで実行して、ゲームの最新状態に追いつかなくてはならないためです。 一度の起動でメインゲーム部分を繰り返し遊ぶなど、長時間起動されるゲームでは、この早送りの時間が長くなります。

Akashic Engine v3.2.2 以降 では、この早送り時間を短縮するために スナップショット 機能が追加されています。 一プレイ内で繰り返し遊ぶメインゲーム部分がちょうど終わった時などに、 区切りのいいタイミングで g.game.requestSaveSnapshot() を呼び出してスナップショットを保存することができます。

g.game.requestSaveSnapshot(function() {
  // その時のゲームの実行状態を表す "スナップショット"
  var snapshot = {
    highscore: g.game.vars.highscore // 例: そのプレイ中に繰り返し遊んだ中で最も高かったスコア情報
  };
  return snapshot;
});

保存されたスナップショットは、必要に応じて自動的に取得され、ゲーム起動時に与えられます。 ゲーム開発者はスナップショットが与えられた時に、保存時のゲーム状態を再現してください。

function main(param) {
  if (param.snapshot) {
    // 過去に保存したスナップショットが与えられたので、そこから保存時の状態 (シーンなど) を作る
  } else {
    // スナップショットが与えられていないので従来どおりの起動。起動時のシーンなどを作る。
  }
}

併せて akashic-cli@2.14.14 以降では、スナップショットの動作を確認するための機能が追加されています。 詳細はチュートリアルの 早送り時間を短縮する を参照してください。

serve の Playback ツール

akashic init で Git リポジトリからテンプレートを取得できるように

akashic init コマンドでは、-t オプションで利用するテンプレートを指定できます。 テンプレートの一覧は akashic init -l で確認することができます。

akashic-cli@2.11.5 以降では、これに加えて任意の Github のリポジトリの内容をテンプレートとして利用できます (git コマンドがインストールされている必要があります)。 以下は https://github.com/akashic-contents/niconicSnake の内容を取得する利用例です。

akashic init -t github:akashic-contents/niconicSnake

-t オプションに github:<owner>/<repository> と指定することによって、 http://github.com/<owner>/<repository> のリポジトリをそのまま取得します。 自作のテンプレートを Github で公開している場合などに利用できます。 また、 ghe:<owner>/<repository> で GitHub Enterprise のリポジトリの内容を取得することも可能です (@akashic/akashic-cli@2.12.0 以降)。

なおこの機能では任意の Github リポジトリを指定できるため、Akashic コンテンツでないものや、最悪の場合悪意のあるスクリプトなども取得する恐れがあります。 そのため自作のテンプレートを置いたリポジトリや信頼できるリポジトリのみ使うようにしてください。

関連 PR:

主な不具合修正

game.json の environment.nicolive の一部の指定が無視されていた問題を修正

ニコ生ゲームの設定を記述するプロパティ environment.nicolive のうち、 preferredSessionParameters の値が無視されていました。 この値は現在のところ、ランキングモードの制限時間を指定する以下のプロパティでのみ利用されています。

environment.nicolive.preferredSessionParameters.totalTimeLimit;

この設定が無視され、常にデフォルトの制限時間で起動されていました。 この不具合は、2021/11/30 に修正済みです。

npm@7.13.0 以前の npm で、 akashic-cli のインストールに失敗する不具合の修正

v7.13.0 以前の npm において、 v2.12.0 以前の akashic-cli のインストールに失敗する問題があります。

この不具合は、 akashic-cli@2.12.1 で修正済みです。

akashic export html で誤った警告が表示される不具合の修正

akashic-cli@2.13.1 以前のバージョンで akashic export html --atsumaru を実行した時、「Akashic Engine v3 is in beta」などの警告が誤って表示されます。 これは内部の仕様変更に起因するもので、出力される zip ファイルに問題はありません。

この不具合は、 akashic-cli@2.14.0 で修正済みです。

akashic init の生成するテンプレートの isAtsumaru 変数の値が誤っている不具合の修正

akashic-cli@2.12.0 以前の akashic init で、以下のテンプレートに含まれるコードが誤っていました。

  • typescript-shin-ichiba-ranking
  • javascript-shin-ichiba-ranking

このテンプレートの main.js 中の変数 param.isAtsumaru は、ゲーム実行時の環境がゲームアツマールかどうかを表すものです。 ゲームアツマールのマルチプレイで起動された時、この値が誤って偽になっていました。

この不具合は、 akashic-cli@2.12.1 で修正済みです。

シーンをまたいで BGM を再生した場合 BGM が止まってしまうことがある不具合の修正

以下のような手順で Akashic コンテンツを実行させると、 (4) の後に BGM の再生が止まってしまう問題がありました。

  1. music のオーディオアセット(BGM)である A をロードするシーンに遷移する
  2. A を 再生する
  3. A をロードしないシーンに遷移する
  4. A をロードするシーンに遷移する

Akashic Engine において music のアセットは、シーンが変わっても他の music が再生されるまで再生され続けます。 そのため上の手順では (2) 以降ずっと再生され続けるべきですが、 (4) の後に再生が止まっていました。

この不具合は、 akashic-engine@3.2.1 で修正済みです。

その他不具合の修正

  • リプレイ再生時、無駄なティック取得を行う場合がある問題を修正
  • akashic-cli-serve で「Save playlog」ボタン(旧「今までのプレイ情報を保存」ボタン)を押した時ゲーム進行が止まる不具合の修正
  • akashic-cli-serve で --debug-playlog を指定するとゲームが動かない問題を修正
  • akashic-cli-serve で --debug-playlog に絶対パスを指定できなかった問題を修正