ひろじいべーしっくch(旧:ひろじいチャンネル) 第五回の動画の解説・補足。(0-005)
結論
SPシリーズ(SPSET、SPSCALE、SPOFS)、LOCATE、VSYNCの命令などを紹介するよ。
SPSET SP(スプライト)の初期設定をセットするよ。
SPSCALE SPのスケール、つまりスケールは日本語で縮尺なので、主にSPの拡大に使うよ。
SPOFS SPの座標だよ。
LOCATE 文字の座標だよ。
FORMAT$ PRINTと合わせて使う書式、すなわち表示をきれいに整える処理のことだよ。
VSYNC SPが描き終わるまでちょっと待ってもらうよ。
プログラム
今回のプログラムはこちら。(公開キー44425K433、LOAD“N05_WALK”)

命令の説明
このブログにおいてはなるべく専門用語を使用せずに非常に短く簡潔に説明しています。
詳細を知りたい方は公式リファレンス等も参照してください。
(注)SPについて
ここで扱うSP(スプライト)とは、妖精(sprite)を語源とする、キャラクター画像を表示させるための機能のこと全般を指します。
一定条件(キャラが背景を直接壊す演出を採用する場合)を除き、背景が後ろ側、キャラクターは前側で、それぞれ別々に管理した方がプログラムを整理できます。
ひとつのキャラクター(SP)の絵につき、それぞれスプライト番号を振っていきます。
例えばSPの絵を1つ採用するならば、番号は0番のみで良いです。

キャラクター一人に一枚の絵だけならこれで良いのですが、右側の絵と左側の絵を使いたいなら絵はさらに2枚必要になります。そうすると番号は1と2が追加する必要があります。

なお、この様にすると次回(第六回「ランニング」)の内容であるSPHIDE(隠す)、SPSHOW(隠したものを再び表示する)の命令が必要になります。そうしないと一人のキャラクターが西遊記の孫悟空の分身の術の様に分身が表示されたままになってしまいます。今回はスプライト番号0番の1枚の絵(定義番号6413番)のみなので、SPHIDEやSPSHOWの命令が登場しないシンプルな内容になっています。
SPSET
SPSET スプライト番号,SPDEF定義番号
読み方は「エスピーセット」。英語sprite setの省略。
SPSETはSPと先頭につく他の命令(SPSCALE、SPOFS、SPSHOW、SPHIDEなど、以下、ここでは「SPシリーズ」と呼びます。)よりも先に命令を行っておかないとエラーになります。(一部、SPCLRなど例外としてエラーにならない命令はあります。)
初期設定ということですが、要するにスプライト番号とSPDEF定義番号を結びつける命令と考えておけばわかりやすいでしょう。
スプライト番号は0から4095まで自由に設定可能です。通常はわかりやすいように0番から使うのが良いでしょう。
(なお、4095番はグラフィック表示用スプライトですので、この番号は少し特殊です。)
SPDEF定義番号はシフトキーからコントロール(Ctrl)→SBSMILE.PRG→下のタブで右から2番目の「SPDEF定義」で紹介されている絵の番号です。

動画の3分24秒あたり。SPDEF定義番号の確認。
SPSETの例。以下の図の様に3枚の絵をSPSETで初期設定する場合には、

