Amigaでアニメーション「woosh」画面をコーディング
(dansalva.to)Amigaでアニメーション「woosh」画面をコーディングする
- Amigaは1985年の発売当時、グラフィックスとサウンドの驚異をもたらした。
- Amigaで多彩な画像を表示するのは簡単だが、ゲームエンジンの文脈では多くの課題がある。
課題1: RAM要件
- 一般的なAmiga 500は512KBの「チップRAM」と512KBの拡張RAMを備えている。
- グラフィックスとサウンドの表示に使えるのはチップRAMだけなので、より価値が高い。
- フルスクリーンのキャラクターグラフィック(CG)は320x240ビットマップで32色を使い、非圧縮の状態で48KBのRAMを占有する。
- アセット圧縮を支援するためZX0圧縮フォーマットを追加し、CGを圧縮すると8KBまで減らせるため収容可能になる。
- レベルアセットの読み込み時には、圧縮されたCGは拡張RAMに読み込まれ、表示直前にチップRAMへ展開される。
- 48KBのチップRAMを新たに確保する代わりに、別の画面メモリ領域を再利用する。
課題2: 「画面分割」効果
- 当初は画面切り替えのために垂直ワイプを検討していた。
- しかし見栄え良くするには、各スキャンラインごとにカラーパレットを調整するグラデーションワイプが必要になる。
- 画面分割効果のほうが実装しやすく、一般の観客にもより格好よく見える。
- Amigaの特別な機能2つが連携して、この効果を可能にしている:
- コプロセッサ(copper)はCPUと並列に動作し、画面上の特定のラインでハードウェアレジスタを変更するよう指示できる。
- 画面メモリは、ハードウェアレジスタで画面ポインタを設定することで、チップRAM内のどこへでも切り替えられる。
課題3: 「モーションライン」
- アニメーション効果を完成させるには、背景で「woosh」するラインが必要だ。
- スプライトを使ってラインを描くのは、スクリーンメモリとは独立して描画・移動できるため良い選択だ。
- Amigaのスプライトは非常に制限が多く、複雑でもある。
スプライトの色
- スプライトはビットプレーンとカラーパレットを共有するため、使う色はできるだけ少なくしたい。
- スプライトは3色だけを使い、CGには28色、背景には1色を残す。
- 異なるスプライトはパレット内の異なる色を使用する。
スプライトグラフィックの再利用
- スプライトグラフィックの先頭4バイトは、スプライトの位置と高さを示す「制御ビット」だ。
- 同じグラフィックを複数の位置に描きたい場合、これは問題になる。
- その代わりに制御ビットだけを持つ8個の偽スプライトを作り、スプライトポインタをこの偽スプライトに設定する。
ビットプレーンがオフのときスプライトは描画されない
- CGが画面上端に到達する前は、画面上端とCG開始位置の間に大きな空白がある。
- この間にビットプレーンが有効になっていると、ゴミデータが画面に描画されてしまう。
- ビットプレーンを無効にすると、スプライトも描画されない。
- 解決策は、ビットプレーンを1枚だけ有効にし、画面ポインタを空データに設定することだ。
結論
- 当初はRAM要件のため、ゲームにCGを含めるべきか確信が持てなかった。
- データ圧縮を実装することで、オーバーヘッドが非常に妥当であると証明された。
- Amigaハードウェアの独特な特徴を活用することは、特に興味深い。
GN⁺の意見:
- この記事は、Amigaコンピュータのグラフィックス処理能力と、ゲーム開発中のメモリ最適化技術をよく示している。
- データ圧縮とハードウェアの特殊機能を活用して、限られた資源の中で印象的な効果を実現する方法を説明している。
- Amigaのようなクラシックコンピュータのハードウェアを理解し活用することは、レトロゲーム開発者やコンピュータ史に関心のある人にとって非常に興味深いテーマだ。
1件のコメント
Hacker Newsのコメント
「Racing the beam」についてのコメント要約:
$dff180を使って画面端の色を設定しており、この技法はインターネットではなく口コミで学んだと述べている。Amiga 500のメモリ構成についてのコメント要約:
Amigaにおける日本式コンソールゲームの可能性についてのコメント要約:
制約の中でコーディングする魅力についてのコメント要約:
Amigaに関する個人的な体験とアニメーション制作手法の共有についてのコメント要約: