Skip to content

更新情報 (〜2024/05/20)

エンジン

音声アセットとして M4A (.m4a) をサポートするように

Akashic Engine v3.12.0 (pdi-browser@2.4.6) 以降、従来の AAC ファイル (.aac) に代えて M4A ファイル (.m4a) を利用できるようになりました。

つまり音声アセットは次のいずれかの組み合わせを利用できます。

  • Ogg Vorbis ファイル (.ogg) と AAC ファイル (.aac)
  • Ogg Vorbis ファイル (.ogg) と M4A ファイル (.m4a)

併せて、周辺ツールが M4A ファイルを処理するようになっています。

  • akashic scan, akashic export コマンドが .m4a ファイルを扱うように
  • complete-audio が .m4a ファイルを生成するように

INFO

M4A ファイルを利用するには、game.json のアセット定義で hint.extensions フィールドを指定する必要があります。 ただしこれは akahsic scan asset コマンドによって自動的に行われるため、通常ゲーム開発者が編集する必要はありません (akashic-cli@2.16.30 以降) 。 hint.extensions の詳細は 設定ファイル » game.json の仕様 » type: "audio" を参照してください。

音声ファイルの一部だけを効果音として使用できるように

Akashic Engine v3.12.0 (pdi-browser@2.4.6) 以降で、音声ファイルの一部だけを効果音の音声アセットとして使用できるようになりました。

game.json のアセット定義で、音声アセットに "offset" プロパティを与えると、指定されたオフセットから "duration" 分だけを再生する音声アセットになります。

以下は、全体で 10 秒 (10000 ミリ秒) として登録されている音声アセットを、「3000 ミリ秒時点から 200 ミリ秒分再生するアセット」にする例です。

json
{
  ...
  "assets": {
    "se1": {
      "type": "audio",
      "path": "audio/se/se1",
      "systemId": "sound",
      "duration": 10000, 
      "duration": 200, 
      "offset": 3000, 
    }
    ...
  }
}
{
  ...
  "assets": {
    "se1": {
      "type": "audio",
      "path": "audio/se/se1",
      "systemId": "sound",
      "duration": 10000, 
      "duration": 200, 
      "offset": 3000, 
    }
    ...
  }
}

これにより、ごく細かい効果音のファイルを一つにまとめることができます。

実装の都合上、現在は効果音 ("systemId": "sound", ループ再生しない音声アセット) でのみ利用できます。 また時間指定の精度の問題のため、この機能は M4A ファイルを使う音声アセット (.m4a と .ogg の音声アセット) でのみ利用することを推奨します。 (.aac と .ogg では再生箇所のずれが大きくなる可能性があります)

WARNING

akashic scan asset コマンドは通常、音声アセットのファイル内容が変化した場合 "duration" を自動で更新します。 しかし "offset" が指定されている場合は "duration" の更新を行わない ので注意してください。

音声をフェードインやクロスフェードできるように

Akashic Engine v3.9.0 で、新しい音声再生方法 g.AudioPlayContext と、フェードインなどを行うユーティリティ g.AudioUtil を追加しました。

次のようなコードでフェードイン再生やクロスフェードを行うことができます。

javascript
const bgm1 = scene.asset.getAudio("/assets/bgm1"); // オーディオアセットを取得
const bgm2 = scene.asset.getAudio("/assets/bgm2");

// 3000ms で音量 0.5 までフェードインして再生
const ctx1 = g.game.audio.create(bgm1); // bgm1 の AudioPlayContext を作成
g.AudioUtil.fadeIn(g.game, ctx1, 3000, 0.5);

...

// 5 秒間で再生中の ctx1 (bgm1) をフェードアウトしながら ctx2 (bgm2) をフェードイン
const ctx2 = g.game.audio.create(bgm2);
g.AudioUtil.crossFade(g.game, ctx2, ctx1, 5000);
const bgm1 = scene.asset.getAudio("/assets/bgm1"); // オーディオアセットを取得
const bgm2 = scene.asset.getAudio("/assets/bgm2");

// 3000ms で音量 0.5 までフェードインして再生
const ctx1 = g.game.audio.create(bgm1); // bgm1 の AudioPlayContext を作成
g.AudioUtil.fadeIn(g.game, ctx1, 3000, 0.5);

...

