連載
» 2014年11月14日 20時45分 UPDATE

カウントダウン企画……あと4回:日刊!プチコン3号――なくてはならない「SPRITE」

かつてレトロPCで重要な機能だったSPRITE(スプライト)。もちろん、プチコンでも主要機能の1つとして搭載されているぞ。

[瓜生聖,ITmedia]

連載:日刊プチコン3号

なくてはならない主要機能「SPRITE」

 80年代レトロPCではSPRITE(スプライト)の有無は重要だった。SPRITEがあれば比較的安価な機種であってもスムーズな動きが実現できるため、アーケードゲームから再現性の高い移植が可能になるからだ。

 だが、ほぼゲームに特化した機能であるためか、逆に高価格帯PCでの搭載は遅く、X68000やFM TOWNSあたりまで待たなくてはならなかった。もちろん、プチコンでは初代から3号に至るまで主要機能の1つとして搭載されている。

 SPRITEは管理番号で管理された透明なセルのようなもので、そこにキャラクタ(画像)を設定することで利用可能になる。セルに書き込むキャラクタを書き換えればキャラクタがアニメーションするし、セルの表示位置を動かせばキャラクタが移動する。

 SPRITEへの画像設定には二通りの方法がある。1つはSPDEF命令でSPRTITEのキャラクタ定義用テンプレートを作成し、その管理番号を使ってSPSET命令で設定する方法。キャラクタ定義用テンプレートにはスプライト画像置き場のグラフィックページ(SPPAGEで指定)のどの部分をどのキャラクタとして定義するかが登録されている。もう1つはSPDEFを使わずに直接SPSETで割り当てる方法だ。

og_puticom3_12_001.jpg グラフィックページ、キャラクタ定義テンプレート、SPRITEの関係図

 なお、プチコン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号は土日祝日は休刊です

 「日刊!プチコン3号」で取り上げて欲しいネタや疑問、質問、感想は、ハッシュタグ「#nikkan_petitcom3」をつけてツイート! ライターの瓜生氏がたぶん(連載の中で)答えてくれるぞ。


Copyright© 2016 ITmedia, Inc. All Rights Reserved.