日刊!プチコン3号――なくてはならない「SPRITE」:カウントダウン企画……あと4回
かつてレトロPCで重要な機能だったSPRITE(スプライト)。もちろん、プチコンでも主要機能の1つとして搭載されているぞ。
なくてはならない主要機能「SPRITE」
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(拡大/縮小)がある。
関係する命令
SPDEF 定義番号,U,V[,W,H,[,原点X,原点Y]][,アトリビュート]
説明(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を指定)
SPDEF 数値配列
説明(2/4)
SPRITEのキャラクタ定義用テンプレートを配列から一括作成
引数
数値配列
SPRITEのテンプレートデータが格納された数値配列
・1個分の要素はU,V,W,H,原点X,原点Y,アトリビュートの7つ
(要素数は7の倍数である必要がある)
・0から順に要素数/7までのSPRITEテンプレートが定義される
SPDEF "@ラベル文字列"
説明(3/4)
SPRITEのキャラクタ定義用テンプレートをDATA列から一括作成
引数
@ラベル文字列
SPRITEのテンプレートデータが列挙されたDATA命令のラベル
・@ラベル名は""でくくるか、文字列変数で指定する
・先頭データは定義するSPRITE数とし、続いて各SPRITEのデータを列挙(1個につき7データ)
・1個分の要素はU,V,W,H,原点X,原点Y,アトリビュートの7つ
SPDEF 定義番号 OUT U,V[,W,H,[,原点X,原点Y]][,アトリビュート]
説明(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を指定)
SPSET 管理番号,定義番号
説明(1/2)
SPRITEを作成し、キャラクタ定義テンプレートを割り当てる
これにより、作成した管理番号のSPRITEが使用可能になる
※SPSHOW命令にて表示をONにする
引数
管理番号
作成するSPRITEの番号:0~511
定義番号
SPDEFで定義したテンプレートの定義番号:0~4095
(初期状態では1000個以上定義済みなのでそのまま使える)
SPSET 管理番号,U,V,[,W,H],アトリビュート
説明(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)
SPSHOW 管理番号
説明
SPRITEの表示を開始
引数
管理番号
表示するSPRITEの管理番号:0~511
SPHIDE 管理番号
説明
SPRITEの表示をOFF
※表示を隠すだけであり、SPRITEは存在
引数
管理番号
表示を隠すSPRITEの管理番号:0~511
SPANIM 管理番号,"アニメ対象",データ配列[,ループ]
説明(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
SPANIM 管理番号,"アニメ対象","@ラベル文字列"[,ループ]
説明(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に移動(線形補間)
SPANIM 管理番号,"アニメ対象",時間1,項目1[,項目2][,時間2,項目1[,項目2]]...[,ループ]
説明(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
SPCHR 管理番号,定義番号
説明(1/2)
SPRITEのキャラクタ定義を変更(テンプレートより)
引数
管理番号
定義を変更するSPRITEの管理番号:0~511
定義番号
SPDEF命令で登録したテンプレートの番号:0~4095
SPCHR 管理番号,U,V,[,W,H],アトリビュート
説明(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)
SPOFS 管理番号,X,Y[,Z]
説明(1/2)
SPRITE座標の変更(移動)
引数
管理番号
対象のSPRITEの管理番号:0~511
X,Y
SPRITEを表示する画面座標 Zを指定した場合、X,Yは省略可
Z
奥行方向の座標(奥:1024<液晶面:0<手前:-256)X,Yを指定した場合、Zは省略可
SPOFS 管理番号 OUT X,Y[,Z]
説明(2/2)
SPRITEの座標を得る
引数
管理番号
対象のSPRITEの管理番号:0~511
X,Y
座標を受け取る変数
Z
奥行情報を受け取る変数
SPROT 管理番号,角度
説明(1/3)
SPRITEの回転
引数
管理番号
対象のSPRITEの管理番号:0~511
角度
回転角度:0~360(時計回り)
SPROT 管理番号 OUT 角度
説明(2/3)
SPRITEの回転角度を得る
引数
管理番号
対象のSPRITEの管理番号:0~511
角度
現在の角度が返る変数(0~360)
変数=SPROT(管理番号)
説明(3/3)
SPRITEの回転角度を得る(関数タイプ)
引数
管理番号
対象のSPRITEの管理番号:0~511
戻り
現在の角度(0~360)
SPSCALE 管理番号,倍率X,倍率Y
説明(1/2)
SPRITEのスケール(表示倍率)の変更
引数
管理番号
対象のSPRITEの管理番号:0~511
倍率X,Y
X方向・Y方向の倍率を指定
0.5:50% 1.0:100% 2.0:200%
SPSCALE 管理番号 OUT SX, SY
説明(2/2)
SPRITEの表示倍率を得る
引数
管理番号
対象のSPRITEの管理番号:0~511
SX,SY
倍率を受け取る変数
次回はSPRITE関連の新しい命令を見ていくことにしよう。
「日刊!プチコン3号」で取り上げて欲しいネタや疑問、質問、感想は、ハッシュタグ「#nikkan_petitcom3」をつけてツイート! ライターの瓜生氏がたぶん(連載の中で)答えてくれるぞ。
Copyright © ITmedia, Inc. All Rights Reserved.