// 5 秒間で再生中の ctx1 (bgm1) をフェードアウトしながら ctx2 (bgm2) をフェードイン
const ctx2 = g.game.audio.create(bgm2);
g.AudioUtil.crossFade(g.game, ctx2, ctx1, 5000);

特に従来の API では、BGM を再生すると直前まで再生されていた BGM は自動的に停止されていました。 そのためクロスフェード (フェードアウトしながら別の BGM をフェードイン) することはできませんでした。

併せて逆引きリファレンスに項目を追加しました。 g.AudioPlayContext の利用方法や、背景を含めた詳細は以下を参照してください。

マウスの右クリックなどを識別できるように

Akashic Engine v3.16.0 で、 g.PointEvent#button を追加しました。 これは次のいずれかの数値で、ボタンなどの状態変化を表します。

button意味
-1最後のイベント以降、ボタンもタッチ接触も変化していない
(onPointerMove, onPointerMoveCapture のみ)
0マウスの左ボタン、タッチ接触の状態が変化した
1マウスの中ボタンの状態が変化した
2マウスの右ボタンの状態が変化した

例えばマウスの右ボタンが押下された時は、 onPointDown トリガーに通知される g.PointDownEventbutton2 になります。

シーン内の任意の場所を押下した時に、マウスボタンに応じて処理を分けるには、次のようなコードを書くことができます。

javascript
scene.onPointDownCapture.add(ev => {
  switch (ev.button) {
    case 0: // マウス左ボタンまたはタッチの押下
      break;
    case 2: // マウス右ボタンの押下
      break;
    default: // それ以外
      break;
  }
});
scene.onPointDownCapture.add(ev => {
  switch (ev.button) {
    case 0: // マウス左ボタンまたはタッチの押下
      break;
    case 2: // マウス右ボタンの押下
      break;
    default: // それ以外
      break;
  }
});

併せて逆引きリファレンスに項目を追加しました。サンプルコンテンツや仕様の詳細は以下を参照してください。

最大同時タップ数を制限できるように

Akashic Engine v3.9.3 以降において、最大同時タップ数を指定できるようになりました。 game.json に "maxPoints" を指定することで、ゲームコンテンツに通知される最大同時タップ数が制限されるようになります。

json
{
  "fps": 30,
  "width": 1280,
  "height": 720,
  ...
  "maxPoints": 1
}
{
  "fps": 30,
  "width": 1280,
  "height": 720,
  ...
  "maxPoints": 1
}

例えば 1 を指定した場合、何らかの onPointDown の通知から onPoinbtUp の通知までの間に、他の onPointDown 通知は発生しなくなります。 マルチタップを使わないゲームでは、ゲーム内でマルチタップされた時の処理を記述する必要がなくなります。

compositeOperation の値を追加

Akashic Engine v3.16.6 で、 g.E#compositeOperation に指定可能な値を追加しました。 以下を指定できます。

  • "difference": 先に描画された領域との差 (の絶対値) を描画する。
  • "saturation": 先に描画された領域の彩度を上書きする (色相と輝度は維持する) 。
source-over (デフォルト) と difference, saturation の利用イメージ

ただし利用するレンダラーに制限があります。詳細は以下を参照してください。

下のシーンに重ねて描画されるシーンを作成できるように

Akashic Engine v3.14.2 で、 g.Scene 生成時に seethrough オプションを指定できるようになりました。

typescript
const scene = g.Scene({
  game: g.game,
  ...
  seethrough: true
});
const scene = g.Scene({
  game: g.game,
  ...
  seethrough: true
});

seethrough: true のシーンが g.game.pushScene() されると、遷移前のシーンが画面奥側に描かれた状態で描画されます。 (ただし遷移前のシーンの動作は止まります)

「アセットロードが必要なメニュー画面」のようなユースケースを想定した機能です。 詳細は以下を参照してください。

g.game.onUpdate, g.game.asset を追加

Akashic Engine v3.9.2 で g.game.onUdpate を追加しました。 従来の g.Scene#onUpdate と同じもの (毎フレーム通知されるトリガー) ですが、シーンの遷移に関係なく通知を受けることができます。

Akashic Engine v3.17.1 で g.game.asset を追加しました。 こちらは従来の g.Scene#asset と同じ g.AssetAccessor ですが、シーンを参照せずにアセットにアクセスできるよう追加されました。 利用法は 逆引きリファレンス » 読み込んだアセットを取得する を参照してください。

WARNING

