
※途中で戻りたい場合は、ブラウザの「戻る」機能を使ってください。
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行は解説を見ると、
まずは、「ステージデータの展開と表示」です。 これは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を足してみます。 リストです。 ![]() 実行結果です。 ![]() アイスマン(バッキー)の足元に注意してください。 地面に埋まっているように見えるのがわかるでしょうか? 拡大してみましょう。
憶測ですが、理論的には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.