渦巻き - Rickisthe1/CoilSnake-m2-basic GitHub Wiki

スワール(Swirls)について

スワールは、戦闘開始時に見られる回転するアニメーションです。それ以外にも、戦闘中のエフェクト(ギーグの「理解不能な攻撃」や「ビームを発射した!」など)としても使用されます。

これらのスワールは、**HDMA(Horizontal Direct Memory Access)**というSNESの特殊機能を利用して描画されており、一般的なタイルやパレットとは異なる仕組みで動作します。以下、その仕組みや制限、カスタマイズ方法について解説します。


スワールの仕組み

HDMAの「ウィンドウ機能」を利用することで、画面を線でクロップするように描画します。この線の長さや位置を毎フレームごとに変更することで、複雑な形状を実現しています。ただし、この技術には以下の制限があります:

  1. 1スキャンラインあたり最大2本の線しか描けない。
  2. 各線の幅は最低2ピクセル以上でなければならない。

スワールのフォルダ構造

スワール関連のフォルダには6種類のアニメーションが含まれています。ただし、このうち実際に戦闘開始時に使用されるのは2種類だけで、残りの4種類は戦闘中のエフェクトとして使われます。

  • 各スワールは以下の要素で構成されています:
    1. 白と黒の2色で描かれた一連の画像
    2. swirls.yml ファイルで定義されるフレーム数と速度

swirls.ymlの構造

swirls.yml は非常にシンプルな構造を持っています。以下は例です:

1:
  frames: 23
  speed: 2

各パラメータの説明

  • frames:
    アニメーションのフレーム数。対応するフォルダ内の画像の枚数と一致させる必要があります。例えば、画像が23枚ある場合は、frames: 23と指定します。フレーム数が画像より少ない場合、アニメーションが途中で切れます。

  • speed:
    各スワールフレームが持続するゲームフレーム数。SNESは60FPSで動作するため、speed: 2の場合は30FPS(60 ÷ 2)、speed: 3の場合は20FPS(60 ÷ 3)の速度になります。


制限事項

スワールをカスタマイズする際、以下の制限を考慮する必要があります:

制限1: 各線の幅は最低2ピクセル以上

例えば、以下のようなアニメーションを作成した場合:

問題のある星形のスワール

CoilSnakeは次のエラーを出力します:

Encountered error while reading frame #0 of swirl #1
Caused by: InvalidArgumentError: Line at (128,111) must be at least 2 pixels wide

この場合、線の幅が1ピクセルしかない部分が原因です。


制限2: 1スキャンラインに2本以上の線を描けない

さらに修正して幅を2ピクセル以上にしたとしても、次のエラーが発生する可能性があります:

Encountered error while reading frame #14 of swirl #1
Caused by: InvalidArgumentError: There are more than two lines on the same row at y=92

Animated GIF of the Boss swirl

この制限により、複雑な形状(例えば星型など)は描画できません。


高度なテクニック(準備中)

HDMAをさらに活用する方法として、以下のような技術があります:

  • 反転(Inverting)
  • 透過(Transparency)
  • 色の利用(Colors)

これらについては、後日詳細を追加予定です。


まとめ

スワールは独自の仕組みで動作しており、SNESのハードウェア制限に従う必要があります。しかし、その制限内で工夫すれば独創的なアニメーションを作成することが可能です。HDMAを理解し、カスタマイズを楽しんでください!