実装の都合上、g.game.onUpdateg.game.age の更新後に通知されます。 従来の g.Scene#onUpdate は、同じフレームでも age 更新前に通知されるので、 age を参照する処理では違いに注意してください。

その他の変更・機能追加

  • ゲーム開発者がシーンごとに任意のデータを保持できる領域 g.Scene#vars: any を追加。
  • ナインパッチ描画を行う g.SurfaceUtil.drawNinePatch() を追加。(参考)
  • アセットの ID からパスを逆引きする関数 g.AssetAccessor#pathOf() を追加 (参考)
  • 数値を最大値・最小値の範囲に丸める関数 g.Util.clamp() を追加。(参考)
  • g.Surface 生成時、非整数のサイズ指定をエラーにせず切り上げるように。
  • TypeScript テンプレートの main.ts で export default を利用できるように。
  • スクリプトアセットの定義に preload?: boolean を追加。(参考)
  • g.Scene#requestAssets() で、コールバックでエラーを受け取れるように (参考)
  • g.Storage 関連の不使用コードを削除。

不具合修正

  • require()/import で、拡張子の有無で別スクリプト扱いになる問題を修正。
  • g.game.removeEventFilter()undefined を渡すと全フィルタ削除される問題を修正。
  • g.game.random が 1 を生成する可能性があった問題を修正。
  • ローディングシーン中にゲームが破棄されるとエラーになる問題を修正。
  • スナップショットからの復元時、エントリポイントの引数が渡されない問題を修正。
  • スナップショットからの復元時、 g.game._idx が復元できない問題を修正。
  • リプレイ再生でのシーク時、アセットロード中の時間経過の扱いが誤っていた問題を修正。
  • Chrome で、ゲーム画面のわずかに (1px 未満) 外側をクリックできる問題を修正。
  • HTML 出力時、同じ音声が連続で再生されるとエラーになることがある問題を修正。
  • ペンタブレットによるドラッグ時、意図しない操作が起きる問題を修正。

ツール

M4A (.m4a) に対応

akashic-cli@2.16.33 以降で、M4A ファイル (.m4a) をサポートするようになりました。

  • akashic scan コマンドが .m4a ファイルを音声アセットとして扱うように。
  • akashic export コマンドが .m4a ファイルを出力に含めるように。
  • akashic stat コマンドが .m4a のファイルサイズを考慮するように。

また complete-audio@1.0.0 以降で、デフォルトの出力形式を .ogg と .m4a に変更しました。

sandbox.config.js の設定項目を追加

akashic-sandbox や akashic serve コマンドの設定ファイル sandbox.config.js で以下を指定できるようになりました。

  • 開発者メニューの表示・非表示 (serve, sandbox)
  • 表示オプション (serve のみ)
  • 子ウィンドウのサイズ (serve のみ)
  • 各種警告機能の有効・無効 (serve, sandbox)

sandbox.config.js は、game.json のあるディレクトリに置く設定ファイルで、次のような指定を行うことができます。

js
const config = {
  // 開発者メニューを開いた状態で起動する (serve, sandbox で有効)
  showMenu: true,

  // 表示設定 (serve のみ)
  displayOptions: {
    fitsToScreen: true, // ゲーム画面をウィンドウサイズに合わせる
    backgroundColor: "red", // 背景色
    showsGrid: true, // ゲーム画面にグリッドを表示する
  },

  // 新規ウィンドウ作成時のサイズ (serve のみ)
  windowSize: {
    width: 640,
    height: 480,
  },

  // 警告設定 (sandbox, serve で有効)
  warn: {
    useDate: false, // Date.now() 使用時に警告しないようにする
    useMathRandom: false, // Math.random() 使用時に警告しないようにする
  },
};
module.exports = config;
const config = {
  // 開発者メニューを開いた状態で起動する (serve, sandbox で有効)
  showMenu: true,

  // 表示設定 (serve のみ)
  displayOptions: {
    fitsToScreen: true, // ゲーム画面をウィンドウサイズに合わせる
    backgroundColor: "red", // 背景色
    showsGrid: true, // ゲーム画面にグリッドを表示する
  },

  // 新規ウィンドウ作成時のサイズ (serve のみ)
  windowSize: {
    width: 640,
    height: 480,
  },

  // 警告設定 (sandbox, serve で有効)
  warn: {
    useDate: false, // Date.now() 使用時に警告しないようにする
    useMathRandom: false, // Math.random() 使用時に警告しないようにする
  },
};
module.exports = config;

