スプライト重ね合わせ処理

(New:1997/7/11)

このページにおける「スプライト重ね合わせ処理」とは、2枚の強化スプライトで1ライン3色(+透明)のスプライトを表示することをいいます。

強化スプライトは1ラインあたり1色(+透明)しかなく、それを2枚重ねた(同じ座標に表示した)としても、通常は1ラインあたり2色(+透明)しか使えないはずです。 しかし、あることをすれば、ちょっとした制約つきですが、上記の通り2枚重ねて1ラインあたり3色(+透明)の表示が可能となります。 こうした「スプライト重ね合わせ処理」は、おそらく多くの市販のソフトに用いられてきたものだと考えられます。

ここでは、スプライト重ね合わせ処理の実現方法を、BASICと機械語、それぞれの場合にわけて書いてみました。 さあ君も重ね合わせのマジックに挑戦だ! 小さいものならとりあえずゲームの自キャラだけでもスプライト重ね合わせ処理をやってみよう。 結構見栄えよくなると思うぞ。

BASIC編

BASICにおいて、SCREEN 4以降でスプライトの色をライン毎に指定する時に、COLOR SPRITE$という命令を使いますね。 BASICでスプライト重ね合わせ処理を実現するには、このCOLOR SPRITE$命令を活用します。
COLOR SPRITE$命令の書式は以下のようなものですね。
	COLOR SPRITE$(スプライト面番号)="文字式"
文字式は16字以下の文字列で、1文字目には1ライン目の色情報を示す文字、2文字目には2ライン目の色情報を示す文字、......n文字目にはnライン目の色情報を示す文字が入りますね(nは1以上16以下の整数)。

「色情報を示す文字」とは、色情報をアスキーコードとする文字です。 「色情報」とは普通、そのラインのカラー番号(0〜15の整数)です。 例えば、8×8ドットの、面番号0のスプライト面を(全8ラインについて)緑色(カラー番号2)にしたい場合を考えてみましょう。 この場合、全8ラインについて、色情報は2となり、色情報を示す文字は、アスキーコード2の文字すなわち

	CHR$(2)
となります。 したがって、色の指定プログラムは、
	COLOR SPRITE$(0)=CHR$(2)+CHR$(2)+CHR$(2)+CHR$(2)+CHR$(2)+CHR$(2)+CHR$(2)+CHR$(2)
と書けばいいわけです。

ところで、色情報で与えられる情報はカラー番号だけではありません。 カラー番号に一定の値を足したものを色情報とすることにより、そのラインを32ドット左にずらしたり、衝突判定をさせなかったり、そしてスプライト重ね合わせ処理を実現することができます。
スプライト重ね合わせ処理を実現したい場合、重ね合わせる2枚のスプライト面(の各ライン)について、その色情報を以下のようにします。

この2枚のスプライトを重ねると、ドットが重なる部分が3番目の色になり、1ライン3色(+透明)表示が実現されるというわけです。
3番目のカラー番号は、重なる2つのカラー番号の論理和(OR)になります。 論理和についてはここでは述べませんが、BASICで以下のように書けば、3番目のカラー番号がモニタに出力されます。
	? 1枚目の(ラインの)カラー番号 OR 2枚目の(ラインの)カラー番号
例えば、1枚目のカラー番号が2、2枚目のカラー番号が4の場合、3番目のカラー番号は、
	? 2 OR 4
	6
	Ok
	■
で、6になることが分かります(「Ok」の部分、要するにプロンプトは「ready」とか「スバル」(自分の場合)とかになるかも知れませんが(^^;))。 2と4は逆にしても構いません。

このように、スプライト重ね合わせ処理による「3番目の色」は、重ね合わせる2つの色の組み合わせによって決まるので、配色には気をつけましょう。

サンプルプログラム

