プチコン3号 2日目 絵を動かしてみる

pc2-2.jpg

プチコン2日目は、画面に絵を表示してみます。
表示するだけなら、エディタでプログラムを書かずとも、ダイレクトモードで直接実行できます。

SPSET 0,502
SPOFS 0,200,160,500
SPSCALE 0,2.0,2.0

これで、RPG風のキャラクタが画面に表示されました。

1行目は、0番のスプライトに502番の絵を割り当てました。
スプライトというのは、画面に重ねて表示することができる小さな(16×16ピクセルの)絵です。
スプライトには、表示すると、重ねた下の画面は隠されますが上書きされない、という特徴があります。
ゲームで背景の絵に重ねて、敵や自分のキャラクタを表示するのに大変便利な機能です。
プチコン3号は512枚のスプライトを持っており、0~511の番号で指定します。

次にスプライトに割り当てる絵ですが、これも番号で指定します。
どの番号でどんな絵が出るかは、Smileツールで確認できます。
Smileツールのボタンは画面下部中央あたりにあります。

pc2-0.jpg

Smileツールが表示されたら、その画面の下部中央の「SPDEF」ボタンを押します。
これでスプライトの一覧が表示されます。
絵柄は4096通りあり、0~4095で指定します。

pc2-1.jpg

さて、次にスプライトの表示位置と大きさの指定です。

SPSET 0,502
SPOFS 0,200,160,500
SPSCALE 0,2.0,2.0

SPOFSはスプライトの表示位置を指定します。もちろん3次元で指定できます。
4つのパラメータ「0,200,160,500」はそれぞれスプライト番号、X、Y、Zの値です。
ちなみにOFSとは「offset」、基準点(原点)からの差分というような意味合いです。

SPSCALEはスプライトの拡大率です。
3つのパラメータはスプライトの番号、横方向の拡大率、縦方向の拡大率です。

SPOFSの値を変更すると、スプライトの表示位置が変わります。
値を連続的に変えてやれば、スプライトを動かすことができます。
簡単なプログラムを書いてみました。

pc2-3.jpg

X=0:Y=0:Z=200
DX=1:DY=1:DZ=20
SPSET 0,502
@LOOP
X=X+DX
IF X>368 OR X<0 THEN DX=-DX Y=Y+DY IF Y>208 OR Y<0 THEN DY=-DY Z=Z+DZ IF Z>500 OR Z<-200 THEN DZ=-DZ SPOFS 0,X,Y,Z S=1.0+(500-Z)/500 SPSCALE 0,S,S VSYNC 1 LOCATE 0,0,0 PRINT X," ",Y," ",Z GOTO @LOOP

プログラムの中身ですが、スプライトを一定速度で動かし、画面の端まで行ったら戻ってくるようにしています。
DX、DY、DZが単位時間の移動量(=速度)で、正の値と負の値で移動方向を指定しています。
X, Y, Zでどれもやっていることは同じです。

ちなみに単位時間とは、1/60秒です。
これはVSYNCで指定します。1/60秒が、指定できる最短の単位時間です。

なおVSYNCとはVertical Sync(垂直同期)のことで、アナログのビデオ回路の走査線が下から上へ戻るときの同期信号から来ています。昔のゲーム機は、ビデオ回路が画面を描いている途中で絵を変化させると、ちらつきなどの悪影響が出ていました。そのため、走査線が戻る期間(画面を描いていない時間帯)に一気に画面を更新するようにしていたのですね。

Z軸方向の移動については、スプライトが遠いときほどサイズを小さくするようにして、動きをデフォルメしてみました。
このほうが、画面の中で動いている感じが出ると思います。

画面の座標系は、原点が左上。
一般的なグラフなどと違って、Y軸が下向きです。
画面サイズはX軸が400、Y軸が240です。
Z軸は、画面位置が座標0で、手前が負、遠くが正。
画面奥行き方向は最大1024、画面手前方向は-256までの値で指定します。

スプライトも(特に指定しなければ)原点は左上になります。
2倍に拡大した(32×32ピクセル相当の)スプライトの右端が、画面の右端に一致するとき、スプライトの座標は

400 – 32 = 368

となりますので、上のプログラムでは座標が368を超えたときにX軸上の移動方向を反転するようにしています。

プチコン3号は、小学生にプログラミングを学ばせるのが目的なのかなと思ったのですが、その割に初歩的な解説が少ないようなので、今回は初心者講座っぽく詳しめに書いてみました。
昔はBASICの解説本は非常に多かったのですが、今ではマイナーな言語になってしまったのですね。

コメント