Discussion about software development for the old-school Gameboys, ranging from the "Gray brick" to Gameboy Color
(Launched in 2008)
You are not logged in.
I started up doing dev a week or so ago using GBDK v2.94 and I'm running into two issues on my program when I scroll vertically. Problem details and code snippet are below, any help would be appreciated. I've been banging my head on this for several days. Thanks!
1.
I have an 80x80 map that I'm loading as I scroll (every 6 tiles). In set_bkg_tiles, I included the offset of the distance moved (so for example after 6 tiles down, scrollY = 6) and it is should be doing:
set_bkg_tiles(0,tempa+6, 32, 1, (unsigned char *) &map_data+cnt);
However it just fails to do set_bkg_tiles and just loops the tiles loaded earlier. If I replace the variable scrollY with a number it does the addition correctly (i.e. tempa+6)
2.
The commented out line is what I'd prefer to use over the first "for" loop, but doesn't seem to set the correct value.
UBYTE scrollX, scrollY, tempa, i;
UWORD cnt;
void drawMap(){
cnt = 0;
for (tempa = 0; tempa<scrollY; tempa++){
cnt+=MapSizeX;
}
//cnt = scrollY*MapSizeX;
for( tempa=0; tempa <= 30; tempa++ ){
set_bkg_tiles( 0, tempa+scrollY, 32, 1, (unsigned char *) &map_data+cnt);
cnt = cnt + MapSizeX;
}
}
Last edited by deakmania (2017-11-08 17:27:46)
Offline
I think you need to show some more code. Like how scrollY is being updated and the values/type for MapSizeX.
Your cnt = scrollY * MapSizeX; isn't working is probably caused by typecasting. ScrollY is a UBYTE so your multiplication result is probably being limited to a UBYTE value and doing an 8-bit multiplication instead of the expected 16-bit calculation.
The documentation for set_bkg_tiles in gb.h notes that it expects values in the 0-31 range for x,y,w,h. I think the scrollY is exceeding that you might try using modulo (%) to wrap the tempA+scrollY into the expected range, so it doesn't end up writing random data outside of the tile buffer.
I don't use the GBDK so I am not entirely sure if the header documentation is correct for set_bkg_tiles.
Last edited by ssjason123 (2017-11-08 22:46:00)
Offline
Thanks for your reply, #1 was definitely a casting issue. Resolved by making scrollY a UWORD.
Still having difficulties with getting the correct value in for the set_bkg_tiles. I've taken out my horizontal scroll code (which is working ok) to focus on this. Here's what I've got:
#include <gb/gb.h>
#define MapSizeX 80
#define MapSizeY 80
extern unsigned char tile_data[];
extern unsigned char map_data[];
UBYTE scrollX, tempa, i;
UWORD cnt, scrollY;
void init();
void checkInput();
void initMap();
void drawMap();
void main(){
init();
while(1){
checkInput();
}
}
void init(){
const UWORD background_palette[] = { 21342, 11342,0, 2239 }; //Color palette for the background
UBYTE tempa = 0, i = 0;
UWORD cnt = 0;
UBYTE scrollX = 0;
UWORD scrollY = 0;
SWITCH_ROM_MBC1(2);
wait_vbl_done();
disable_interrupts();
DISPLAY_OFF;
HIDE_SPRITES;
HIDE_WIN;
HIDE_BKG;
set_bkg_data( 0, 13, &tile_data);
set_bkg_palette(0,1,background_palette);
initMap();
SHOW_BKG; //show the map
DISPLAY_ON;
enable_interrupts();
}
void checkInput(){
delay(19); //game speed delay
wait_vbl_done();
// read the gb-pad.
i = joypad();
if(( i & J_DOWN ) && (scrollY < (MapSizeY - 18))){
for (i =0; i<16; i=i+1)
{
delay(4);
wait_vbl_done();
scroll_bkg(0, 1);
}
scrollY += 2;
if (scrollY%6 == 0){
drawMap();
}
}
}
void initMap(){
cnt = scrollX;
for( tempa=0; tempa <= 30; tempa++ ){
set_bkg_tiles( 0, tempa, 32, 1, (unsigned char *) &map_data+cnt);
cnt = cnt + MapSizeX;
}
}
void drawMap(){
cnt = scrollY*MapSizeX;
for( tempa=0; tempa <= 30; tempa++ ){
set_bkg_tiles( 0, tempa+scrollY, 32, 1, (unsigned char *) &map_data+cnt);
cnt = cnt + MapSizeX;
}
}
Offline
drawMap is still calling set_bkg_tiles with a Y outside of the valid range. For example if scrollY is 32 you would be setting a Y in the range of 32-62 where the function expects 0-31. Try using:
set_bkg_tiles(0, (tempa + scrollY) % 32, 32, 1, (unsigned char *) &map_data+cnt);
Offline
Thanks again for your help, got my scrolling working. I rewrote my code since I did it based on my misunderstanding how the background and view window work.
Offline