.inesmir 0 ; - VRAMのミラーリングを水平にする。今までと同じ0です。縦スクロールなら垂直ミラーの1じゃないかと思われるかもしれませんが、これでいいのです。 こうすることにより、ネームテーブルの$2000~$23FFと$2800~$2BFFの領域、縦につながる2画面分使用できるようになり、 画面外でネームテーブルを更新することができます。これにより、これから進む先のBG画面を見えない部分で更新することができます。
メインループの流れは、道路描画アドレス計算→道路描画→スプライトとBGの衝突判定→BGスクロール→スプライト描画→コース読み込み→表示ネームテーブル選択→キー取得→スプライトX座標加算、となります。
calcCourse:というラベルがありますが、これ以下の部分は、4回に1度、Road_YH(上位アドレス)とRoad_YL(下位アドレス) から構成される4桁の数字(ネームテーブルにアクセスするためのアドレス)から、32を減算しています。このサンプルは毎回2ドットづつ上にスクロールするので、 BGの8ドット÷2=4ということで4回に一度BG更新処理を行っています。32という数字は、ネームテーブルの横のキャラ数の32です。 それを減算するのは、上方向に更新して行くということです。
桁下がりが発生すると、NameTblNumを更新していますが、NameTblNumが0のときは$2000から、1のときは$2800から更新するようにしています。 ネームテーブルは$2000→$2800→$2000→$2800・・・のように交互に更新されています。
以下の部分でsecという命令を実行していますが、 sbcという命令はキャリーが0だと1多く減算する性質があるので、敢えてキャリーフラグをセットする必要があります。
sec ; sbcの前にキャリーフラグをセット sbc #32 ; 道路のY座標アドレス(下位)に32減算scrollBG:では以下のような記述があります。
cmp #254 ; 254になった? bne sendSprite lda #238 ; 16ドットスキップして238にする sta <Scroll_Y16ドットスキップする理由は、解像度が240であることと、スクロールレジスタが256まであることのギャップが原因です。 これを実行しないと、ずれてしまいます。Yスクロールレジスタの240~255は使用できません。
以下の部分では、画面に表示するネームテーブルをレジスタ$2000に設定しています。 bit1~0が00なら$2000、01なら$2400、10なら$2800、11なら$2C00から表示します。VRAM更新後に毎回実行する必要があります。
; 表示するネームテーブル番号(bit1~0)をセットする lda #%10001000 ldx <NameTblNum bne setNameTblNum ora #2 ; (%10001010)ネームテーブル2番を表示する setNameTblNum: sta $2000isCrash:というサブルーチンで当たり判定を行っています。このサンプルでは、 BG画面更新アドレスから$C0差し引いたアドレスがスプライトの位置です。(X座標は中心部分しか見ていませんが・・・) $C0を差し引いたときに桁下がりが起こるともう片方のネームテーブルをチェックする必要があるので、ちょっとややこしくなっています。 ヒットしたらとりあえずパレットを変えています。
goCourse:というサブルーチンは、Course_Tblというコースデータを読んで、コースの方向(直進、右折、左折)と その方向に進む継続時間を取得しています。そして、右折・左折する場合は道路のX座標Road_Xを加算・減算します。 つまりRoad_Xはオフセットであり、道路1ラインの左端のネームテーブル上のアドレスは、(Road_YH*$100+Road_YL)+Road_Xで表されるということです。
writeCourse:がネームテーブルを更新しているサブルーチンです。1度呼ばれると1ライン更新します。 左の緑の部分→道路の左の路肩→道路→道路の右の路肩→右の緑の部分の順で、出力します。 このとき、方向によって路肩のキャラを変えています。また左折、右折するときは路肩をつなげるために位置をずらしています。
実行すると以下のような画面になり、道路がスクロールして行きます。左右でキャラクタを移動します。 車の絵じゃないので変ですが、でもこれはこれで味があるような気がする。
今回はかなり理解しづらいと思います。私もネームテーブルのミラーがなかなか理解できませんでした。 やはりこのくらいの内容になるとどうしても難しくなってしまいます。
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||