showMenu はこれまで akashic-sandbox でのみ有効でしたが、akashic serve でも利用できるようになりました。

warn は、 akashic-sandbox や akashic serve の 警告表示を抑止する ことができます。 意図的に Akashic ゲームの原則を無視する場合に、大量の警告が表示されてしまう問題を回避することができます。

その他指定可能なすべての値については、以下を参照してください。

大きなイベントの送信時に警告するように

akashic-cli@2.16.26 以降の akashic serve コマンドで、 g.MessageEvent のエンコード後サイズが 100KiB を超える時、コンソールに警告を表示するようになりました。

特にニコ生ゲーム環境においては、大きすぎるイベントを送信するとその後の通信が不安定になる場合があります。 厳密な基準はありませんが、経験的にわかっている基準値で警告を表示します。

serve でスクリーンショットを保存できるように

akashic-cli@2.16.53 で、akashic serve にゲーム画面のスクリーンショット保存機能を追加しました。 画面右上の Display Options にボタンを追加しています。

akashic serve の Display Options メニュー

EditorConfig に対応

akashic-cli@2.16.0 で、 EditorConfig の設定に従うようになりました。

game.json のあるディレクトリに .editorconfig という名前のファイルがある場合、 akashic scan/install/uninstall はその設定に従って game.json をフォーマットします。これによりインデントサイズや改行コードなどを制御することできます。

併せて akashic init の標準テンプレートに .editorconfig を追加しました。

TypeScript テンプレートのコンパイルオプションを更新

noImplicitOverride: true を追加 (仕様)。

これによりクラスの継承時、基底クラスのプロパティは override をつけないとオーバーライドできなくなりました。 特に g.E を継承して独自のエンティティを作成する場合に、id プロパティなどを意図せず上書きしてエンジンの動作がおかしくなる問題を軽減します。

forceConsistentCasingInFileNames: true を追加 (仕様) 。

import において、ファイル名の大文字小文字が正しいことを強制します。 ファイル名の大文字小文字が区別されない Windows 環境で作成されたゲームが、環境によって正しく動作しない問題を回避します。

その他の更新 (akashic serve)

  • --no-open-browser オプションのエイリアスとして -B を追加。
  • ES2015 以降の構文や機能を利用した場合の警告を廃止。
  • game.json の environment.nicolive.preferredSessionParameter の設定に従うように。
  • developer ツールのイベント送信機能で、ローカルイベントを送信できるように。
  • 子ウィンドウのデフォルトサイズを、ゲーム画面のサイズに応じて決定するように。
  • sandbox.config.js に server.external プロパティを追加。(仕様)
  • 不具合修正: --watch (-w) オプション (コンテンツ変更時にリロード) で、スクリプトアセットの変更が無視される問題を修正。
  • 不具合修正: --watch (-w) オプションで、リロードが二重に発生する問題を修正。
  • 不具合修正: タイミング依存で Join イベントが送信されない場合がある問題を修正。
  • 不具合修正: Akashic Engine v1 系コンテンツを起動できない問題を修正。
  • 不具合修正: canvas の範囲外描画警告が誤って表示されることがある問題を修正。

その他の更新 (akashic export)

  • 出力する .js ファイルの文字コードを UTF-8 に変換するように。
  • 音声アセットのファイル形式が足りない時 (.ogg のみのアセットなど) に警告するように。
  • ゲームに @akashic/akashic-enigne 本体が同梱されている時、エラーにするように。
  • export zip に --nicolive オプションを追加。
  • --nicolive の時、game.json や全体のファイルサイズをチェックして警告するように。
  • --nicolive の時、game.json の supportedModes 指定漏れなどをチェックするように。
  • environment.niconico に代わる environment.nicolive をサポートするように。
  • environment.niconico を暗黙に environment.nicolive に変換して出力するように。
  • --atsumaru オプションを廃止。
  • 内部オプション --resolve-akashic-runtime, --preserve-package-json を追加。
  • 高速化: コンテンツ生成中の不要なファイルコピーを削減。
  • 不具合修正: hint.extensions 指定があるコンテンツで --hash-filename がエラーになる問題を修正。

