連載
» 2014年11月17日 17時44分 UPDATE

カウントダウン企画……あと3回:日刊!プチコン3号――あれもこれも実現可能な「SPRITE」の柔軟性

配信までいよいよあと「2日」! 連載は残すところあと「3回」! ……あ、あれ?

[瓜生聖,ITmedia]

連載:日刊プチコン3号

あれもこれも実現可能な「SPRITE」の柔軟性

 前回に引き続き、プチコンの主要機能である「SPRITE」について紹介する。

 残り回数わずかな本連載において、2回に渡って同じ機能を取り上げるのは心苦しい面もあるのだが、それでもSPRITEは1回では紹介しきれないほどのボリュームと可能性を持っている。

 プチコン3号ではカラーパレットが廃止され、SPRITEにもフルカラーが使用できるようになった。SPCOLORはRGBそれぞれに対して元データのどれくらいの割合の輝度で描画するかを指定する。RGB(255,255,255)であれば元データそのまま、RGB(255,0,0)であれば赤成分のみの描画になる。ボスキャラなど1発では倒せない「硬い」敵のダメージ表現などに使えるだろう。さらに透過率を設定することもできるので、描画フレームを間引く擬似半透明のテクニックを使わなくても簡単に半透明が表現可能だ。

SPLINKも使い途の多い命令だ。SPLINKは各SPRITEの位置指定を画面座標ではなく特定のSPRITE(親SPRITE)、つまり、親SPRITEからの相対座標として扱う。親SPRITEが動けば追従して子SPRITEも移動する。多関節キャラクタ、トラクタービームでとらえられたギャプラスの敵機、R-Typeのフォース、ゼビウスのシオナイトなど自機に追従するものや、放射状に弾をばらまくガルザカートなどの弾幕(中央に非表示の親SPRITEを残す)など、応用力は高い。SPUNLINKでリンク解除できる。

 機能としては変わらないものの、命令や指定方法が変更されたものもある。

 SPRITEの衝突判定領域を指定するSPCOLでは衝突判定をするグループ分けがプチコンmkIIの8ビットから32ビットに拡張された。例えば、自機を&HFFFF0000、自弾を&H0000FFFF、敵を&H00010001、&H00020002、&H00040004、……に割り当てると自機と敵、自弾と敵は衝突判定されるが、自弾と自機、敵機同士は衝突判定されない。

 衝突判定そのものはプチコンmkIIの「SPHIT()」と「SPHITSP()」が「SPHITSP()」に統合されている。プチコンmkIIではSPHIT()は同じグループ内の衝突を検出、SPHITSP()は2つのSPRITEを指定して衝突を判定していた。プチコン3号ではSPHITSP()の引数によって両方の機能を使い分けるようになった。

 また、プチコンmkIIでは衝突判定結果をシステム変数SPHITNO(衝突相手)、SPHITX,SPHITY(衝突相手の座標)、SPTT(衝突時刻)で受け渡していた。プチコン3号ではこれをSPHITINFO命令で直接変数に取得する。各SPRITEの速度も取得できるようになった。

 そのほか、SPRITE画面全体のクリッピング領域を指定するSPCLIP、各SPRITEごとにアニメーションを開始/停止するSPSTART/SPSTOPが追加されている。補間動作中のSPRITEの情報を取得するSPREAD()はSPOFS(座標)、SPROT(角度)、SPSCALE(スケール)、SPCHR(キャラクタ)にそれぞれ分担された。SPRITE変数の読み書きがSPGETV/SPSETVからSPVARに変更されたのはBGVARなどと同様だ。

サンプル

関係する命令

SPCOLOR

 説明(1/2)

  SPRITEの表示色を設定

 引数

  管理番号

   対象のSPRITEの管理番号:0〜511

  色コード

   ARGB=8888形式の32ビット色コード

   ・RGB関数で指定すると便利 RGB(A,R,G,B)

   ・Aの値を小さくすると透明度が上がる

   ※実際の表示色は、色コードに元のドット色を乗算したものになる

SPCOLOR 管理番号 OUT 色コード

 説明(2/2)

  SPRITEの表示色を得る

 引数

  管理番号

   対象のSPRITEの管理番号:0〜511

  色コード

   現在の色コードが返る変数(32ビットARGB)

変数=RGB([A],R,G,B)

 説明

  8ビットRGB値をもとに色コードを得る

  ・各種グラフィック命令の色指定に使用すると便利

  ・黒→RGB(0,0,0)

  ・白→RGB(255,255,255)

  ・薄いグレー→RGB(224,224,224)

  ・グレー→RGB(128,128,128)

  ・濃いグレー→RGB(64,64,64)

  ・赤→RGB(255,0,0)

  ・ピンク→RGB(255,96,208)

  ・紫→RGB(160,32,255)

  ・水色→RGB(80,208,255)

  ・青→RGB(0,32,255)

  ・黄緑→RGB(96,255,128)

  ・緑→RGB(0,192,0)

  ・黄色→RGB(255,224,32)

  ・オレンジ→RGB(255,160,16)

  ・茶色→RGB(160,128,96)

  ・薄紅色→RGB(255,208,160)

 引数

  A

   透明度情報(255:不透明、それ以外:透明)

   ※ただしSPCOLORでは0〜255で透明度を指定可能

  R,G,B

   R(赤)・G(緑)・B(青) 8ビット階調(各0〜255)

 戻り

  変数=色コード(ARGB各8ビット) ※GCOLORを参照

SPVAR 管理番号,内部変数番号,数値

 説明(1/3)

  SPRITE用内部変数への書き込み

  ※SPRITE用内部変数:SPRITE内に8個ずつあるユーザー用の変数

 引数

  管理番号

   対象のSPRITE管理番号:0〜511

  内部変数番号

   内部変数の番号:0〜7

  数値

   内部変数に登録する数値

