NESのゲヌム甚の特殊効果デバむス。 パヌト1

NESのプログラミングに関する䞀連の蚘事があり、そのうちの1぀はHabréでロシア語に翻蚳されおいたす。 ただし、コン゜ヌルの基本的な機胜の抂芁を超えるものはありたせん。コン゜ヌルの䞀般的なアヌキテクチャ、アセンブラヌの基本に぀いお説明し、画面にスプラむトを衚瀺する方法を簡単に説明し、音楜ずマッパヌに぀いお䜕かを述べ、サむクルが終了したす。



私は、他のチュヌトリアルが終了する堎所から、NESのゲヌムのグラフィックスの結論に぀いおの話を続けようずしたす。 ロシア語ず英語の䞡方でこれに関する情報が少ないため、アニメヌション効果を自分でプログラムする方法を芋぀けるこずは非垞に困難です。 しかし、動揺しないでください。ドキュメンテヌションずしお、叀兞的なゲヌムのコヌドを䜿甚するこずができたす。これは、ネットワヌク䞊でROMファむルの圢で簡単に芋぀かりたす。



したがっお、䜕かをプログラムする前に、これらたたはそれらの効果がNESにどのように配眮されおいるかを把握する必芁があり、蚘事ではこれを行う方法に焊点を圓おたす。 「 NESを最倧限に掻甚したゲヌム」ずいうカテゎリには倚くの蚘事がありたす。これらのゲヌムのすべおの䞻な効果がどのように䜜られるかを理解し、効果的に技術的に劣らない他のゲヌムを芋぀けるこずができるツヌルを䜜成しおみたしょう。



免責事項



NESの接頭蟞の鉄の説明や甚語の䜿甚においお、私は間違っおいる可胜性がありたす。 プログラム郚分の説明では、情報はおそらくより正確であり、逆アセンブリおよびデバッグスクリプトによっお怜蚌されたす。 この蚘事で䜿甚されおいるすべおのツヌルぞのリンクは最埌に提䟛されおいたす。 テキストが名前を指定せずに「゚ミュレヌタヌ」を参照する堎合、 Fceuxが暗黙指定されたす。 私の意芋では、特に重芁たたは興味深いのは、感嘆笊で瞬間が匷調されおいるこずです。



NESグラフィックス出力オプションの抂芁



BubaVVから翻蚳されたnesdougの蚘事を読んで、すでにNESのグラフィックプログラミングに関する基本的なこずを知っおいるずしたす。 これに぀いおは詳しく説明したせんが、簡朔か぀単玔に説明するだけです質問が発生した堎合は、この郚分をスキップしお元に戻すこずができたす。



  1. NESビデオプロセッサには4぀の画面ペヌゞおよびそれらを操䜜するいく぀かのモヌドがあり、ほずんどの堎合、2぀のペヌゞが他の2぀のコンテンツを単にコピヌしたすが衚瀺されたタむルずこれらのタむルの属性に関するデヌタを含みたす。 2x2タむルのブロックサむズは、3぀の異なる色でペむントでき、1぀の背景色を䜿甚できたす。
  2. たた、ビデオプロセッサは、耇数の画面間で画像のハヌドりェアスクロヌルを実行できたす。 ぀たり、最初の画面ペヌゞの䞀郚ず2番目の画面ペヌゞの䞀郚を画面に描画できたす。 レンダリングの画面は、1-2-1-2-1-2-2の順序で「ルヌプ」されおいたす。 ビデオプロセッサがいずれかのペヌゞの終わりに達した堎合、次の最初からデヌタを取埗したす。 これは思ったより簡単です。゚ミュレヌタでゲヌムを開き、デバッグりィンドりをオンにしお画面を衚瀺し、その動䜜を芖芚的に確認できたす。

    写真付きのスクロヌルデバむスの解析はこちら 

  3. 画面䞊の画像は、CHRメモリバンクのタむルで描画されたす。CHRメモリバンクには、ある時点で256個のメモリタむルがありたす。 ビデオプロセッサは、スプラむトのレンダリング甚ず背景のレンダリング甚の2぀のバンクを「認識」したす。



    同時に、8x16スプラむトレンダリングモヌドがありたす。このモヌドでは、䞡方のバンクからのデヌタでスプラむトを䞀床に描画できたす。



    このメモリはカヌトリッゞ䞊にあるため、カヌトリッゞの「充填」に応じお、バンクをさたざたな方法で配眮できたす-ROMメモリほずんどの堎合1、2たたは4キロバむト郚分、たたは曞き蟌み可胜なRAMメモリを備えた゜フトりェア亀換バンクデヌタほずんどの堎合、コヌドを䜿甚しお銀行からデヌタをコピヌしたす。
  4. 銀行のタむルは、2ビットカラヌの8x8ピクセルです。 タむル属性の色の2ビットタむルのすべおのピクセルに共通がこれらの2ビットに远加されたす。 結果は、16色のパレットの4ビットカラヌむンデックスです。 ある時点で、ビデオプロセッサで2぀のパレットがアクティブになりたす背景タむルずスプラむト甚。
  5. 背景に加えお、ビデオプロセッサは最倧64個のスプラむトを描画したす。 たた、1行に衚瀺されるスプラむトの数には制限があり、それを超えるず、ビデオプロセッサは描画する時間がないスプラむトをスキップしたす。


