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

8-8. ノーマルスクロール画面

 ノーマルスクロール画面“NBG0〜3”は、スクロールの縦横移動と拡大縮小(ただし、NBG0,NBG1のみ)が可能です。 ここでは、それら2つの機能をサンプルプログラムと共に解説していきます。

 ノーマルスクロール画面の移動

 ノーマルスクロール画面“NBG0〜3”は、スクロール表示位置の変更という形で、スクロールの縦横移動が可能です。
これをイメージ化したものが下図になります。

<図8-18 スクロール表示位置イメージ>

 スクロール表示位置の移動には、ライブラリ関数“slScrPosNbg0〜3”を使用します。
“slScrPosNbg0〜3”は、スクロールの初期位置の設定にも使用します。

【void slScrPosNbg0〜3 ( FIXED posx , FIXED posy ) ;】
 ノーマルスクロール画面“Nbg0〜3”の表示開始位置を設定します。
スクロール表示位置は、スクロールマップ上のどの位置にモニターを配置するかで決定され、モニターの左上を代表点とし、パラメータとしてスクロールマップ上の一点を指定します。
パラメータには、スクロール座標系を表すXY座標値を代入します。

 また、スクロール表示位置が上下左右に移動し、スクロールが表示エリアを越えた場合、スクロールは逆端から再び描画を開始します。

<図8-19 スクロールが表示領域を超えた場合の処理>

 以下の2つのサンプルプログラム(リスト8-2、8-3)は、それぞれSGLライブラリ関数を用いて、スクロールの横移動および縦横移動を実現したものです。

リスト8-2 sample_8_8_1:スクロールの横移動

/*----------------------------------------------------------------------*/
/*	Graphic Scroll [X axis]						*/
/*----------------------------------------------------------------------*/
#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		BACK_COL_ADR		( VDP2_VRAM_A1 + 0x1fffe )

void ss_main(void)
{
	FIXED yama_posx = SIPOSX , yama_posy = SIPOSY;

	slInitSystem(TV_320x224,NULL,1);
	slTVOff();
	slPrint("Sample program 8.8.1" , 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);

	slScrPosNbg1(yama_posx , yama_posy);
	slScrAutoDisp(NBG0ON | NBG1ON);
	slTVOn();

	while(1) {
		slScrPosNbg1(yama_posx , yama_posy);
		yama_posx += POSX_UP;

		slSynch();
	} 
}

フロー8-3 sample_8_8_1:スクロールの横移動

リスト8-3 sample_8_8_2:スクロールの縦横移動

/*----------------------------------------------------------------------*/
/*	Graphic Scroll [X & Y axis ]					*/
/*----------------------------------------------------------------------*/
#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		BACK_COL_ADR		( VDP2_VRAM_A1 + 0x1fffe )

void ss_main(void)
{
	FIXED  yama_posx = SIPOSX , yama_posy = SIPOSY;
	Uint16 scroll_flg = YOKO;
	
	slInitSystem(TV_320x224,NULL,1);
	slTVOff();
	slPrint("Sample program 8.8.2" , 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);

	slScrPosNbg1(yama_posx , yama_posy);
	slScrAutoDisp(NBG0ON | NBG1ON);
	slTVOn();

	while(1){
		if (scroll_flg == YOKO) {
			if(yama_posx >= (SX * 2 + SIPOSX)) {
				scroll_flg = TATE;
				yama_posx = SIPOSX;
			} else yama_posx += POSX_UP;
		} else if (scroll_flg == TATE) {
			if(yama_posy >= (SY * 2 + SIPOSY)) {
				scroll_flg = YOKO;
				yama_posy = SIPOSY;
			} else yama_posy += POSY_UP;
		}
		slScrPosNbg1(yama_posx , yama_posy);

		slSynch();
	} 
}

フロー8-4 sample_8_8_2:スクロールの縦横移動

 ノーマルスクロール画面の拡大縮小

 ノーマルスクロール画面の内“NBG0,NBG1”は、スクロールの拡大縮小(最大:1/4〜256倍)が可能です。これをイメージ化したものが下図になります。