その他の更新 (akashic scan)

  • 画像ファイルのサイズ取得に失敗した時のエラーメッセージを改善。どのファイルの問題か分かるように。
  • 不具合修正: package.json の main フィールドの拡張子が省略されたライブラリを利用するとエラーになる問題を修正。
  • 不具合修正: ゲームディレクトリ外のディレクトリを参照するシンボリックリンクがあるとエラーになる問題を修正。
  • 不具合修正: globalScripts がホームディレクトリからの相対パスになることがある問題を修正。

その他の更新 (akashic install)

  • @akashic/akashic-engine を akashic install した時、エラーにするように。
  • 不具合修正: Node.js でも動作するライブラリの install 時にエラーになる問題を修正。

その他の更新 (akashic-sandbox)

  • ES2015 以降の構文や機能を利用した場合の警告を廃止。
  • akashic-cli に統合、 akashic sandbox コマンドに。(Webサイトの移行が進行中です。完了後に改めてお知らせします)

その他の更新 (complete-audio)

  • デフォルトの出力先を「入力ファイルと同じディレクトリ」に変更。
    • 従来はコマンドを実行したディレクトリでした。
  • 出力先を指定するオプション -o を追加。
  • --experimental-output-m4a オプションを廃止 (デフォルト動作に) 。
  • M4A の代わりに AAC を出力する --output-aac オプションを追加。
  • 不具合修正: カバー画像つきの MP3 ファイルでエラーになる問題を修正。

ニコ生ゲーム

RPG ツクール MV ニコ生ゲーム化キット・コンバータを公開

RPG ツクール MV のゲームをランキング対応ニコ生ゲームに変換するためのキット、および変換処理を自動化したアプリケーション (コンバータ) を公開しました。

RPG ツクール MV ニコ生ゲーム化コンバータの実行画面

詳細は ニコ生ゲームを作ろう » RPG ツクール MV で作ろう を参照してください。

公開後の更新 (コンバータ)

  • サポート対象外の RPG ツクール MV プラグインも変換できるように
  • アップデート時に 更新内容 が確認できるように
  • バージョン情報追加
  • 不具合修正: 変換エラー時に「RPG ツクール MV プラグインを含めて変換する」チェックボックスが disabled のままになる不具合の修正

公開後の更新 (ランタイム)

  • 「画面の色調変更」機能をサポートできるように
  • ピクチャのボタン化プラグインがマウスホバーに対応できるように
  • フェードイン時に音量の設定も行うように
  • 動的文字列ピクチャ生成プラグイン の Version 1.20.5 を利用できるように
  • ピクチャのボタン化プラグイン の Version 1.14.5 を利用できるように
  • TouchInputGraphics 等のクラスを外部のスクリプトから参照できるように
  • ニコ生ランキングゲームプラグインにタイマー制御するプラグインコマンドを追加
  • ニコ生ランキングゲームプラグインにパラメータ forceNamagameTimer を追加
  • ニコ生ランキングゲームプラグインで全体音量を設定できるように
  • 不具合修正: フォントのstrokeColorの初期値を修正
  • 不具合修正: タイトル画面への遷移時、グローバル変数を初期化し直すように
  • 不具合修正: グローバル変数の循環参照を解消
  • 不具合修正: MAP上で敵にエンカウントできない問題を修正
  • 不具合修正: 戦闘時に敵にステータスアイコンが表示されない問題を修正
  • 不具合修正: 画像の読み込み処理が一度に大量に発生するとゲームが処理落ちしてしまう問題を修正
  • 不具合修正: 敵キャラの色相指定が反映されない問題を修正
  • 不具合修正: 敵選択時に敵が明滅しない問題を修正
  • 不具合修正: 文章のスクロールができない問題を修正
  • 不具合修正: 戦闘画面での攻撃時に味方キャラに武器が無い場合エラーになってしまう問題を修正
  • 不具合修正: タイトル画面や選択肢でゲームが止まってしまうことがある問題を修正
  • 不具合修正: 装備品を変更すると元の装備品が消えてしまう問題を修正
  • 不具合修正: 重なったメニューの背景が透けてしまう問題を修正
  • 不具合修正: バトル画面が正常に動作しない問題を修正
  • 不具合修正: text の maxWidth に応じてフォントサイズを変更するように
  • 不具合修正: 空白文字を設定しても消されて強制左詰めにされていたのを修正
  • 不具合修正: ニコ生ランキングゲームプラグインでスコアを表示するように