NESのこれらの機胜を詳现に分析するこずはしたせん。たずえば、 こちらのレビュヌ蚘事で「噛み砕かれおいたす」。 NESでアニメヌションず゚フェクトを䜜成する䞻な5぀の方法をリストしたした- 画面に曞き蟌むアニメヌション、スクロヌルの䜍眮を倉曎するアニメヌション、CHRバンクの内容を倉曎するアニメヌション、パレットを倉曎するアニメヌション、スプラむトを描画するアニメヌション 。



おそらく、レンダリングのオン/オフ、カラヌチャンネルの明るさの倉曎、アクティブな画面ペヌゞの倉曎、たたは亀互に2぀のアクティブなバンクの倉曎など、ビデオプロセッサのステヌタスビットを倉曎するこずにより、アニメヌションを個別に匷調する䟡倀がありたす。



そしお今、泚意しおください、 NESのすべおのグラフィック効果は、これらの方法の1぀、たたはそれらの組み合わせで行われたす 



以䞋では、各タむプの効果の䟋を分析し、ゲヌムがこの効果たたはその効果を䜜成する方法を決定する方法を説明したす。 しかしその前に、もう少し理論を理解するこずが非垞に重芁です。



コン゜ヌルの䞭倮凊理装眮ずビデオ凊理装眮の同期



ビデオプロセッサは、コン゜ヌルの䞭倮プロセッサの指瀺を䜿甚しお制埡されたすが、それず䞊行しお動䜜したす。 スムヌズなアニメヌションを䜜成するには、ビデオプロセッサがフレヌムのレンダリングでビゞヌでないずきにのみビデオメモリを倉曎する必芁がありたす。そうしないず、ナヌザヌは画面䞊の状態の急激な倉化を眮き換えたす。 ビデオプロセッサの状態の倉曎はメモリぞの曞き蟌みによっお行われるため、これはせいぜい最悪の堎合でも、ナヌザヌは画像の猛烈な「ぎくぎく」動きを芋たす。これにより、画面に画像を描画するラスタヌの䜍眮を制埡する内郚レゞスタヌの情報が倱われたす。 そのため、ビデオメモリでの蚘録は、ビデオプロセッサでバックグラりンドおよびスプラむトレンダリングがオフになっおいる堎合にのみ可胜です。



最新のグラフィックシステムでは、通垞、珟圚のフレヌムの内容を倉曎するこずはできず、ダブルバッファリングを䜿甚したす。メモリの䞍可芖領域に画像を描画し、ビデオカヌドが画面党䜓に衚瀺したす。 叀いビデオプロセッサは、前のフレヌムが描画されおいる間にフレヌム党䜓を時間内に準備するのに十分な速床がありたせんでした。



ビデオプロセッサに指瀺を䞎えるために、プログラムは1぀のフレヌムの終わりから次のフレヌムの始たりたでの非垞に短い時間間隔を持っおいたす これを適切なタむミングで行うために、フレヌムの最埌にあるビデオプロセッサが割り蟌みを生成したす。 プログラムは、この割り蟌みのハンドラヌをむンストヌルする必芁がありたす。 この堎所で、最速で最も最適化されたコヌドが蚘述され、最もトリッキヌなトリックが芋぀かりたす。



ただし、すべおの困難にもかかわらず、倚くのゲヌムは、このハンドラヌフレヌム間だけでなく、フレヌムのレンダリング䞭にもビデオメモリを倉曎しお操䜜を実行したす

したがっお、すべおの効果は、 フレヌム間  フレヌム間で倉曎が行われるずミッドフレヌム1぀のフレヌムのレンダリング䞭に倉曎が行われるにさらに现分化されたす。



この堎合、䞭倮コン゜ヌルずビデオコン゜ヌルコン゜ヌルを同期するためのいく぀かの可胜なオプションが䜿甚されたす。





フレヌムの䞭倮でのCPUずPPU間の同期の䞡方の方法割り蟌み、およびCPUのチェック条件によるに぀いお、興味がある堎合は、コヌド䟋を䜿甚しお別の蚘事で説明したす。メモリの倉曎はフレヌム間でもさらには開発者はそれを十分に高速に行う必芁がありたす、フレヌムのレンダリング䞭でも。

これで、䜕らかの方法で達成できるこずの分析に進むこずができたす。



パレットアニメヌション



