80年代レトロPCではSPRITE(スプライト)の有無は重要だった。SPRITEがあれば比較的安価な機種であってもスムーズな動きが実現できるため、アーケードゲームから再現性の高い移植が可能になるからだ。
だが、ほぼゲームに特化した機能であるためか、逆に高価格帯PCでの搭載は遅く、X68000やFM TOWNSあたりまで待たなくてはならなかった。もちろん、プチコンでは初代から3号に至るまで主要機能の1つとして搭載されている。
SPRITEは管理番号で管理された透明なセルのようなもので、そこにキャラクタ(画像)を設定することで利用可能になる。セルに書き込むキャラクタを書き換えればキャラクタがアニメーションするし、セルの表示位置を動かせばキャラクタが移動する。
SPRITEへの画像設定には二通りの方法がある。1つはSPDEF命令でSPRTITEのキャラクタ定義用テンプレートを作成し、その管理番号を使ってSPSET命令で設定する方法。キャラクタ定義用テンプレートにはスプライト画像置き場のグラフィックページ(SPPAGEで指定)のどの部分をどのキャラクタとして定義するかが登録されている。もう1つはSPDEFを使わずに直接SPSETで割り当てる方法だ。
なお、プチコンmkIIではSPSETでSPRITEの使用が可能になるとともに表示されるが、プチコン3号ではSPSETだけでは表示はされず、SPSHOWで明示的に表示させる必要がある。SPRITEの解放はmkIIと同じくSPCLRだが、SPRITEを非表示にするSPHIDEも新たに用意された。解放するまでもないが非表示にしたい場合(やられた敵機や対象に当たった弾など)に利用できるだろう。
そのほか、SPRITE関連ではmkIIからある命令でも、仕様が変わったものが多い。中でもSPANIM命令は大きく変化している。プチコンmkIIでは移動や回転などを指定する命令に補間時間(何フレームかけて変化させるか)を指定することができるようになっていた。それに対し、補間時間を指定して変更させることはSPANIM命令に集約し、ほかの命令は滑らかな変化ではなく直接指定・設定する場合に利用するように担当分けが変更されている。このような命令にはSPOFS(表示位置)、SPCHR(キャラ番号)、SPROT(回転:プチコンmkIIのSPANGLEに相当)、SPSCALE(拡大/縮小)がある。
説明(1/4)
SPRITEのキャラクタ定義用テンプレートを作成
引数
定義番号
テンプレートの定義番号:0〜4095
※初期状態では1000個以上定義済みなのでそのまま使える
U,V
定義する元画像の座標(U:0〜511、V:0〜511)
(著者注:SPPAGEで指定したグラフィックページの座標)
W,H
定義する元画像サイズ 省略時16,16
※U+W、V+Hはそれぞれ512以下でなくてはならない
原点X,Y
SPRITEの座標基準点 省略時0,0
アトリビュート
b0:表示(0=OFF、1=ON) 省略時1
b1〜b2:回転(0=なし、1=90度、2=180度、3=270度)
b3:横反転(0=OFF、1=ON)
b4:縦反転(0=OFF、1=ON)
(著者注:bnは第nビットを表す。縦反転(b4=1)、90度回転(b1〜b2=01)、表示(b0=1)の場合は10011=19を指定)
説明(2/4)
SPRITEのキャラクタ定義用テンプレートを配列から一括作成
引数
数値配列
SPRITEのテンプレートデータが格納された数値配列
・1個分の要素はU,V,W,H,原点X,原点Y,アトリビュートの7つ
(要素数は7の倍数である必要がある)
・0から順に要素数/7までのSPRITEテンプレートが定義される
説明(3/4)
SPRITEのキャラクタ定義用テンプレートをDATA列から一括作成
引数
@ラベル文字列
SPRITEのテンプレートデータが列挙されたDATA命令のラベル
・@ラベル名は""でくくるか、文字列変数で指定する
・先頭データは定義するSPRITE数とし、続いて各SPRITEのデータを列挙(1個につき7データ)
・1個分の要素はU,V,W,H,原点X,原点Y,アトリビュートの7つ
説明(4/4)
SPRITEのキャラクタ定義テンプレートの情報を得る
引数
定義番号
テンプレートの定義番号:0〜4095
U,V
定義されている元画像の座標
W,H
定義されている元画像サイズ
原点X,Y
定義されているSPRITEの座標基準点
アトリビュート
定義されているアトリビュート b0:表示(0=OFF、1=ON)
b1〜b2:回転(0=なし、1=90度、2=180度、3=270度)
b3:横反転(0=OFF、1=ON)
b4:縦反転(0=OFF、1=ON)
(著者注:bnは第nビットを表す。縦反転(b4=1)、90度回転(b1〜b2=01)、表示(b0=1)の場合は10011=19を指定)
説明(1/2)
SPRITEを作成し、キャラクタ定義テンプレートを割り当てる
これにより、作成した管理番号のSPRITEが使用可能になる
※SPSHOW命令にて表示をONにする
引数
管理番号
作成するSPRITEの番号:0〜511
定義番号
SPDEFで定義したテンプレートの定義番号:0〜4095
(初期状態では1000個以上定義済みなのでそのまま使える)
説明(2/2)
SPRITEを作成し、キャラクタを定義する
(事前にSPDEF命令を使用せず、直接定義する方法)
これにより、作成した管理番号のSPRITEが使用可能になる
引数
管理番号
作成するSPRITEの番号:0〜511
U,V
定義する元画像の座標(U:0〜511、V:0〜511)
W,H
定義する元画像サイズ 省略時16,16 ※U+W, V+Hはそれぞれ512以下でなくてはならない
アトリビュート
b0:表示(0=OFF、1=ON) 省略時1
b1〜b2:回転(0=なし、1=90度、2=180度、3=270度)
b3:横反転(0=OFF、1=ON)
b4:縦反転(0=OFF、1=ON)
説明
SPRITEの表示を開始
引数
管理番号
表示するSPRITEの管理番号:0〜511
説明
SPRITEの表示をOFF
※表示を隠すだけであり、SPRITEは存在
引数
管理番号
表示を隠すSPRITEの管理番号:0〜511
説明(1/3)
SPRITEによるアニメ表示(1) 配列でアニメデータを指定
引数
管理番号
アニメーションを設定するSPRITEの管理番号:0〜511
アニメ対象
変化させる要素を管理する数値または文字列
XY座標:0または"XY"
Z座標:1または"Z"
UV座標:2または"UV" ※定義元の座標
定義番号:3または"I"
回転:4または"R"
倍率XY:5または"S"
表示色:6または"C"
変数:7または"V" ※SPRITE変数7の値
※対象数値に8を加えるか、文字列の末尾に"+"を付けると、
値は実行時からの相対値として扱われる
データ配列
アニメデータが格納された1次元数値配列
ループ
ループ回数:(1〜)0で無限ループ
データ配列
アニメデータは数値配列に次の順で用意する
時間1,項目1,[項目2,]時間2,項目1,[項目2,]...
・時間n:フレーム数 ※マイナスで前のフレームから線形補間
・項目1:変化させる値1(XY座標なら、Xの変化後の値)
・項目2:変化させる値2(XY座標、UV座標のように、複数要素を変化させる場合のみ指定)
●XY座標を変化させる場合のデータ例
DIM PANIM[100]
PANIM[0] = -4 :'4フレーム(マイナスなので線形補間)
PANIM[1] = 200 :'絶対位置X200
PANIM[2] = 100 :'絶対位置Y100
PANIM[3] = -4 :'4フレーム(マイナスなので線形補間)
PANIM[4] = 50 :'絶対位置X50
PANIM[5] = 20 :'絶対位置Y20
説明(2/3)
SPRITEによるアニメ表示(2) DATA命令でアニメデータを指定
引数
管理番号
アニメーションを設定するSPRITEの管理番号:0〜511
アニメ対象
変化させる要素を管理する数値または文字列
XY座標:0または"XY"
Z座標:1または"Z"
UV座標:2または"UV" ※定義元の座標
定義番号:3または"I"
回転:4または"R"
倍率XY:5または"S"
表示色:6または"C"
変数:7または"V" ※SPRITE変数7の値
※対象数値に8を加えるか、文字列の末尾に"+"を付けると、
値は実行時からの相対値として扱われる
@ラベル文字列
アニメデータが格納されたDATA命令の先頭ラベル
※@ラベル名を""でくくって文字列として指定(または文字変数)
ループ
ループ回数:(1〜)0で無限ループ
データ配列
アニメデータはDATA命令に次の順で用意する
キーフレーム数,時間1,項目1,[項目2,]時間2,項目1,[項目2,]...
・キーフレーム数:時間n〜項目2までのデータセット数を指定
(アニメデータの終わりを知るために必要)
・時間n:フレーム数 ※マイナスで前のフレームから線形補間
・項目1:変化させる値1(XY座標なら、Xの変化後の値)
・項目2:変化させる値2(XY座標、UV座標のように、複数要素を変化させる場合のみ指定)
●XY座標を変化させる場合のデータ例
@MOVDATA
DATA 2:'キーフレーム数
DATA -4,200,100 :'4フレームで座標200,100に移動(線形補間)
DATA -4,50,20 :'4フレームで座標50,20に移動(線形補間)
説明(3/3)
SPRITEによるアニメ表示(3) 直接アニメデータを渡す方法
引数
管理番号
アニメーションを設定するSPRITEの管理番号:0〜511
アニメ対象
変化させる要素を管理する数値または文字列
XY座標:0または"XY"
Z座標:1または"Z"
UV座標:2または"UV" ※定義元の座標
定義番号:3または"I"
回転:4または"R"
倍率XY:5または"S"
表示色:6または"C"
変数:7または"V" ※SPRITE変数7の値
※対象数値に8を加えるか、文字列の末尾に"+"を付けると、
値は実行時からの相対値として扱われる
ループ
ループ回数:(1〜)0で無限ループ
時間n, 項目1, 項目2
アニメデータを引数に列挙して渡す
時間1,項目1,[項目2],時間2,項目1,[項目2,]...
・時間n:フレーム数 ※マイナスで前のフレームから線形補間
・項目1:変化させる値1(XY座標なら、Xの変化後の値)
・項目2:変化させる値2(XY座標、UV座標のように、複数要素を変化させる場合のみ指定)
●XY座標を変化させる場合の指定
SPANIM 0,"XY",-4,200,100,-4,50,20
説明(1/2)
SPRITEのキャラクタ定義を変更(テンプレートより)
引数
管理番号
定義を変更するSPRITEの管理番号:0〜511
定義番号
SPDEF命令で登録したテンプレートの番号:0〜4095
説明(2/2)
SPRITEのキャラクタ定義を変更(直接定義)
引数
管理番号
対象のSPRITEの管理番号:0〜511
U,V
定義する元画像の座標(U:0〜511、V:0〜511)
W,H
定義する元画像サイズ
※U+W、V+Hはそれぞれ512以下でなくてはならない
アトリビュート
b0:表示(0=OFF、1=ON)
b1〜b2:回転(0=なし、1=90度、2=180度、3=270度)
b3:横反転(0=OFF、1=ON)
b4:縦反転(0=OFF、1=ON)
説明(1/2)
SPRITE座標の変更(移動)
引数
管理番号
対象のSPRITEの管理番号:0〜511
X,Y
SPRITEを表示する画面座標 Zを指定した場合、X,Yは省略可
Z
奥行方向の座標(奥:1024<液晶面:0<手前:-256)X,Yを指定した場合、Zは省略可
説明(2/2)
SPRITEの座標を得る
引数
管理番号
対象のSPRITEの管理番号:0〜511
X,Y
座標を受け取る変数
Z
奥行情報を受け取る変数
説明(1/3)
SPRITEの回転
引数
管理番号
対象のSPRITEの管理番号:0〜511
角度
回転角度:0〜360(時計回り)
説明(2/3)
SPRITEの回転角度を得る
引数
管理番号
対象のSPRITEの管理番号:0〜511
角度
現在の角度が返る変数(0〜360)
説明(3/3)
SPRITEの回転角度を得る(関数タイプ)
引数
管理番号
対象のSPRITEの管理番号:0〜511
戻り
現在の角度(0〜360)
説明(1/2)
SPRITEのスケール(表示倍率)の変更
引数
管理番号
対象のSPRITEの管理番号:0〜511
倍率X,Y
X方向・Y方向の倍率を指定
0.5:50% 1.0:100% 2.0:200%
説明(2/2)
SPRITEの表示倍率を得る
引数
管理番号
対象のSPRITEの管理番号:0〜511
SX,SY
倍率を受け取る変数
次回はSPRITE関連の新しい命令を見ていくことにしよう。
「日刊!プチコン3号」で取り上げて欲しいネタや疑問、質問、感想は、ハッシュタグ「#nikkan_petitcom3」をつけてツイート! ライターの瓜生氏がたぶん(連載の中で)答えてくれるぞ。
Copyright © ITmedia, Inc. All Rights Reserved.