SPCOL
スプライトの衝突判定のルールを設定・取得
衝突判定設定を初期化
SPCOL spNo
判定範囲等を設定 (未指定の項目は初期化)
SPCOL spNo,scale
SPCOL spNo,[scale],mask
SPCOL spNo,u,v,w,h[,scale[,mask]]
スケール、マスクを取得指定
SPCOL spNo OUT scale[,mask]
scale = SPCOL(spNo)
衝突領域、スケール、マスクを取得
SPCOL spNo OUT u,v,w,h[,scale[,mask]]
パラメーター
spNo:スプライト番号
u,v,w,h:衝突領域の始点x,y,幅w,高さh
scale:スケール(拡大縮小と同期するか)(省略時:FALSE)
mask:マスク(衝突とみなすかのグループ分け)(省略時:-1(&HFFFFFFFF))
戻り値
u,v,w,h:衝突領域の始点x,y,幅w,高さh
scale:スケール
mask:マスク
解説
スプライト同士の衝突判定のルールを設定・取得します。
パラメーターを省略して設定命令を実行すると、未設定の項目は全て初期値にリセットされます。
また、SPCOLを実行していないとSPHITSPなどで衝突とみなされません。(「SPCOL 0」などだけでもOK)
スプライト番号はSPSETで設定済みである必要があります。
この値が未設定の時はスプライト全体が衝突判定に使われるため、表示上は当たっていなさそうな場合も衝突と判断されてしまいます。
そこで、衝突判定領域を中央付近だけにしたり、他にも剣の先にだけ当たり判定をしたい、などで使用します。
始点U,Y(原点からの相対座標)、幅、高さで衝突範囲を表します。
始点U,Vにはマイナスも設定できます。
u,v,w,h は 4,4,8,8
16x16で、原点が中央のキャラの判定領域を中心付近のみにする
u,v,w,h は -4,-4,8,8
16x16で、原点が下中央のキャラの判定領域を中心付近のみにする
u,v,w,h は -4,-11,8,8
デフォルトはFALSEで、キャラが拡大/縮小しても衝突領域は変わりません。
衝突領域も変化させる場合はTRUEを設定します。
グループ分けには&H00000000~FFFFFFFFの32bitの数値を使用し、ANDで判定して結果が0の場合は衝突していないと判断されます。
マスク未設定時の初期値は-1(&HFFFFFFFF、どれにも衝突とみなす)です。
・自機:SPCOL 0,,&B01
・自弾:SPCOL 1,,&B10
・敵 :SPCOL 2,,&B11
&B 10
AND 00 「衝突なし」と判断
&B 11
AND 10 「衝突」と判断
&B 11
AND 01 「衝突」と判断
登場キャラをグループ分けして、どれとどれをヒットさせるか決める
<手順2>
上表の「1」の部分を、2進数の1ビットずつに割り振る(「1」が4つあるので4桁)
※0ビット目(右端)が「自機と敵空中」、1ビット目が「自機と敵弾」、・・・・
※2進数でそのまま「SPCOL 0,,&B0011」と指定してもよい
パラメーターを省略して設定命令を実行すると、未設定の項目は全て初期値にリセットされます。
また、SPCOLを実行していないとSPHITSPなどで衝突とみなされません。(「SPCOL 0」などだけでもOK)
スプライト番号はSPSETで設定済みである必要があります。
始点X,Y,幅W,高さH
スプライトキャラのどの部分で当たり判定を行うかの領域です。この値が未設定の時はスプライト全体が衝突判定に使われるため、表示上は当たっていなさそうな場合も衝突と判断されてしまいます。
そこで、衝突判定領域を中央付近だけにしたり、他にも剣の先にだけ当たり判定をしたい、などで使用します。
始点U,Y(原点からの相対座標)、幅、高さで衝突範囲を表します。
始点U,Vにはマイナスも設定できます。
U,V,W,Hの設定例
16x16で、原点が左上のキャラの判定領域を中心付近のみにするu,v,w,h は 4,4,8,8
16x16で、原点が中央のキャラの判定領域を中心付近のみにする
u,v,w,h は -4,-4,8,8
16x16で、原点が下中央のキャラの判定領域を中心付近のみにする
u,v,w,h は -4,-11,8,8
スケール
スプライトキャラを拡大/縮小した時に、衝突範囲も同じく拡大/縮小させるかの設定です。デフォルトはFALSEで、キャラが拡大/縮小しても衝突領域は変わりません。
衝突領域も変化させる場合はTRUEを設定します。
マスク
衝突判定を行うものと行わないもの(ゲームでいう味方同士・敵同士・敵の弾と敵など)のグループ分けをします。グループ分けには&H00000000~FFFFFFFFの32bitの数値を使用し、ANDで判定して結果が0の場合は衝突していないと判断されます。
マスク未設定時の初期値は-1(&HFFFFFFFF、どれにも衝突とみなす)です。
マスク値の設定例1
以下の3種類のキャラを使用する場合・自機:SPCOL 0,,&B01
・自弾:SPCOL 1,,&B10
・敵 :SPCOL 2,,&B11
自機と自弾 の判定
&B 01&B 10
AND 00 「衝突なし」と判断
自弾と敵 の判定
&B 10&B 11
AND 10 「衝突」と判断
自機と敵 の判定
&B 01&B 11
AND 01 「衝突」と判断
マスク値の設定例2(シューティングゲーム)
<手順1>登場キャラをグループ分けして、どれとどれをヒットさせるか決める
自機 | 自機Op. | 自弾 | 敵空中 | 敵地上 | 敵弾 | |
---|---|---|---|---|---|---|
自機 | - | 0 | 0 | 1 | 0 | 1 |
自機分身 | - | - | 0 | 0 | 0 | 0 |
味方の弾 | - | - | - | 1 | 1 | 0 |
敵空中 | - | - | - | - | 0 | 0 |
敵地上 | - | - | - | - | - | 0 |
敵の弾 | - | - | - | - | - | - |
上表の「1」の部分を、2進数の1ビットずつに割り振る(「1」が4つあるので4桁)
※0ビット目(右端)が「自機と敵空中」、1ビット目が「自機と敵弾」、・・・・
マスク値 | ||
---|---|---|
2進数 | 10進数 | |
自機 | &B0011 | 3 |
自機Op. | &B0000 | 0 |
自弾 | &B1100 | 12 |
敵空中 | &B0101 | 5 |
敵地上 | &B1000 | 8 |
敵弾 | &B0010 | 2 |
サンプルコード
参照
SPPAGE
スプライトキャラの定義に使用するグラフィックページを指定・取得
SPCLIP
スプライトキャラを表示する範囲を指定
SPDEF
スプライトキャラの定義データを変更・取得
SPSET
スプライト番号にキャラクターをセット
SPCLR
スプライト番号のキャラ設定をクリア
SPSHOW
スプライトを表示状態にする
SPHIDE
スプライトを非表示状態にする
SPHOME
スプライトキャラの原点座標を変更・取得
SPOFS
スプライトキャラの表示座標を変更・取得
SPROT
スプライトキャラの回転角度を変更・取得
SPSCALE
スプライトキャラの表示倍率を変更・取得
SPCOLOR
スプライトキャラの色合いを変更・取得
SPCHR
スプライトキャラのキャラ種類を変更・取得
SPLINK
スプライトの同士をリンク・取得
SPUNLINK
スプライトの同士のリンクを解除
SPANIM
スプライトにアニメーションを設定
SPSTOP
スプライトのアニメーションを一時停止
SPSTART
スプライトのアニメーションを再開
SPCHK
スプライトのアニメーション状況を取得
SPVAR
スプライト用内部変数の値を設定・取得
SPCOL
スプライトの衝突判定のルールを設定・取得
SPCOLVEC
スプライトの衝突判定用に移動量を設定
SPHITSP
スプライト同士の衝突判定
SPHITRC
スプライトと指定領域との衝突判定
SPHITINFO
スプライトの最後の衝突結果を取得
SPUSED
スプライト番号が使用されているかチェック
SPFUNC
スプライト番号にコールバック処理を割り当て