むンタヌフレヌム



フレヌム間でパレットを倉曎するこずは、実装が最も簡単な効果の1぀です。 パレットアニメヌションを䜿甚しお実装される効果には、いく぀かの皮類がありたす。



これらの䞭で最も単玔なのは、ある色が別の色に眮き換えられたずきの通垞のちら぀きです。 別の効果は、「滝の波、流砂、火などの「色の波」です。 最埌に、3番目のタむプの効果は、画像の1フレヌムのパレットの色の1぀による匷調衚瀺であり、他の色を消したす。そのため、動く粒子、雚、雪、たたは別の効果を衚瀺できたす。 理論を泚意深く読むず、画面に曞き蟌むこずでアニメヌションず組み合わせない堎合、そのようなアニメヌションは最倧3フレヌムになるず蚈算できたすタむルは2ビットの色に制限され、そのうちの1぀は背景で占められおいたす。 このようなアニメヌションの3぀のタむプはすべお、ゲヌムDuck Tales 2のさたざたなレベルで芋るこずができたす。



ビデオは䞡方向のアニメヌションを瀺しおいたす。

残念ながら、雚の圱響はビデオではほずんど芋えないため、GIFにありたす。







このタむプのアニメヌションの認識は非垞に簡単で、特別なツヌルを必芁ずしたせん。 ゚ミュレヌタでPPU Viewerりィンドりを開き、パレットが倉曎されるかどうかを確認したす。 簡単にするために、雚滎のある「ハむラむト」フレヌムの研究は速床を遅くしたす。



フレヌムの䞭倮ミッドフレヌム



フレヌムの䞭倮でパレットを完党に倉曎するこずは困難ですが、 可胜です。



ゲヌムプロセスのアニメヌションでは、このメ゜ッドは䜿甚されたせんが、フレヌムの静的な郚分ではほずんど䜿甚されたせん。 明らかな効果は、レベルパレットずは異なるパレットでむンタヌフェむスをレンダリングするこずです。







それほど明らかではないのは、グラデヌション効果を䜜成するために色を絶えず倉化させるこずです。



認識方法



゚ミュレヌタを䜿甚するず、フレヌムに線を描画するずきにどのパレットがロヌドされたかを確認できたす。 むンディ・ゞョヌンズず最埌の十字軍のスクリヌンセヌバヌをご芧ください。





むンディ・ゞョヌンズずグラデヌション塗り



ゲヌムはパレット党䜓を切り替えず、1色のみを倉曎するこずに泚意しおください。 そしお、ビヌムがある線から別の線に通過する時間に時間がない堎合。



画面蚘録アニメヌション



むンタヌフレヌム



これは、ビデオプロセッサが描画するタむルの数を倉曎するこずで最も䞀般的な背景アニメヌションであり、1぀のオブゞェクトに察しお垞に1回実行されたす。 このようなアニメヌションを解析するのは面癜くなく、意味がありたせん-ほずんどの通垞のゲヌムアニメヌションはこのように行われたすただし、倚くの堎合、むンタラクティブな郚分、たずえば、胞のカバヌはスプラむトで仕䞊げられたす。 䟋は、 コントラたたはスヌパヌCで爆発するオブゞェクトの衚瀺です。





このゲヌムでは、銃、ドア、たたはゲヌトが爆発するず、論理的な「ブロック」が曎新され、4x4タむルのサむズになりたす。



8x8より小さいタむルの錯芚の䜜成



バトルシティの 蚘事で詳しく説明されおいたす 。 ぀たり、各8x8タむルに぀いお、同じタむプのいく぀かのバリアントが4x4のパヌツが欠萜しお䜜成されたす。゜フトりェアがタむルを眮き換えた結果、ゲヌムが4x4ピクセルタむルを䜿甚しおいるような錯芚を䜜成できたす。



画像



スクロヌルの䜍眮を倉曎するこずず組み合わせお、幅たたは高さが2画面以䞊のレベルを持぀ほがすべおのゲヌムに存圚する叀兞的な画面スクロヌル効果が倧きなレベルで䜜成されたすプレむダヌが芋えるように、事前に画面の非衚瀺郚分で曎新が発生するこずのみを説明したすスクロヌルが新しい領域に到達するたでにすでに描画された郚分。 スクロヌルの䜍眮を倉曎しお䜜成されたアニメヌションのセクションで、スクロヌルのタむプを分析したす。



ミッドフレヌム



フレヌムが終了するたで画面に倉曎を衚瀺しおも意味がありたせん。通垞の人は次のフレヌムが1/24秒になるたで埅぀こずができたす。



スプラむトアニメヌション



むンタヌフレヌム



キャラクタヌアニメヌション 。 実際、基本的な䟋は、スプラむトが必芁なものです-スクリヌンの呚りでスプラむトを動かし、ゲヌムのキャラクタヌを描いお、ゲヌマヌが興味を持぀ようにしたす。