※MSX2(VRAM 64KB以上)以降の機種で動きます。turbo Rの高速モードも可。
1000 DEFINT A-Z
1010 SCREEN 5,2:COLOR 15,1:CLS
1020 A$="":FOR I=0 TO 31:A$=A$+CHR$(&HFF):NEXT:SPRITE$(0)=A$
1030 A$="":FOR I=0 TO 15:A$=A$+CHR$(2):NEXT:COLOR SPRITE$(0)=A$
1040 A$="":FOR I=0 TO 15:A$=A$+CHR$(64+4):NEXT:COLOR SPRITE$(1)=A$
1050 PUT SPRITE0,(116,92),,0:PUT SPRITE1,(124,92),,0
1060 GOTO 1060
プログラムを実行すると、画面上に3色の四角が現れます。 正方形のパターンの、(全ラインが)カラー番号2と4のスプライト面を「横に」ずらして重ね合わせています(縦にずらすと、面番号が大きい方のスプライト面の、重なっていない部分が表示されません)。 ドットが重なっていない部分(左右のもの)はそのままカラー番号2、4の色(緑、青)が出ていますが、ドットが重なっている部分(中央のもの)は、カラー番号6(=2 OR 4)の色(赤)が出ています。
CTRLキーとSTOPキーを同時に押すと終了します。

プログラム解説

1000行
分からない方は、とりあえず高速化のためのおまじない位に考えて下さい。
1010行
「スプライト重ね合わせ処理」はSCREEN 4以上でのみ有効な技。 サンプルではSCREEN 5を使用。
サンプルでは16×16ドット標準サイズのスプライトを指定。
1020行
スプライトパターン定義。 ここでは単なる正方形を定義(全てのドットを埋める)。
1030行
この行と次の1040行で、重ね合わせる2枚のスプライト面の色情報を定義。 話を簡単にするため、各スプライト面について、全てのラインを同じ色情報としています。
1030行ではこのうち、面番号が小さい方のスプライト面(面番号0、カラー番号2:緑)の色情報を定義しています。 面番号が小さい方なので、色情報はカラー番号だけ(=2)としています。
1040行
1030行に続き、1040行では面番号が大きい方のスプライト面(面番号1、カラー番号4:青)の色情報を定義しています。 面番号が大きい方なので、色情報はカラー番号に64を足したもの(=64+4)としています。
1050行
2枚のスプライト面を横にずらして表示。
1060行
単なるループ。

※ビット演算が分かる方へ
色情報は、ビット単位ではこのページのような構成になっています。 このうち、重ね合わせ処理で重要なのがbit6(CC bit)。 スプライト重ね合わせ処理を実現するには、重ね合わせる2枚のスプライト面のうち、面番号が大きい方のスプライト面(の各ライン)について、色情報のCC bitを1にしなければなりません。 「64を足す」というのはすなわち、bit6(CC bit)を1にすることに相当するわけです。

機械語編

機械語でスプライト重ね合わせ処理を実現するには、スプライト・カラーテーブルを活用します。
スプライトカラー・テーブルはVRAM上の領域で、スプライトの色情報を格納するところです。 スプライトカラー・テーブルの先頭アドレスをSCTとすると、面番号mのスプライト面のラインnの色情報は、
	(SCT + m ×16 + n)番地
に格納します。

※スプライトカラー・テーブルの先頭アドレス(SCT)は、スプライトアトリビュート・テーブルの先頭アドレスから512を引くことにより求めることが出来ます。

スプライト重ね合わせ処理を実現するには、重ね合わせる2枚のスプライト面(の各ライン)について、その色情報を以下のようにします。

この2枚のスプライトを重ねると、ドットが重なる部分が3番目の色になり、1ライン3色(+透明)表示が実現されます。
3番目のカラー番号は、重なる2つのカラー番号の論理和(OR)になります。 例えば、1枚目のカラー番号が2、2枚目のカラー番号が4の場合、3番目のカラー番号は、
	2 OR 4 = 6
で、6になります。

このように、スプライト重ね合わせ処理による「3番目の色」は、重ね合わせる2つの色の組み合わせによって決まるので、配色には気をつけましょう。


強化スプライト
スプライトモード2。 MSX2以降の機種において、SCREEN 4以上で使うスプライトのこと。
論理和の求め方補足
MS-Windowsシリーズ(マイクロソフト社)に標準装備されている、「電卓」でも求めることができます。 「Or」ボタンが見当たらない場合は、「電卓の種類」を「関数電卓」にしてみましょう。

MSXの適当手帳 MSX駅 西山駅