また、スクロール表示位置が上下左右に移動し、スクロールが表示エリアを越えた場合、スクロールは逆端から再び描画を開始します。
<図8-19 スクロールが表示領域を超えた場合の処理>
/*----------------------------------------------------------------------*/ /* 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(); } }
/*----------------------------------------------------------------------*/ /* 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-20 スクロール拡大縮小イメージ
縮小設定 | |||
---|---|---|---|
1倍 | 1/2倍 | 1/4倍 | |
拡 大 縮 小 範 囲 | 1〜256倍 | 1/2〜256倍 | 1/4〜256倍 |
次のサンプルプログラム(リスト8-4)は、SGLライブラリ関数を用いて、実際にノーマルスクロール画面の拡大縮小を行った例です。
/*----------------------------------------------------------------------*/ /* 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(); } }