スプラむトでパヌティクルを描画し たり、背景に远加の詳现を远加 したりするこずもできたす 。 背景タむルは8ピクセルで敎列する必芁があり、スプラむトは画面䞊の任意の堎所に描画できたす。さらに、2番目のバンクず別のパレットから描画されたす。これにより、画像の色数の制限が増加したす。



スプラむトの䞍適切な䜿甚もありたす-プロセッサずビデオプロセッサをそれらず同期させるためたずえば、 Sprite Zero HitやSprite Overflow 。



興味深いのは、スプラむトによっお䜜成された゚フェクトず他の゚フェクトを「目で」区別できないこずです。背景をスプラむトずしお、スプラむトを背景ずしお停装し、プレむダヌをだたすのは簡単すぎたす。



゚ミュレヌタヌでは、蚭定でスプラむトず背景レむダヌを無効にできたすが、このモヌドでの再生は非垞に䞍䟿です。そのため、スプラむトを簡単に怜出するために、 luaスクリプトを䜜成したした 。これは、オンにするず再生にあたり干枉せず、同時に画面䞊のスプラむトを明確に匷調したす。





ビデオは少し奇劙に芋えるかもしれたせんが、衚瀺されおいるゲヌムをよく知っおいれば、衚瀺されおいる゚ピ゜ヌドの画面で䜕が起こっおいるかを理解できたす。 これで、ゲヌム内のスプラむト゚フェクトを他のスプラむト゚フェクトから正確に分離し、兞型的な䟋を挙げるこずができたす。



粒子レンダリング



み぀めがずるでの雚のレンダリング。







ゲヌムでは8x16スプラむトを䜿甚しおいるこずがわかりたす8x8たたは8x16のスプラむトのサむズに関係なく、64個のスプラむトを描画できるため、画面に同時に衚瀺されるグラフィックの数の芳点から、このようなスプラむトを䜿甚する方が有利です。 たた、ゲヌムはフレヌムを通しお雚滎を描くこずにも気付くこずができたす。そのため、プレヌダヌには実際の2倍のドロップがあるように思われたす-結局のずころ、ゲヌムはたた、メむンキャラクタヌ、シェル、ボスを描くためにスプラむトを必芁ずしたす。蜂の粒子がたくさん。



フレヌムを介したレンダリングは、小さく動きの速いオブゞェクトに察しおのみ可胜です人間の脳は、それ自䜓が動きの速いオブゞェクトの欠萜フレヌムを衚し、オブゞェクトの䜍眮が補間されるように蚭蚈されおいたす。 それ以倖の堎合、プレヌダヌはオブゞェクトのちら぀きが消えおフレヌム党䜓に衚瀺されるこずに気付くでしょう。



同様の効果は、 GalaxianたたはAddams Familyで星をレンダリングするこずです。







シャドりディスプレむ



Jurassic Parkなどの2.5Dゲヌムでは、オブゞェクトの䞋に圱を衚瀺するためにスプラむトが䜿甚されたす。そのため、プレヌダヌはオブゞェクトの䜍眮の高さを決定できたす。







背景の詳现 -倧きくお高品質の画像が必芁なスクリヌンセヌバヌやカットシヌンでよく䜿甚されたす。











ここでは、コメントは無甚で、スプラッシュフリヌのスクリヌンセヌバヌは恐ろしいものだず思いたす。



バックグラりンドでスプラむトを倉装



デザむナヌの特別なトリック、ゲヌムが「nes向けの最高のグラフィックス」に蚘録されおいるデザむナヌの1぀。 気づくのは難しいですが、スプラむトを怜出するためのスクリプトがあれば難しくありたせん。 ほずんどの堎合、開発者はスプラむトで別の背景レむダヌの錯芚を䜜成したしたコン゜ヌルデバむスに慣れおいない人はゲヌムがコン゜ヌルでは䞍可胜なこずをしおいるず思うため、NESビデオプロセッサはレむダヌをサポヌトしたせん。



䟋





ミツメガトオルでは、トラックず背景の速床を分離するこずに加えお、効果を高めるために、スプラむトは、䜎速で移動する別のレむダヌにあるかのように列を描きたす。





有名なMegaman 2スクリヌンセヌバヌでは、スプラむトは家党䜓が別のレむダヌにあるずいう効果を生み出したすが、そうではありたせん。





Bucky O'Hareには芖差効果独立した移動レむダヌが緑色の線で匷調衚瀺されたすがあり、さらに氎の動きの錯芚のために、固定レむダヌのスプラむトが䞋に远加されたす。





キャッスルノァニア3の最初のレベルの埌の塔の始たりにある倧きな車茪。 車茪は回転しおいるように芋えたすが、動く歯車は車茪の付け根を持぀単䞀のナニットであるかのように駆動するスプラむトです。 さらに、小さなギアもメモリバンクの切り替えによっおアニメヌション化されたす。この効果に぀いおは、 Power Blade 2の䟋で埌述したす。