SPSET 0,6413
SPSET 1,6409
SPSET 2,6420
となります。
SPSCALE
SPSCALE スプライト番号,ヨコ倍率,タテ倍率
読み方は「エスピースケール」。SPSETの前に使うとエラー。SPSETにおいて紐づけで設定したスプライト番号の絵(SPDEF定義番号の絵)をヨコ倍率とタテ倍率に拡大、縮小します。倍率は小数点(0.75など)も設定できます。
SPOFS
SPOFS スプライト番号,X,Y,Z
読み方は「エスピーオフセット(エスピーオフスも有?)」。SPSETの前に使うとエラー。SPSETにおいて紐づけで設定したスプライト番号の絵(SPDEF定義番号の絵)を横の位置(X)と縦の位置(Y)、そして省略も可能ですが奥行の位置(Z)も表示されます(奥行きは-4095~4095)この奥行は小さい数ほど手前に表示されます。
FORMAT$
FORMAT$(書式文字列,値,...)
読み方は「フォーマットダラー」。
通常はPRINT命令の直後に用います。
従来のBASICの一部にはPRINT USING命令として用いられた効果とほぼ同様です。
書式文字列の内容の中にある%の後に以下の型指定をつける事で「,」の次にある「値」の整形方法(書式)を制御します。
%S | 文字列変数の内容を出力 |
%D | 整数を10進出力 |
%X | 整数を16進出力 |
%F | 実数を出力 |
%B | 整数を2進出力 |
%% | %を1文字出力 |
%のあとに次の補助指定を行うことにより出力を整形します
・桁数指定:桁数の数値を指定(例:%8D,%4X)
・小数の桁数指定:全体桁数.小数部の桁数(例:%8.2F)
・空白埋め:空白文字に桁数を指定(例:% 4D→” 0″)(%と桁数の間に空白を入れています。)
・ゼロ埋め:0に桁数を指定(例:%08D→”00000000″)
・左寄せ:-記号に桁数を指定(%-8D)(マイナスが表示される訳ではありません。左に寄せて表示される、ということです。)
・+符号表示:+記号に桁数を指定(%+8D) (値がプラスの時はプラスの符号が表示され、値がマイナスの時はマイナスの符号が表示されます。)
FORMAT$の「書式文字列,」の次にある「値」
この「値」とは
%Sを使用するときは文字列や例えばA$という様に$をつけた文字列変数のことです。
%D、%X、%F、%Bを使用するときは数値や数値が代入されている変数のことです。
FORMAT$の「書式文字列,」の次にある「値」の個数。
%S、%D、%X、%F、%Bを書式文字列内で使用した個数の分だけ値を引数として「値」を置きます。
%%は“%”を実際に表示したい時に利用するので「値」は必要ないです。
(3個の時の例:A=1の時に?FORMAT$(“%S %D %% %4.2F”,”あ”,A,3.14)→“あ 1 % 3.14”)
書式文字列は文字列変数でも構わないので、上記の例を次の様に表すことができます。
(1行目) A=1 (2行目) SH$="%S %D %% %4.2F" (3行目) ?FORMAT$(SH$,"あ",A,3.14)
↓
実行結果
あ 1 % 3.14
LOCATE
LOCATE X,Y
文字を表示させる(カーソルの)座標を指定します。
(表示できる文字数はTSCREEN命令で設定するスクリーンサイズに依存します。)
XまたはYを省略すると、それぞれ以前のX,Y座標を維持します。
(XやYの前にスクリーンIDを指定できますが、詳細は次回第六回の動画「ランニング」で解説します。)
VSYNC
VSYNC
読み方は「ブイシンク(ヴイスィンクも有?)」。公式に確認はできていませんが、おそらく英語のvideo synchronize あるいはvisual synchronizeの略と思われます。videoあるいはvisualという言葉が使われる点からして視覚情報出力に合わせて同期するための休憩の命令と思われます。単に休憩であるWAIT命令とは異なる位置づけの命令です。
公式の説明では、「WAITとは異なり前回VSYNC実行時からのフレームカウントを指定(省略時には1)する。」とあります。
これが意味することはまず、ループ(今回のプログラムでは6行目から11行目までGOTO文でループ)されることにより、最初の方(1~2回?)のVSYNCは単純な休憩があり、次の描画時間内(例えばSPOFSやSPSHOWでの描画完了までかかる時間)には次のVSYNCが実行されず、描画時間後1フレーム経過後(VSYNCの後に数字を省略した場合)に前回のVSYNCが実行され、次に実行するときには次の描画を待って・・・という具合に、結果的にほぼ描画時間分だけ休憩が実行される、ということになります。

0分58秒あたり。(SPOFSやSPSHOWを直前に使用した場合など。)とあるのは、描画時間が関連してくる際にVSYNC命令とWAIT命令と差が出てくることとして表示しました。

4分6秒あたり。
(正確には前回実行のVSYNCに重ならずに休むので、SPシリーズが完全実行される。)とあるのは、描画時間が関連してくる際にVSYNC命令とWAIT命令と差が出てくること、またVSYNC命令は前回のVSYNC命令の実行を待って休憩してから実行されることとして表示しました。
動作の説明(補足)
今回のプログラムにおいて、動画内でほぼ説明の無かった「ボタンのサブルーチン」を中心に補足として説明しておきます。

2行目のPRINT文の後、XとYの変数を、横(X)と縦(Y)の座標としてそれぞれ100とします。
15行目から18行目において画面外に出すぎないようにXやYの条件をボタンの条件と組み合わせています。
15行目。Xが200未満、かつ右(→)ボタンを押したときには、過去のXに1を追加した数を現在のXに代入します。
16行目。Xが0を超え、かつ左(←)ボタンを押したときには、過去のXに1を引いた数を現在のXに代入します。
17行目。Yが0を超え、かつ上(↑)ボタンを押したときには、過去のYに1を引いた数を現在のYに代入します。
18行目。Yが200未満、かつ下(↓)ボタンを押したときには、過去のYに1を追加した数を現在のYに代入します。
19行目。Xボタンを押したときにはプログラムを終了します。
まとめ
SPSET SP(スプライト)の初期設定をセットします。スプライト番号とSPDEF番号の紐づけをします。
SPSCALE SPの拡大や縮小に使います。SPSETの命令を開始した後でなければエラーが出ます。
SPOFS SPの座標です。SPSETの命令を開始した後でなければエラーが出ます。
LOCATE 文字を表示するためのカーソルの座標です。
FORMAT$ PRINTと合わせて使う書式を指定するための命令です。
VSYNC SPが描き終わるまで待たせる命令です、と言いたいところですが、正確にはSPの描画時間内にVSYNCが実行されず、描画完了時に前回のVSYNCの実行の影響を受けて休憩を引き継ぐ・・・・といった具合の命令です
コメント