[ ICE-MAN(アイスマン) その5 ]

※途中で戻りたい場合は、ブラウザの「戻る」機能を使ってください。



70行目



70行からの解析です。

まずはリストを見てみます。




まず始めにDEF USR命令が出てきました。

これは、USR関数が呼び出すマシン語のルーチンの実行開始アドレスを定義する命令です。

そして、このUSR関数が呼び出すアドレスは342(156h)であり、「キーボードバッファのクリア」となります。


つぎはVPOKE 6915,0で、先程にも出てきたように、スプライトアトリビュート・テーブルの設定のスプライト面0の色コード(スプライトパターンのビットが1である部分の色)を0に指定しています。


CLS命令で(タイトル画面)をクリアして、FOR NEXT命令で0〜11回分M$(ブロック2行分)を続けて(;が後ろにある)表示します。


VPOKE 6911,104はアドレス6911(1AFFh)に104(68h)を代入しています。

アドレス1AFFhはパターン名称テーブル(&H1800〜&H1AFF)で、画面の1キャラクタが1バイトに対応して、ここに書き込むことで、画面上にキャラクタを表示させる事が出来ます。

この場合だと、アドレス6911(1AFFh)は画面の右下(一番最後のアドレス)を指し、ここに104(68hでキャラクタでは”h”)を書き込んでいます。

ちなみにキャラクタを変えていますので、”h”はブロックの右下のキャラクタになっています。

確認のために表示しておきます。



そして、このVPOKE 6911,104を取り除いて実行するとどうなるか試してみました。

実行結果です。



一番右下に1キャラクタ分かけているのがわかります。

また、VPOKE 6911,104を書き込んで実行してみます。

実行結果です。



見事、一番右下が埋まっています。


次はPRINT文でE$を使い、エスケープシーケンスを使っています。

E$に続く文字は、” +”(空白とプラスでそれぞれのキャラクタ番号は32と43)となっています。

1文字目はY座標(32−32)0を意味し、2文字目はX座標(43−32)11を意味します。

つまり、以下に続くUSING+文字列” STAGE ## ”をX座標11、Y座標0に表示します。

あと”##”は変数Tに対応していて、ステージ数を表しています。

また、変数Tは60行で1を代入しています。


次はPLAY文で、ステージ開始に流れるメロディーを流します。


K=0で金塊の数を表す変数Kをゼロクリアします。


次はステージ開始のアイスマン(バッキー)の位置を指定する為に、文字列からステージ数に応じてデータを拾い、それをASC関数で文字を数値化して変数XとYにそれぞれ代入するようになっています。

MID$の文字列が、それぞれ10文字ずつありますので、ステージ数は10までだと思われます。


80行目



80行を表示します。




80行は解説を見ると、
  • ステージデータの展開と表示
  • そのステージでの金塊の数設定
  • アイスマンの方向など設定
  • USR関数呼び出し→キーバッファクリア
となっています。


まずは、「ステージデータの展開と表示」です。

これはFOR文を使い、I とJを使って二重のループを作っています。

外側のループ I は、0〜49で50回、内側のループJは0〜2で3回となっています。

まず外側のFOR文の次は、変数Vに220行のDATA文から読み込まれたT$の文字列を先頭から1文字読み込んだものをASC関数で数値化してから48を引いたものを代入します。

次に内側のFOR文が始まり、LOCATE文でX座標とY座標を変数 I とJを使って指定しています。

次は、先程の変数Vの剰余を求め、変数Wに代入します。

その変数Wを使ってA$(W)と表し、10行で指定したA$の内容(2×2のキャラクタ)を先程のLOCATE文で指定した座標に表示します。

次のK=K−(W=3)ですが、これはW=3(表示するキャラクタが金塊)だと−1となるので、K=K−(−1)となり、K=K+1の意味(変数Kは先程70行で0クリアしています)になります。

ここで、「そのステージでの金塊の数設定」を行っている事がわかりました。

次は変数Vを4で割りその整数部分を変数Vに代入しています。

その後はNEXT J,I とあり、二つのループを閉じています。

つまり内側のループは2×2個分のキャラクタを3つずつ表示して抜けるようになっています。