背景がスプラむトに倉装しおいる堎合にも、逆の効果がありたす技術的には、これはスプラむトを䜿甚したアニメヌションではありたせんが、芋かけ䞊はそうです。 たずえば、ボス党䜓をバックグラりンドで描画できたす。 これは、巚倧なボスを描くには64個のスプラむトでは䞍十分だからです。 この効果は、スクロヌル䜍眮を倉曎するこずにより、効果のグルヌプで考慮されたす。



別に、 スプラむトがバックグラりンドに入り、プレむダヌに芋えないように戻るゲヌムに蚀及したす。



たずえば、 Galaxian 。 このような゚むリアンのトリックの理由-それらをすべおスプラむトでレンダリングするこずは、それらが倚すぎるため機胜したせん。







このテクニックは、 カプコンのゲヌムでむンタラクティブなブロックずの盞互䜜甚を瀺すためによく䜿甚されたす- ダックテむルズ1-2の石の粉砕、 チップアンドデヌルレスキュヌレンゞャヌ1-2の箱、 リトルマヌメむドのシェル。





画面には、 ChipDaleの 2぀の匕き出しがありたす。1぀は背景に描かれ、2぀目はプレヌダヌによっおスロヌされ、スプラむトです。 たた、オブゞェクトパレットの色がわずかに異なるこずにも気付くこずができたす。



プリンスオブペルシャでは、この手法はより高床に䜿甚されおいたす。 それらの瞬間そしおその䞭でのみ、プレむダヌが背景に描かれた「ゲヌト」を通り抜けお2぀の列の間を通過する必芁がある堎合、プレむダヌを芆う背景ず同じスプラむトでキャラクタヌの䞊に同じ列が描かれたす。 したがっお、背景の䞡方の柱はキャラクタヌの埌ろに残りたすが、オブゞェクトの正しい順序の錯芚を維持するために、3番目の柱がキャラクタヌの前に䞀時的に衚瀺されたす。





スプラむトの半透明効果

トランスミッタヌは、ビデオプロセッサでのスプラむトの半透明性をサポヌトしおいないため、開発者はあたりリアルではないこずを䜙儀なくされたしたが、フレヌムを介しおスプラむトを描画するこずで、あらゆる方法で既に知られおいたす。 その結果、すべおのプレむダヌは、キャラクタヌたたはボスが「瞬き」する堎合、珟時点では無敵である可胜性が高いこずを知っおいたした。



半透明/䞍透明な背景効果



しかし、背景の半透明性を瀺すこずは可胜です。 ビデオプロセッサのメモリ内の画面䞊の各スプラむトに察しお、「 背景の埌ろにスプラむトを描画するか 、その前にスプラむトを描画するか 」ずいうフラグが蚭定されたす。 背景タむルのすべおのピクセルが䞍透明な堎合、そのようなスプラむトは背景の背埌で完党に芋えなくなりたす。 背景のピクセルの䞀郚が透明で、他のピクセルが透明でない堎合、背景の埌ろの文字が「透けお芋える」こずになりたす。





半透明の背景の私のお気に入りの䟋は、 ダックテむルズ2の秘密の䞀節です。



フレヌムごずにスロヌダりンで通路を出るず、この方法で半透明性を敎理する問題に気付くこずができたす-「背景の埌ろ/背景の前」のビットが8x8スプラむト党䜓に蚭定されたす-したがっお、Scroogeは、通路に郚分的に立っおいる堎所のトヌチのために短時間倱敗し、郚分的に既にそれから出おきたした。



この問題の解決策は、スプラむトを郚分的に異なるスプラむトで閉じるこずです。これにより、ディスプレむの粟床を最倧1ピクセルたで高めるこずができたす。 この効果はMystery World DizzyたたはNightshadeで詳现に芳察できたす。





キャラクタヌの䞀郚は柱の埌ろに、䞀郚は壁の前に衚瀺されたす。 この効果に぀いおは、 ここで詳しく説明したす。



猫フェリックスバッグ効果

最埌に、 Felix the Catゲヌムの汚いトリック。 Felixがバッグの䞭にどのように隠れおいるかを確認しおください。スプラむトの䞋郚はバッグの䞭にスムヌズに消え、䞊郚は背景の前に衚瀺されたたたです。







スプラむトを衚瀺するためのスクリプトを有効にするず、次の図が衚瀺されたす。







巊偎に3぀の奇劙なスプラむトがありたすスクリプトがスプラむトを少し間違っお衚瀺するこずに泚意する䟡倀がありたす-ゲヌムは8x16スプラむトを䜿甚し、スクリプトは8x8ピクセルのみを描画するため、実際には互いに垂盎に連続したす。



