0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【個人開発】ブラウザで動く!質量変動・マルチロック搭載のフライトアクションプロトタイプを作ってみた

0
Posted at

はじめに

ブラウザ上でサクサク動く、フライトアクションゲームのプロトタイプ「ZMF Flight Prototype」を開発しました!

専用アプリのインストールは不要で、PCでもスマホ(仮想ジョイスティック対応)でもブラウザからすぐに遊べます。機体の「質量(慣性)」を切り替えながら、マルチロックで敵を殲滅する爽快感をぜひ体験してみてください。

image.png

👉 実際に遊んでみる(公開URL)
(※画面をクリック/タップしてAudioを初期化するとゲームが開始します)

主な機能と特徴

1. 質量変動型ABCモデル(モード切替)

機体の特性をいつでも切り替えられるシステムを搭載しています。モードによって質量(Mass)と空気抵抗(Drag)の物理パラメータが変化し、操作感が劇的に変わります。

  • 軽量 (Active) [A]: 慣性が残らず、機敏な方向転換が可能。
  • 標準 (Balance) [B]: 操作性と慣性のバランスが取れた標準状態。
  • 重装 (Cooling) [C]: 質量が大きく、どっしりとした慣性が残る。

2. 爽快なアクションシステム

  • マルチロックレーザー: ボタン長押しで敵を複数ロックオン。離すと比例航法(後述)によるホーミングレーザーが一斉に発射されます。
  • ゼロシフト: 入力方向へ瞬時にワープする高速移動。残像エフェクトとともに敵の攻撃を回避できます。
  • ダッシュ: 加速度と最高速を引き上げ、一気に間合いを詰めることができます。

3. モバイル・PC両対応のコントロール

PC(キーボード操作)だけでなく、スマートフォンでのタッチ操作にも対応しています。画面左側の仮想ジョイスティックと、右側の各種アクションボタンで快適に操作可能です。


技術スタック・実装の工夫点

今回はフレームワークやゲームエンジン(Unityなど)は一切使用せず、HTML / CSS / Vanilla JavaScriptのみで構築しています。

  • 描画: HTML5 Canvas (requestAnimationFrame を用いた描画ループ)
  • 音声: Web Audio API(リアルタイム波形合成)
  • 物理演算: 自前実装(速度Verlet積分など)

特にこだわった技術的なポイントを紹介します。

① ObjectPool(固定長プール)によるゼロアロケーション実装

弾幕やパーティクルなど、頻繁に生成・破棄されるオブジェクトに対して new でのメモリ確保を毎回行うと、ガベージコレクション(GC)が発生し、画面のカクつき(GCスパイク)の原因になります。
これを防ぐため、初期化時に必要な数のオブジェクトを事前に配列に確保し、それらを使い回す「固定長プール(Zero-Allocation)」の概念を実装しました。

class ObjectPool {
    constructor(createFn, size) {
        this.pool = Array.from({ length: size }, createFn);
    }
    get() {
        // 非アクティブなオブジェクトを探して再利用
        const item = this.pool.find(i => !i.active);
        if (item) item.active = true;
        return item;
    }
    forEachActive(callback) {
        for (let i = 0; i < this.pool.length; i++) {
            if (this.pool[i].active) callback(this.pool[i]);
        }
    }
}

② 比例航法 (Proportional Navigation) によるホーミングレーザー

マルチロック後に放たれるホーミングレーザーの軌道計算には、実際のミサイルなどでも使われる「比例航法(Pro-Nav)」の簡略版を取り入れています。
単純に「ターゲットの方向を向く」のではなく、自機・ターゲットの相対速度ベクトルを計算し、未来位置へ向かってスムーズかつ鋭く追尾する軌道を描くように調整しました。さらに、過去の座標履歴を Float32Array で保持し、滑らかな軌跡(尻尾)を描画しています。

③ ジャーク(加加速度)を利用した視覚エフェクト

機体の移動には加速度(Acceleration)をベースにした速度Verlet積分を用いていますが、さらにその微分である「ジャーク(Jerk:加加速度)」を計算しています。
急な方向転換やダッシュ、被弾時など、機体に急激な力が加わった(ジャークが一定値を超えた)瞬間に、背景の星のスクロール速度を上げたり、画面全体にスピード線(視覚ノイズ)を走らせることで、ゲームの「手触り」や「疾走感」を演出しています。

④ Web Audio APIによるBGM・SEのリアルタイム合成

音声ファイル(mp3やwav)は一切読み込まず、すべてブラウザの AudioContext を使ってリアルタイムに音を合成(プロシージャル生成)しています。

  • BGM: OscillatorNode とLFOを組み合わせたアンビエントパッドに、ランダムなペンタトニックスケールを奏でるアルペジエーターを実装。
  • SE: ドップラー効果を模したゼロシフト音や、ノイズとフィルターを組み合わせた爆発音などをコードベースで生成。

おわりに

Webブラウザだけでどこまで「ゲームらしい手触り」と「気持ちのいい操作感」を表現できるか、という研究開発(R&D)を兼ねて作成したプロトタイプです。

ぜひ実際にリンクから遊んでみていただき、操作感や「こういう武器が欲しい!」などのご意見・フィードバックをいただけると嬉しいです!

👉 ZMF Flight Prototype で遊ぶ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?