外側のループは50回なので、3×50=150この2×2のキャラクターを表示している事になります。

T$の1文字が2×2のキャラクタを3つ表示するシステムになっていることを知って、データの圧縮化を見事に実現しています。


二重ループの後は、変数H(アイスマンの向き)に1を入れ、変数M(アイスマンがいる位置のマップキャラ識別用キャラクターコード)には32を入れ、変数C(アイスマンの表示切り替え用→アニメーション効果用)には0を入れています。

ここで、「アイスマンの方向など設定」を行っています。


最後にU=USR(0)でキーボードバッファのクリアをしています。

ここで「USR関数呼び出し→キーバッファクリア」を行っています。


90行目



90行を表示してみます。




90行は解説を見ると、
  • アイスマン(バッキー)の表示
  • キー入力受付
  • アイスマン(バッキー)落下判定処理
  • アイスマン(バッキー)の右側に氷を置くかの判定処理
となっています。


まず始めにPUT SPRITE命令で、面番号が00、X座標がX*8+8、Y座標がY*8+15、色は15(白)、スプライトパターン番号はH−Cとなっています。

座標にそれぞれ8倍しているのは、動く感覚が1キャラクタ分(8ドット)ずつのためでしょう。

しかし、その後Xには8、Yには15を足しているのはなぜでしょう?

これを消して実行させてみます。


消してみたリストです。




実行結果です。



始めの位置が、おそらく8ドット左に、15ドット上にずれています。


X座標の8ドットは1キャラクタ分とわかるのですが、Y座標はなぜ16ではなく、15なのでしょうか?

今度はX座標には8を足し、Y座標には16を足してみます。


リストです。




実行結果です。




アイスマン(バッキー)の足元に注意してください。

地面に埋まっているように見えるのがわかるでしょうか?


拡大してみましょう。

15を加えた場合。16を加えた場合。


憶測ですが、理論的には16を加える事だと思いますが、見た目が不自然にならないように調整する事で、15を加える事にしたのだと思います(あくまでも私の考えです)。


ここで「アイスマン(バッキー)の表示」の処理を行っています。


次は変数Dに6273+Y*32+Xのアドレスにある値を入れています。

これは、6273と言えば16進数では1881で、&H1800〜&H1AFFのパターン名称テーブルのアドレスである事がわかります。

では、&H1800から81h分後の画面の位置はどこになるのでしょうか?

81hは129で一行は32だから、4行下(5行目の始め)は128。

ということは、5行目の右から2キャラクタ目となります。

ここは、アイスマン(バッキー)が一番左上に来た時の足元の始めの位置になります。

ということは、変数Dはアイスマン(バッキー)の下にあるものが何なのかを表しています。


INKEY$でI$に読み取ったキー入力の文字(入力がなければ、ヌル)が入ります。


ここで「キー入力受付」の処理を行っています。


F=F=0ですが、変数Fは金塊の色を切り替えるために使われています。

Fが0ならFは−1、Fが−1なら0になります。


IF M<36 AND D<36 THEN Y=Y+2:GOTO 120:ELSE IF X<29 AND (STRIG(1) OR I$=”X” OR I$=”x”) THEN V=X+3:GOTO 160

IF文なのですが、「変数MとDの内容が共に36より小さければ」と言う条件式になっています。

変数Mは「アイスマン(バッキー)がいる位置のマップキャラ識別用キャラクタコード」です。

また、変数Dは先程説明したように、「アイスマン(バッキー)がいる下のマップキャラ識別用キャラクタコード」です。

その二つの変数が36よりも小さいという事は、空間(32)または金塊(35)と言う事で、下に落ちる処理をする事になります。

THEN以後は、Y座標に2を足し(下に2キャラクタ分下がる=自分の大きさ分落ちる)、120行へ飛びます。

ELSE以後は、またIF文で「変数Xの内容が29より小さいく、かつジョイスティックの右ボタンかXキーが押されたら」と言う条件式になっています。

THEN以後は、V=X+3で変数Xの内容に3を加えたものを変数Vに代入し、160行へ飛びます。


次章は、100行からの解析になります。

 

Copyright(C) 2006. ピコピコテクノロジー All Right Reserved.