もう少し詳しく芋るず、぀たり、スクリプトでスプラむトの座暙のロギングを有効にするず、これは3぀のスプラむトではなく、各行で24、8であるこずがわかりたす。 これは、ビデオプロセッサが1行で描画できる最倧倀です。 圌は巊から右にこれを行うので、画面の䞍可芖領域に8぀のスプラむトが描画された埌、バッグにrawいおいるフェリックスのスプラむトはこれらの線に描画する時間がありたせん。 このようなcな方法で、ダむビングの境界より䞋にあるスプラむトのその郚分のマスキングが行われたした。



このマスキング効果を備えたゲヌムはそれほど倚くありたせんマスキング効果のための過剰なスプラむトの䜿甚セクションを参照しおください 。



たた、右偎には、ゲヌム゚ンゞンのスクロヌルの欠陥を隠す実線を䜜成する倚数のスプラむトがありたす。 スクロヌルの効果を分析するずきは、蚘事の次の郚分でこの「効果」に戻りたす。



CHRバンクの内容を倉曎するこずによるアニメヌション



たず、CHR-ROMずCHR-RAMのカヌトリッゞ䞡方のタむプのメモリが存圚するカヌトリッゞもありたすの違いを考慮するこずは、もう少し詳しく説明する䟡倀がありたす。 プログラマヌにずっおの違いは、CHR-ROMを䜿甚するず、メモリバンク党䜓をすばやく切り替えるこずができるこずです。 さたざたなマッパヌの「バンク」のサむズは異なりたす-1、2、4キロバむト。 これにより、バンクの共通郚分を持ち、切り替え可胜にするこずができたす。 切り替えは、マッパヌぞのいく぀かのコマンドによっお実行され、フレヌムごずに数回の速床で実行できたす。



CHR-RAMを搭茉したカヌトリッゞでは、PPUアドレス空間のメモリに必芁なバむト数を盎接曞き蟌むために「切り替え」が必芁ですプログラムの堎合、特定のCPUアドレスに曞き蟌むこずにより。 ぀たり、1぀のビデオメモリタむル党䜓を倉曎するには、16個の曞き蟌みコマンドが必芁です。



ここでは、異なるタむプのメモリの違いずアプリケヌションをより詳现に研究できたす 。 䞡方のタむプのメモリでアニメヌション効果が可胜ですが、いく぀かの違いがありたす。



フレヌム間アニメヌション



バンクを切り替えお背景アニメヌションを倉曎する効果。最も簡単な方法は、アニメヌション甚に耇数のCHR-ROMバンク党䜓を遞択し、フレヌムごずに切り替えるこずです。マッパヌが小さなバンクをサポヌトする堎合、倚くの堎合、タむルの共通郚分を䜜成し、必芁なバンクの数を節玄するために切り替え可胜にしたす。



このようなアニメヌションの䟋ずしおは、Power Blade 2 レベルの工堎の機械オブゞェクト、





アニメヌションメカニズム





、バンクごずの個別のアニメヌションフレヌムバンクスむッチの䞋半分がありたす。

TLP

などの任意のタむル゚ディタヌを䜿甚しお、CHR-ROMバンクの内容を調べるこずができたす。これにより、ゲヌムによっお切り替えられた銀行のサむズを決定するこずもできたす。



CHR-RAMのアニメヌションでは、タむルをメモリに盎接曞き蟌む必芁があり、静的に远跡するのがより困難です。デヌタを圧瞮圢匏で保存したり、その堎で手続き的に生成するこずもできたす。したがっお、このような効果を远跡するために、さらに2぀のスクリプトを䜜成したした。



そのうちの1぀は、フレヌムごずにCHR-RAMの゚ントリ数をカりントしお、ゲヌムがアニメヌション化するタむルの数を把握したす。別の方法では、CHR-RAMのコンテンツのすべおの異なるバヌゞョンを別々のファむルにダンプできたす。ゲヌムを開始し、適切な堎所を通過しお、スクリプトの結果を調べるだけです。このセクションのゲヌムの研究結果はすべお、これらのスクリプトを䜿甚しお取埗されたした。



CHR-RAMアニメヌションを䜿甚する最も「極端な」ゲヌムの1぀はBattletoadsです。

たず、CHR-RAMコンテンツの倉曎を䜿甚しおキャラクタヌをアニメヌトしたす぀たり各ヒキガ゚ルに぀き1぀のフレヌムのみがメモリに保存され、垞に曎新されたす。この効果により、メモリバンクにより倚くのデヌタを保存できたす。







スクリプトを実行しお、フレヌムごずに転送されたバむト数をカりントしたす。このスクリプトはMesen゚ミュレヌタ甚に曞かれおいたす。これは、luaからビデオプロセッサの必芁なむベントを远跡できる唯䞀のスクリプトだからです。





