スプライトおよびBG画面について
概要
スプライトとは、登録されたパターンを重ね合わせを意識せずに表示出来る機能です。
バックグラウンド(BG)は、スプライトを(重ねず)並べ、背景として使うものです。
一端パターンを登録してしまえば、座標を変更するだけで移動などができます。
X68000にはハード的にスプライトとBGが用意されていましたが、
X-BASIC'ではソフトウエア的に(フレームバッファー方式で)実現しています。
両者は基本的に同じ動作をしますが、完全に同じ見え方を保証するものではありません。
!!誠に申し訳ありませんが、技術不足で現在のスプライトはX68000ほどスムースに動きません。
スプライトの仕様
スプライトは、パターンを表示するプレーンに結びつけて制御します。
複数のプレーンに同じパターンを、同じ色もしくは色違いで割り付けることも出来ます。
各プレーンは、座標の他いくつかの表示属性を持ちます。
この属性はスプライトスクロールレジスタと呼ばれる領域に記録されます。
プレーン毎に持つ属性:
表示座標 | int範囲で自由 |
使うパレットブロック番号 | 1~31 ; 0は予約で利用不可。iOS型パターンの時は無視される |
使うパターン番号 | 0~511 |
反転設定 |
SPRITE_FLIP_NONE | 反転なし(省略時)
 |
SPRITE_FLIP_HORIZONTAL | 水平反転
 |
SPRITE_FLIP_VERTICAL | 垂直反転
 |
SPRITE_FLIP_HORIZONTAL_VERTICAL | 水平&垂直反転
 |
|
表示優先順位 |
SPRITE_PRW_HIDE | 表示しない |
SPRITE_PRW_BG0BG1SP | BG0>BG1>スプライト
 |
SPRITE_PRW_BG0SPBG1 | BG0>スプライト>BG1
 |
SPRITE_PRW_SPBG0BG1 | スプライト>BG0>BG1(省略時)
 |
|
スプライトは、プレーン番号が小さいほど手前に=優先順位が高く、表示されます。
スプライト・バックグラウンド・テキスト・グラフィック画面は重ね合わせができます。
その優先順位はvpriority()で設定します。
スプライトとバックグラウンドの優先順位は、プレーン単位で指定できます。
表示座標の設定は自由で、負数から画面幅を超える座標まで1ドット単位で指定できます。
実際に表示されるのは、実画面内に入った部分のみです。
これにより、画面内での移動だけでなく、画面の外から中(もしくはその逆)の移動でも、処理を分ける必要がなくなります。
グラフィック座標と異なりスプライト座標は整数ですが、基本的に両者に違いはありません。
X68000実機と異なり、x方向に並べられる数に上限はありません。
パターンは、16*16ドットで512パターンが登録できます。
パターンはint型またはchar型1次元配列で与えます。
1要素が1ドットに相当します。
int型の時は、1要素は合成RGB値による色(以下実色)です。これをiOS型と呼びます。
char型の時は、1要素はパレットコードです。これをX68型と呼びます。
要素番号とドット位置の関係は以下の通りになります。
同じパターンで色だけ変えたい場合はパレットコードを使うと便利ですが、
パレットコードは0~15なので、1パターン中で同時に使える色は16色に限られます。
X68型(パレットコードで指定)の場合、別途パレットブロックにて実色との変換テーブルを用意する必要があります。
パレットコードによるパターン定義は、(上位)X68互換です。
パレットコードから実色への変換はプレーン毎の実表示時に行われ、以下の通り処理されます。
- スクロールレジスタからパレットブロックを決定する
- パターン中からパレットコードを読み出す
- パレットブロックから、そのパレットコードに相当する実色を読み出す
なお、iOS型のパターンに対してパレットブロックを設定しても無視されます。
実色が0の場合は透明色と見なし、下になるパターンが透けて見えます。
パレットコードが0でも、その実色が0でない場合は透明になりません。
実色で黒=&h000000ffは透過しません。
x68Color2iOSColor()でX68の色をiOS色に変換したとき、
X68で透過色となる黒&h0000はiOSでは&h000000ffの黒となるため、透過しません。
X68で透過していたスプライトがiOS上で透過しない場合は、ほとんどはこれが原因です。
BG画面の仕様
BG画面は、スプライトのパターンを画面上に並べて表示するものです。
スプライトと異なり、画面一杯に並べることができます。
パターン領域はスプライトと共通です。
BG画面のサイズは2048*2048固定です。
1パターンのサイズも16*16で変化しません。
(このあたりはX68000実機とは異なります。)
BGの表示開始座標の設定は自由で、負数から画面幅を超える座標まで1ドット単位で指定できます。
実際に表示されるのは、実画面内に入った部分のみです。
BG画面サイズは常に表示画面より広なっているため、容易にスクロールが可能です。
パターンの並べ方を指定するのがBGテキストページで、サイズは常に128*128となります。
その各座標位置にパターンを設定します。
BGテキストページの座標(x,y)と表示位置の関係:
0,0 |
1,0 |
~ |
126,0 |
127,0 |
0,1 |
1,1 |
~ |
126,1 |
127,1 |
~ |
|
~ |
0,127 |
1,127 |
~ |
126,127 |
127,127 |
BGテキストページは2ページ存在し、それを2枚のBG画面のいずれか(または両方)に設定できます。
2枚のBG画面の優先順位は常にBG0>BG1です。
BGは、sp_disableBG0SPBG1(YES)を設定していない場合、実表示画面数に応じて多くのメモリを消費します。
ご注意ください。
使用上の注意
- 連続で複数のスプライト/BGの更新を行うときは、出来るだけsp_halt(ON)~sp_halt(OFF)でくくるようにしてください。
速度向上とちらつき防止が出来ます(特にBG更新は重く、ちらつきやすくなっています)。
- 現在のバージョンのスプライトはかなり重たい処理ですので、初代iPadなど古い機種ではもたつきがあります。
(iPod touch4/iPad2以降ではおおよそ問題ないことを確認しています。)
X68000実機との違い(関数以外)
項目 | iOS | X68実機 |
プレーン数 | 256 | 128 |
パターン数 | 512 | 256 |
パレットブロック数 | 32-1 | 16-1 |
座標 | int範囲で自由 | -16~1007 |
横並び数 | 無制限 | 32枚 |
パターン内要素 | 実色またはパレットコード | パレットコード |
BG画面数 | 常に2 | 画面解像度およびスプライト枚数により0~2 |
BG 1パターンサイズ | 常に16*16 | 512*512のときは16*16,256*256の時は8*8 |
BG画面サイズ | 常に2048*2048 | 512*512のときは1024*1024,256*256の時は512*512 |
BGテキストページサイズ | 128*128 | 64*64 |
利用可能画面解像度 | 全て | 512*512,256*256 |