
※途中で戻りたい場合は、ブラウザの「戻る」機能を使ってください。
30行目リストを見てもらえればわかる通り、変数V$に192文字、代入しています。 ![]() 40行目FOR文が2回とMID$関数が3つあり、複雑になっています。 ![]() まず、どの様な事をしているのか、わかるところから見ていきましょう。 VPOKE命令があることで(2箇所)VRAMに何かを書き込んでいます。 また、VPOKE命令のアドレスが、10進数で14336は16進数で&H3800、14512は&H38B0で、2つのアドレスはスプライトパターンジェネレーターテーブル(&H3800〜&H3FFF)の領域になります。 どうやら、この行はスプライトパターンを定義していると思われます。 では、VPOKE命令の書き込む数値に目を向けてみます。 はじめのVPOKEでは、VAL(”&H”+MID$(V$,I*2+1,2))の結果を書き込みます。 30行目で定義されたV$の内容をはじめから2文字ずつ取り上げて、&HをつけてVAL関数で数値化しています。 V$の内容は192文字、0〜95ということで96回2文字ずつ書き込めば、丁度192文字になります。 また、16*16ドットのパターンを書き込むには、32回書き込む事になりますので、3パターン分です。 次のVPOKE命令、VPOKE 14512−(I¥16)*16+I MOD 16,Vは14512から引いたアドレスを書き込んでいるということで、あるアドレスから戻りながら書き込んでいくということなのでしょうか? では、この2つのVPOKE命令の書き込んだ結果(スプライト)を表示させて見ます。 最初は、2つとも実行させた結果(ゲームを走らせて、途中で止めた状態)を表示させてみたいと思います。 ![]() 画面をクリアして、スプライトを上から16ドットおきに表示させて見ます(見当して、0番から10番までとしました)。 ![]() 主人公のバッキーが6パターン表示されました。 ということは、0から5番のスプライトパターンを登録しているようです。 この後も表示させる事になるので、行番号の1番に登録しておきます。 ![]() さて、今度は最初のVPOKE文だけ実行させるとどうなるのでしょうか? リストを書き加えて見ました。 ![]() 緑で囲んだ所が書き込んだところです。 うしろのVPOKE文とNEXTを無効にしてしまう為、前にNEXT文を置き、アポストロフィーをつけて以後をコメントとして無効にしました。 これで、2番目のVPOKE文は実行されず、最初のVPOKE文だけ実行される事になります。 また、プログラムを走らせて(行番号1番を飛ばす為に、RUN 10として実行)、スプライトを表示させて確認する為、RUN 1で行番号1を実行。 ![]() はじめの3パターンしか表示されませんでした。 このことから、2番目のVPOKE文はパターンを左右反転させて登録しているようです。 そう推測した上で、どういうアルゴリズムになっているのかを解析して行きます。 2つのVPOKE文は実際、何処のアドレスにどんな値を書き込んでいるかを表示させて見てみます。 表示結果を画面に収めるために、変数 I の値を0〜20にしてみました。 リストです。 ![]() VPOKE文を二つのPRINT文にしてアドレスと値を表示するようにし、セミコロンで続けて1行で表示できるようにしました。 結果です。 ![]() 1行には左端から最初のVPOKEのアドレス、とその値、2番目のVPOKEのアドレス、とその値の順番で並んでいます。 1キャラクタのスプライトには32回、値を書き込むのでこれでは足りません(表示しているのは、21個の数値)。 そこで、変数 I を21〜42にしてあとの数値、22個を表示してみました(本来なら、あと11個表示できれば良いのですが)。 リストです。 ![]() 結果を表示してみました。 ![]() これで、2つのVPOKEが何処のアドレスに、どんな数値を入れているかがわかります。 次に、この数値をビット列に直し、パターンエディタで実際にドットを打ち込んで見ることにしました。 パターンエディタはMac用のソフト「Pixen」を用いました。 また、数値をビット列で表す(10進数を2進数で表す)は、Macに標準でついてくる「計算機」を使用しました。 「計算機」の画面です。 ![]() 10進数で入力すると、自動的に2進数の状態を表示してくれる為、このビット列をパターンエディタに手打ちで移して行ってみました。 「Pixen」で打ち込みます(見やすい様にグリッドを4*4で設定)。 ![]() スプライトパターンは、アドレスの増加に沿うと、最初のデータは左上の横8ドットに相当し、下側へ8回分になると、8*8のパターンが出来上がります。 その後は同じ様に左下の8*8ドットとなり、つぎは右上の8*8ドット、最後に右下の8*8ドットという順番になります(上図の緑色の枠と赤い文字を参照してください)。 ![]() キャラクタが浮かび上がってきました!! ![]() 2番目まで打ち込みました、続いて右上の3番目に入ります。 ![]() ![]() ![]() 主人公のバッキー(左向き)が出来上がりました。 続いて、2番目のVPOKEを同じ様に打ち込んでみました。 ![]() 左右に入れ替わってしまう結果になってしまいました。 ここで先程表示させてみたアドレスをみてみると、 ![]() 最初のアドレス14512から1ずつ増えていくのですが、17個目で14496になってしまっています。 パターンエディタの絵と照らし合わせてみると、始めのアドレス14512から16小さい14496ということは、丁度8*8ドットのブロック2個分ということで、後の半分が前半分の前(表現がややこしいですが)に数値を代入していく事になります。 40行はプログラムの内容は複雑でしたが、要するにキャラクターパターンを上手く反転させて、同時に登録させる事をしている事がわかりました。 次は、50行に移ります。 |
Copyright(C) 2006. ピコピコテクノロジー All Right Reserved.