#2727 - Nyundi - Tue Feb 11, 2003 4:39 pm
Hi! I'm new to GBAdev, and I'm having some problems getting my background to scroll. I don't know that it's necessarily a problem with my background, as it is with input. Not really sure, anyway, the background displays fine, and (using VisualBoy) I can see that the entire thing is loaded into memory, but no amount of button pushing makes it scroll. Here's the relevant code, if anyone has any suggestions, let me know! Thanks alot!
-Jesse
int main(void)
{
u16 loop;
u16* temp;
SetMode(MODE_2 | OBJ_MAP_1D);
sunsetBg.number = 2;
sunsetBg.charBaseBlock = 0;
sunsetBg.screenBaseBlock = 8;
sunsetBg.colorMode = BG_COLOR_256;
sunsetBg.size = ROTBG_SIZE_512x512;
sunsetBg.mosaic = 0;
sunsetBg.x_scroll = 0;
sunsetBg.y_scroll = 0;
EnableBackground(&sunsetBg);
for(loop = 0; loop < 256; loop++)
{
BGPaletteMem[loop] = TileSetPalette[loop];
}
for(loop = 0; loop < TileSet_WIDTH * TileSet_HEIGHT / 2; loop++)
{
sunsetBg.tileData[loop] = TileSetData[loop];
}
temp = (u16*)JungleBackground;
for(loop = 0; loop < 64 * 64 / 2; loop++)
{
sunsetBg.mapData[loop] = temp[loop];
}
WaitForVsync();
while(true)
{
UpdateBackground(&sunsetBg);
WaitForVsync();
GetInput();
}
return 0;
}
void WaitForVsync()
{
while((volatile u16)REG_VCOUNT != 160){}
}
void GetInput()
{
if(!(*KEYS & KEY_UP))
{
sunsetBg.y_scroll++;
}
if(!(*KEYS & KEY_DOWN))
{
sunsetBg.y_scroll--;
}
if(!(*KEYS & KEY_LEFT))
{
sunsetBg.x_scroll++;
}
if(!(*KEYS & KEY_RIGHT))
{
sunsetBg.x_scroll--;
}
}
void EnableBackground(Bg *bg)
{
u16 temp;
bg->tileData = (u16*)CharBaseBlock(bg->charBaseBlock);
bg->mapData = (u16*)ScreenBaseBlock(bg->screenBaseBlock);
temp = bg->size | (bg->charBaseBlock<<CHAR_SHIFT) |
(bg->screenBaseBlock<<SCREEN_SHIFT) | bg->colorMode |
bg->mosaic;
switch(bg->number)
{
case 0:
{
REG_BG0CNT = temp;
REG_DISPCNT |= BG0_ENABLE;
}break;
case 1:
{
REG_BG1CNT = temp;
REG_DISPCNT |= BG1_ENABLE;
}break;
case 2:
{
REG_BG2CNT = temp;
REG_DISPCNT |= BG2_ENABLE;
}break;
case 3:
{
REG_BG3CNT = temp;
REG_DISPCNT |= BG3_ENABLE;
}break;
default:break;
}
}
void UpdateBackground(Bg* bg)
{
switch(bg->number)
{
case 0:
REG_BG0HOFS = bg->x_scroll;
REG_BG0VOFS = bg->y_scroll;
break;
case 1:
REG_BG1HOFS = bg->x_scroll;
REG_BG1VOFS = bg->y_scroll;
break;
case 2:
if(!(REG_DISPCNT & MODE_0))//it is a rot background
{
REG_BG2X = bg->DX;
REG_BG2Y = bg->DY;
REG_BG2PA = bg->PA;
REG_BG2PB = bg->PB;
REG_BG2PC = bg->PC;
REG_BG2PD = bg->PD;
}
else //it is a text background
{
REG_BG2HOFS = bg->x_scroll;
REG_BG2VOFS = bg->y_scroll;
}
break;
case 3:
if(!(REG_DISPCNT & MODE_0))//it is a rot background
{
REG_BG3X = bg->DX;
REG_BG3Y = bg->DY;
REG_BG3PA = bg->PA;
REG_BG3PB = bg->PB;
REG_BG3PC = bg->PC;
REG_BG3PD = bg->PD;
}
else //it is a text background
{
REG_BG3HOFS = bg->x_scroll;
REG_BG3VOFS = bg->y_scroll;
}
break;
default: break;
}
}
-Jesse
int main(void)
{
u16 loop;
u16* temp;
SetMode(MODE_2 | OBJ_MAP_1D);
sunsetBg.number = 2;
sunsetBg.charBaseBlock = 0;
sunsetBg.screenBaseBlock = 8;
sunsetBg.colorMode = BG_COLOR_256;
sunsetBg.size = ROTBG_SIZE_512x512;
sunsetBg.mosaic = 0;
sunsetBg.x_scroll = 0;
sunsetBg.y_scroll = 0;
EnableBackground(&sunsetBg);
for(loop = 0; loop < 256; loop++)
{
BGPaletteMem[loop] = TileSetPalette[loop];
}
for(loop = 0; loop < TileSet_WIDTH * TileSet_HEIGHT / 2; loop++)
{
sunsetBg.tileData[loop] = TileSetData[loop];
}
temp = (u16*)JungleBackground;
for(loop = 0; loop < 64 * 64 / 2; loop++)
{
sunsetBg.mapData[loop] = temp[loop];
}
WaitForVsync();
while(true)
{
UpdateBackground(&sunsetBg);
WaitForVsync();
GetInput();
}
return 0;
}
void WaitForVsync()
{
while((volatile u16)REG_VCOUNT != 160){}
}
void GetInput()
{
if(!(*KEYS & KEY_UP))
{
sunsetBg.y_scroll++;
}
if(!(*KEYS & KEY_DOWN))
{
sunsetBg.y_scroll--;
}
if(!(*KEYS & KEY_LEFT))
{
sunsetBg.x_scroll++;
}
if(!(*KEYS & KEY_RIGHT))
{
sunsetBg.x_scroll--;
}
}
void EnableBackground(Bg *bg)
{
u16 temp;
bg->tileData = (u16*)CharBaseBlock(bg->charBaseBlock);
bg->mapData = (u16*)ScreenBaseBlock(bg->screenBaseBlock);
temp = bg->size | (bg->charBaseBlock<<CHAR_SHIFT) |
(bg->screenBaseBlock<<SCREEN_SHIFT) | bg->colorMode |
bg->mosaic;
switch(bg->number)
{
case 0:
{
REG_BG0CNT = temp;
REG_DISPCNT |= BG0_ENABLE;
}break;
case 1:
{
REG_BG1CNT = temp;
REG_DISPCNT |= BG1_ENABLE;
}break;
case 2:
{
REG_BG2CNT = temp;
REG_DISPCNT |= BG2_ENABLE;
}break;
case 3:
{
REG_BG3CNT = temp;
REG_DISPCNT |= BG3_ENABLE;
}break;
default:break;
}
}
void UpdateBackground(Bg* bg)
{
switch(bg->number)
{
case 0:
REG_BG0HOFS = bg->x_scroll;
REG_BG0VOFS = bg->y_scroll;
break;
case 1:
REG_BG1HOFS = bg->x_scroll;
REG_BG1VOFS = bg->y_scroll;
break;
case 2:
if(!(REG_DISPCNT & MODE_0))//it is a rot background
{
REG_BG2X = bg->DX;
REG_BG2Y = bg->DY;
REG_BG2PA = bg->PA;
REG_BG2PB = bg->PB;
REG_BG2PC = bg->PC;
REG_BG2PD = bg->PD;
}
else //it is a text background
{
REG_BG2HOFS = bg->x_scroll;
REG_BG2VOFS = bg->y_scroll;
}
break;
case 3:
if(!(REG_DISPCNT & MODE_0))//it is a rot background
{
REG_BG3X = bg->DX;
REG_BG3Y = bg->DY;
REG_BG3PA = bg->PA;
REG_BG3PB = bg->PB;
REG_BG3PC = bg->PC;
REG_BG3PD = bg->PD;
}
else //it is a text background
{
REG_BG3HOFS = bg->x_scroll;
REG_BG3VOFS = bg->y_scroll;
}
break;
default: break;
}
}