ご芧のずおり、第2レベルでは、ゲヌムは1フレヌムあたり最倧256バむトを転送したす。さらに、ヒキガ゚ルは偶数フレヌムでアニメヌション化され、背景は奇数フレヌムでアニメヌション化されたすスクロヌルするずき、ゲヌムは匕き続き画面曎新を実行する必芁があり、2番目のプレヌダヌのアニメヌションず同様にPPUにも蚘録されたす。



背景アニメヌションに぀いおは、このセクションの埌半で説明したす。これは、フレヌム間アニメヌションだけでなく、ミッドフレヌムアニメヌションでもありたす。開発者は1぀のフレヌムでそれほど倚くのデヌタを転送し、残りを静かに転送しお、画面レンダリングの開始時にいく぀かの行のレンダリングをオフにする時間がないためです緑のゟヌンメモリ CHRの手続き䞊の倉曎







の䟋RAMはGun Smokeの 2x2タむルブロックの鏡像です。CadEditorレベル゚ディタヌでメモリの内容の「前」ず「埌」のオプションを確認できたす。







この単玔な手法により、ゲヌム芁玠の数をほが2倍に増やすこずができたす。レベルの経過䞭にPPUの内容を芋るず、PPUの動䜜が遅いこずがわかりたす。メモリバンク党䜓のミラヌリングには数秒かかりたす。



プレむダヌがちら぀きに気付かないように、ゲヌムは、キャラクタヌが非察称オブゞェクトのない長い荒れ地を歩いおいるずきにこれを行いたす。したがっお、ゲヌムで長い空の廊䞋に沿っお移動する必芁がある堎合黒が最適です-メモリバンクを静かに切り替えたりロヌドしたりするために、これが必芁になる可胜性が高いです。 NES時代の「远加の負荷のない巚倧なシヌムレスな䞖界」のこのような倉圢。



より詳现には、スクロヌル効果ず組み合わせお達成されるバンクを切り替えるこずで最も矎しいアニメヌション効果を分析する䟡倀がありたすCHR-ROMずCHR-RAMの䞡方で可胜- 芖差シミュレヌションメむンずは異なる速床で移動する別のレむダヌ。



この効果が存圚する堎合、ゲヌムは自動的に「nesで最高のグラフィックゲヌム」の評䟡に分類されたす。



ある皋床の経隓がある堎合は、芖芚的に定矩するこずができたす-独立したレむダヌは、ルヌプされた数個のアニメヌションブロックのみで構成されたす。しかし、信頌性のために、前述のdump_animated_chr.luaスクリプトを実行する䟡倀がありたす。これは、芖差がこの方法で行われるずいう事実ず間違われないようにするためです芖差を実装する別の方法がありたす。



この方法でレむダヌを䜜成する特城的な䟋は、ルヌプされた「タむル匵り」のアニメヌション背景、および「垂盎芖差」たたは「りィンドりの背埌の芖差」の可胜性です。



ゲヌムの䟋





オヘアはバッキヌです。窓の芖差は、別のレむダヌの錯芚です。





バトルトヌド。垂盎芖差-井戞の壁は近くにあるため、埌壁よりも速く動きたす。





み぀めがずる。壁はプラットフォヌムから分離されおいたす。





Mashinesマむクロ。ポヌル「チェッカヌ」-氎平および垂盎芖差が同時にありたす。



これらの矎しい効果をより詳现に分析したす。



ここだスクリプトビデオのすべおsdamplennyeフレヌムを取り、PNGピクチャずしおそれらをレンダリングしたすCadEditor゚ディタに぀いおは。䜜業結果







次に、ImageMagicのコマンドを䜿甚しおフレヌムを接着したす。



convert -delay 1x24 -loop 0 *.png animation.gif
      
      





このGIFが刀明したす Bucky O'Hareの堎合 







画像の右䞋をよく芋るず、アニメヌションでは4぀のタむルが16の異なるバンクで䜿甚され「クリヌプ」し、互いに流れ蟌む、バンク自䜓がゲヌムの他の堎所で䜿甚され、これらの4タむルのみが特別に予玄されおいるこずがわかりたす各銀行で。



同様に、井戞の戊闘ヒキガ゚ルでは、32フレヌムの壁ブロックのアニメヌションが垂盎芖差の効果に䜿甚されるず蚈算できたす。これは、アニメヌション1ブロック4x4タむルあたり6キロバむトのデヌタです







CHR-ROMBuck Toadsずは異なり、CHR-ROMBucksずは異なり、CHR-RAMを䜿甚する堎合、銀行党䜓を割り圓おる必芁も、他の銀行の堎所を事前に慎重に蚈画する必芁もないこずがわかりたす。 ただし、この料金はより耇雑なコヌドであり、銀行党䜓をアニメヌション化するこずはできたせん。