図8-20 スクロール拡大縮小イメージ

 ノーマルスクロール画面“NBG0,NBG1”を用いたスクロールの拡大縮小は、スクロール機能設定の縮小設定により、縮小可能な範囲が異なってきます。

表8-20 縮小設定による拡大縮小範囲の変化

縮小設定
1倍1/2倍1/4倍
拡 大 縮 小 範 囲
1〜256倍1/2〜256倍1/4〜256倍

 SGLでノーマルスクロール画面の拡大縮小を行うには、ノーマルスクロール画面“NBG0,NBG1”にそれぞれ対応したライブラリ関数“slZoomNbg0,1”を使用してください。

  

【void slZoomNbg0,1 ( FIXED scale_x , FIXED scale_y ) ;】
 ノーマルスクロール画面“NBG0,NBG1”の拡大縮小を行います。
パラメータには、スクロール縦横の倍率を逆数で代入します。
例えば、2倍に拡大したい場合はパラメータに1/2を代入、1/2倍に縮小したい場合は2を代入します。 縮小範囲は、縮小設定によって選択可能な限界値が変化します(上表参照)。

 拡大縮小関数のパラメータ設定について

 スクロールの拡大縮小に使用するパラメータには、希望する倍数の逆数を代入してやる必要があります(例:2.0倍を希望するなら1/2)。
これは、パラメータの指す値がそのままスケール値を表していないことに起因します。
拡大縮小関数のパラメータとして代入される値は、スクロールを1ドット表示した後、次に表示するドットまでの移動量を指し示します。
移動量として2.0を指定すると、スクロールは1ドットずつ飛ばして次のドットを表示していき、結果的にスクロールは1/2倍に縮小されて描画されます。
移動量が1.0なら1倍、移動量が2.0なら1/2倍、移動量が1/2なら同じドットを2回ずつ表示するため結果的に2.0倍になって表示されます。

 次のサンプルプログラム(リスト8-4)は、SGLライブラリ関数を用いて、実際にノーマルスクロール画面の拡大縮小を行った例です。

リスト8-4 sample_8_8_3:スクロールの拡大縮小
/*----------------------------------------------------------------------*/
/*	Graphic Scroll & Expansion & Reduction				*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"
#include	"ss_scrol.h"

#define		NBG1_CEL_ADR		VDP2_VRAM_B0
#define		NBG1_MAP_ADR		( VDP2_VRAM_B0 + 0x10000 )
#define		NBG1_COL_ADR		( VDP2_COLRAM + 0x00200 )
#define		BACK_COL_ADR		( VDP2_VRAM_A1 + 0x1fffe )

void ss_main(void)
{
	FIXED  yama_posx = toFIXED(0.0) , yama_posy = toFIXED(0.0);
	FIXED  yama_zoom = toFIXED(1.0);
	FIXED  up_down  = toFIXED(-0.1);

	slInitSystem(TV_320x224,NULL,1);
	slTVOff();
	slPrint("Sample program 8.8.3" , 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_10BIT);
	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 , 0);
	Pal2CRAM(yama_pal , (void *)NBG1_COL_ADR , 256);

	slZoomModeNbg1(ZOOM_HALF);

	slScrPosNbg1(yama_posx , yama_posy);
	slScrAutoDisp(NBG0ON | NBG1ON);
	slTVOn();

	while(1){
		if(yama_posx >= SX) {
			if(yama_zoom >= toFIXED(1.5))
				up_down = toFIXED(-0.1);
			else if(yama_zoom <= toFIXED(0.7))
				up_down = toFIXED(0.1);
			yama_zoom += up_down;
			yama_posx = toFIXED(0.0);
			slZoomNbg1(yama_zoom , yama_zoom);
		}
		slScrPosNbg1(yama_posx , yama_posy);
		yama_posx += POSX_UP;

		slSynch();
	} 
}

フロー8-5 sample_8_8_3:スクロールの拡大縮小


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