English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る進む

8-11. プライオリティ

 セガサターンでは、描画する全ての面種に対してプライオリティと呼ばれる描画優先順位を設定することが可能です。プライオリティを使用することにより、例えば複数のスクロール面を背景用と文字表示用に分けて描画し、 間に3Dポリゴン面を挟み込んだりすることが可能になります。ただし、バック画面は常に最背面に描画されます。

図8-28 プライオリティイメージ

 SGLでスクロールに対してプライオリティを設定するには、スクロール面種に対応したライブラリ関数“slPriorityNbg0〜3”、“slPriorityRbg0”を使用してください。

【void slPriorityNbg0〜3 ( Uint16 priority_num ) ;】
【void slPriorityRbg0 ( Uint16 priority_num ) ;】
 それぞれのスクロール面に対して、プライオリティを設定します。
パラメータにはプライオリティ番号と呼ばれる0〜7までの値を代入します。
プライオリティ番号がより大きな値であるほどスクロール面は前面に描画されます。
また、0が指定された場合、そのスクロール面は透明として扱われ実際は描画されません。
複数の面種に同じプライオリティ番号を割り振った場合のプライオリティは、下図を参照してください。

図8-29 プライオリテイ番号が等しい場合のプライオリティ>
● プライオリティ番号が等しい場合のプライオリティ ●

SPRITE>RBG0>NBG0>NBG1>NBG2>NBG3

高い(前面)←−−−−−−−−−−−→低い(背面)

注)POLYGONは、SPRITEに含まれます。

 また、SGLではデフォルト状態で、各描画面に対して次のようにプライオリティを割り振ってあります。

表8-25 デフォルト状態での各描画面のプライオリティ
プライオリティナンバー
 7  6  5  4  3  2  1  0 
描 画 面NBG0SPRITESPRITERGB0NBG1NBG2NBG3未設定
注)ポリゴン面はSPRITEに含まれます。

 次のサンプルプログラム(リスト8-9)はSGLライブラリ関数“slPriorityNbg0〜3,Rbg0”を実際に使用して、スクロールのプライオリティ処理を実現したものです。

リスト8-9 sample_8_11:スクロールの表示優先

/*----------------------------------------------------------------------*/
/*	Scroll Priority Change						*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"
#include	"ss_scrol.h"

#define		NBG1_CEL_ADR		( VDP2_VRAM_B1 + 0x02000 )
#define		NBG1_MAP_ADR		( VDP2_VRAM_B1 + 0x12000 )
#define		NBG1_COL_ADR		( VDP2_COLRAM + 0x00200 )
#define		RBG0_CEL_ADR		VDP2_VRAM_A0
#define		RBG0_MAP_ADR		VDP2_VRAM_B0 
#define		RBG0_PAR_ADR		( VDP2_VRAM_A1 + 0x1fe00 )
#define		BACK_COL_ADR		( VDP2_VRAM_A1 + 0x1fffe )

void ss_main(void)
{
	Uint16 PryNBG = 4 , PryRBG = 1, PryWRK;
	FIXED yama_posx = SIPOSX , yama_posy = SIPOSY;
	ANGLE ascii_angz = DEGtoANG(0.0);

	slInitSystem(TV_320x224,NULL,1);
	slTVOff();
	slPrint("Sample program 8.11" , slLocate(9,2));

	slColRAMMode(CRM16_1024);
	slBack1ColSet((void *)BACK_COL_ADR , 0);

	slCharNbg1(COL_TYPE_256 , CHAR_SIZE_1x1);
	slPageNbg1((void *)NBG1_CEL_ADR , 0 , PNB_1WORD|CN_12BIT);
	slPlaneNbg1(PL_SIZE_1x1);
	slMapNbg1((void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR);
	Cel2VRAM(yama_cel , (void *)NBG1_CEL_ADR , 31808);
	Map2VRAM(yama_map , (void *)NBG1_MAP_ADR , 32 , 16 , 1 , 256);
	Pal2CRAM(yama_pal , (void *)NBG1_COL_ADR , 256);

	slRparaInitSet((void *)RBG0_PAR_ADR);
	slCharRbg0(COL_TYPE_256 , CHAR_SIZE_1x1);
	slPageRbg0((void *)RBG0_CEL_ADR , 0 , PNB_1WORD|CN_10BIT);
	slPlaneRA(PL_SIZE_1x1);
	sl1MapRA((void *)RBG0_MAP_ADR);
	slOverRA(2);
	Map2VRAM(ascii_map ,(void *)RBG0_MAP_ADR , 32 , 4 , 0 , 0);

	slScrPosNbg1(yama_posx , yama_posy);
	slDispCenterR(toFIXED(160.0) , toFIXED(112.0));
	slLookR(toFIXED(128.0) , toFIXED(24.0));

	slPriorityNbg1(PryNBG);
	slPriorityRbg0(PryRBG);

	slScrAutoDisp(NBG0ON | NBG1ON | RBG0ON);
	slTVOn();

	while( 1 ){
		if(yama_posx >= (SX + SIPOSX)) {
			PryWRK = PryNBG;
			PryNBG = PryRBG;
			PryRBG = PryWRK;
			slPriorityNbg1(PryNBG);
			slPriorityRbg0(PryRBG);
			yama_posx = SIPOSX;
		}

		slScrPosNbg1(yama_posx , yama_posy);
		yama_posx += POSX_UP;

		slZrotR( ascii_angz );
		ascii_angz += DEGtoANG(1.0);

		slSynch();
	} 
}

フロー8-13 sample_8_11:スクロールの表示優先


戻る進む
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997