変数=SPVAR(管理番号,内部変数番号)

 説明(2/3)

  SPRITE用内部変数の読み込み

  ※SPRITE用内部変数:SPRITE内に8個ずつあるユーザー用の変数

 引数

  管理番号

   対象のSPRITE管理番号:0〜511

  内部変数番号

   内部変数の番号:0〜7

 戻り

  SPVARで書き込んだ値

SPVAR 管理番号,内部変数番号 OUT 数値

 説明(3/3)

  SPRITE用内部変数の読み込み

  ※SPRITE用内部変数:SPRITE内に8個ずつあるユーザー用の変数

 引数

  管理番号

   対象のSPRITE管理番号:0〜511

  内部変数番号

   内部変数の番号:0〜7

  数値

   内部変数の値が戻る数値変数

   (著者注:数値リテラルではなく、変数名)

SPLINK 管理番号,リンク先管理番号

 説明

  SPRITEを別のSPRITEにリンクさせる

  ・リンクするのは座標のみ(回転角度や倍率情報はリンクしない)

  ・リンク先(親)に指定できるのは、リンク元(子)より小さい管理番号のSPRITEのみ

  ・子の表示座標は、親を基準とした相対座標となる

   (画面左上が原点とはならなくなる)

  ・リンクの階層に制限はない

 引数

  管理番号

   リンク元(子)のSPRITEの管理番号:0〜511

  リンク先管理番号

   リンク先(親)のSPRITEの管理番号:0〜511(リンク元より小さいこと)

SPUNLINK 管理番号

 説明

  SPRITEのリンクを解除

 引数

  管理番号

   リンクを解除するSPRITEの管理番号:0〜511

SPCOL 管理番号[,始点X,始点Y,幅,高さ] [[,スケール対応] [,マスク]]

 説明

  SPRITE衝突判定領域の設定

 引数

  管理番号

   対象のSPRITE管理番号:0〜511

  始点X,Y

   判定領域の始点座標:X,Y 各 -32768〜32767

   ※SPHOMEを原点(0,0)とした相対座標

  幅,高さ

   判定領域の幅と高さ:W,H 各 0〜65535

  スケール対応

   TRUE=SPSCALEの指定に判定領域のサイズを同期(省略時=TRUE)

   FALSE=無視

  マスク

   0〜&HFFFFFFFF(32ビット)

   ※衝突判定時に互いのビットのANDをとり、0であれば衝突していないとみなす

SPHITSP

 説明(1/2)

  SPRITEに衝突した別のSPRITEを検索

 引数

  判定するSPRITEの管理番号:0〜511

  省略すると、前回のSPHITSP命令と同条件で続きから検索

 戻り

  衝突したSPRITEの管理番号(衝突のないとき-1)

変数=SPHITSP(管理番号,相手管理番号)

 説明(2/2)

  SPRITE同士の衝突判定

 引数

  管理番号

   判定するSPRITEの管理番号:0〜511

  相手管理番号

   相手側のSPRITEの管理番号:0〜511

  戻り

   FALSE=衝突なし、TRUE=衝突

SPHITINFO OUT 衝突時間

 説明(1/3)

  衝突判定結果の情報を取得(1)衝突時間

 引数

  衝突時間

   衝突時間が戻る変数:0〜1の実数値

   (判定時の位置+速度×衝突時間が衝突座標と一致)

SPHITINFO OUT 衝突時間,物体1座標X,物体1座標Y,物体2座標X,物体1座標Y

 説明(2/3)

  衝突判定結果の情報を取得(2)衝突時間と2物体の衝突座標

 引数

  衝突時間

   衝突時間が戻る変数:0〜1の実数値

   (判定時の位置+速度×衝突時間が衝突座標と一致)

  物体1座標X,Y

   衝突時の物体1の座標が戻る変数

  物体2座標X,Y

   衝突時の物体2の座標が戻る変数

SPHITINFO OUT 衝突時間,物体1座標X,Y,物体1速度X,Y,物体2座標X,Y,物体2速度X,Y

 説明(3/3)

  衝突判定結果の情報を取得(3)衝突時間と2物体の衝突座標・速度

 引数

  衝突時間

   衝突時間が戻る変数:0〜1の実数値

   (判定時の位置+速度×衝突時間が衝突座標と一致)

  物体1座標X,Y

   衝突時の物体1の座標が戻る変数

  物体1速度X,Y

   衝突時の物体1の速度が戻る変数

  物体2座標X,Y

   衝突時の物体2の座標が戻る変数

  物体2速度X,Y

   衝突時の物体2の速度が戻る変数

SPCLIP [始点X,始点Y,終点X,終点Y]

 説明

  SPRITEのクリッピング領域を指定

 引数

  始点X,Y

   クリップ領域の始点座標

  終点X,Y

   クリップ領域の終点座標

   ※始点・終点を省略すると、画面全体が表示領域となる

SPSTART [管理番号]

 説明

  SPRITEのアニメーションを開始する

 引数

  管理番号

   対象のSPRITEの管理番号:0〜511

   ※管理番号を省略すると、全SPRITEのアニメーションを開始する

SPSTOP [管理番号]

 説明

  SPRITEのアニメーションを停止する

引数

  管理番号

   対象のSPRITEの管理番号:0〜511

   ※管理番号を省略すると、全SPRITEのアニメーションを停止する


 次回はワイヤレス通信を紹介しよう。

※本稿の内容は開発中のものです。製品版配信時には仕様が変更される場合があります。


Copyright© 2016 ITmedia, Inc. All Rights Reserved.