芖差の効果を孊習する別の方法は、アニメヌション化されたブロックを他のブロックずスムヌズに぀なぎ合わない堎所に配眮するこずにより、錯芚を砎壊するこずです。 たずえば、 CadEditor゚ディタヌでりェルを䜿甚しおレベルを開き、「ブロックむンゞケヌタヌ」を远加したす。







倉曎したレベルを゚ミュレヌタヌにロヌドし、結果を確認したす。







これで、この効果のデバむスは完党に明確になり、おそらく次の蚘事のいずれかでコヌド内でそれを再珟しようずするでしょう。



もう1぀の「効果」は、ゲヌム開始盎埌のゞュラシックパヌクを瀺しおいたす。 フレヌムごずに行のいく぀かのバンクで矎しいアニメヌションを蚘録し、むンタラクティブ性なしでスクロヌルするだけです。 開発者に察するresみからそれを実蚌する぀もりはありたせん。圌らはゲヌムの開始時にデモ゚フェクトに倢䞭になり、矎しい゚ンディングの䜙地がなかったため、倚くのプレむダヌはこれに倱望したず思いたす。



ミッドフレヌムアニメヌション



フレヌムの䞭倮でバンクを切り替えるず、描画に䜿甚できるタむルの数を増やすこずができたす。 結局、フレヌムの䞊郚は叀いバンクからブロックで描画され、倉曎されず、䞋郚は別のバンクのタむルを䜿甚したす



これの明らかな䜿い方は、ある銀行ずのむンタヌフェヌスず別の銀行ずのゲヌム画面をレンダリングするこずです。 画面の䞀郚を遞択するこずもできたすメむン郚分から氎平方向に分離した方が良い。 ティヌン゚むゞミュヌタントニンゞャタヌトルズ3には、これらの䞡方の効果がありたす。ビヌチの背景は1぀の銀行のタむル、ビヌチは他の銀行のタむルで描かれ、カメの顔ずの矎しいむンタヌフェヌスは3番目です。







より技術的な効果は、 1぀の倧きな矎しい絵を描くように銀行を切り替えるこずです。 䟋はロボコップ3です。







銀行切り替えのカバヌ画面のその他の䟋に぀いおは、Shiruの蚘事を参照しおください。



゚ミュレヌタヌの[デバッグ] - > [名前テヌブルビュヌアヌ]りィンドりを調べるだけで、効果を監芖できたす。このりィンドりでは、タむルセットの1぀だけが衚瀺されたす。



スクロヌル䜍眮を倉曎するこずによるアニメヌション



最埌に、最埌のグルヌプの゚フェクトは、おそらく最も興味深いものであり、他の゚フェクトず完党に組み合わされおいたす。 これらの効果に぀いおは、PPUの状態を倉曎する効果ずずもに別の蚘事を取り䞊げたす。



その䞭の䟋の数は、調査の結果に䟝存したす。



蚘事のスクリプトを䜿甚しお、他のゲヌムの効果を調べ、矎しく珍しい効果を持぀ゲヌムの䟋を投げるこずができたすできれば、 このリストにただ茉っおいないこずが望たしい。そのデバむスを芋぀けたす。



䜿甚枈みツヌル



Fceuxぱミュレヌタヌです。開発者の゜ヌスコヌドの最新バヌゞョンからアセンブリを取埗する必芁がありたす。公開バヌゞョンは長い間曎新されおおらず、デバッグに必芁なlua関数の䞀郚が欠けおいたす。

render_sprites_numbers.lua -fceuxが画面䞊のスプラむトタむルの数、およびその䜍眮ず衚瀺フラグを芖芚的に衚瀺するためのスクリプト。



dump_animated_chr.lua-ビデオプロセッサの䞀意のCHRバンクの内容をファむルに保存しお、アニメヌションの構成方法を分析するfceuxのスクリプト。



Mesenは、グラフィック効果のデバッグに最適な゚ミュレヌタヌであり、fceuxに実装できないスクリプトが蚘述されおいたす。

mesen_chrRamWriteCounter.lua-ゲヌムがビデオプロセッサメモリの内容を倉曎し、フレヌム間およびフレヌム䞭にそのような倉曎の数をカりントする行を衚瀺するためのmesenのスクリプト。



mesen_makeScreensEveryFrame.lua-各フレヌムのスクリヌンショットを保存するためのmesenのスクリプト。gifアニメヌションの䜜成に䜿甚されたす。



CadEditorはナニバヌサルNESゲヌムレベル゚ディタヌであり、珟圚、118のゲヌムに察しお1172の異なるレベルを衚瀺するための構成が含たれおいたすリストは定期的に展開されたす。



Script-ExportAllChrsToPng.cs-CESEditorが NES゚ミュレヌタヌが行うように、PPUメモリずパレットの内容を含むバむナリファむルからタむルむメヌゞを構築するためのスクリプト。



All Articles