Additionally, if the scroll display position moves up, down, left, or right, and the scroll exceeds the display area, the scroll will start drawing again from the opposite end.
< Figure 8-19 Processing when scrolling exceeds the display area>
/*------------------------------------------------ ----------------------*/
/* Graphic Scroll [X axis] */
/*------------------------------------------------ ----------------------*/
#include "sgl.h"
#include "ss_scroll.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();
}
}
Flow 8-3 sample_8_8_1: Horizontal scroll movement
/*------------------------------------------------ ----------------------*/
/* Graphic Scroll [X & Y axis ] */
/*------------------------------------------------ ----------------------*/
#include "sgl.h"
#include "ss_scroll.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();
}
}
Flow 8-4 sample_8_8_2: Scroll vertical and horizontal movement Figure 8-20 Scroll scaling image
| Reduce settings | |||
|---|---|---|---|
| 1x | 1/2 times | 1/4 times | |
Enlarge/reduce range | 1~256x | 1/2 to 256 times | 1/4 to 256 times |
The following sample program (Listing 8-4) is an example of actually scaling a normal scroll screen using SGL library functions.
/*------------------------------------------------ ----------------------*/
/* Graphic Scroll & Expansion & Reduction */
/*------------------------------------------------ ----------------------*/
#include "sgl.h"
#include "ss_scroll.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();
}
}
★ SGL User's Manual ★ PROGRAMMER'S TUTORIAL



