PDA

Voir la version complète : [GBA][Aide] carte de 512x512


king501
29/06/2006, 09h52
Je suis présentement entrain d’apprendre à programmer la GBA à l'aide du livre de J Harbour. Malheureusement, l’information n’est pas toujours complète et évidente à anticiper…

Voici une partie du code source qui permet d’afficher une carte de 256x256 tuiles à l’écran.

//create a pointer to background 0 tilemap buffer
unsigned short* bg0map =(unsigned short*)ScreenBaseBlock(31);

//set up background 0
REG_BG0CNT = BG_COLOR256 | TEXTBG_SIZE_256x256 |
(31 << SCREEN_SHIFT);

//set video mode 0 with background 0
SetMode(0 | BG0_ENABLE);

//copy the palette into the background palette memory
DMAFastCopy((void*)test_Palette, (void*)BGPaletteMem,
256, DMA_16NOW);

//copy the tile images into the tile memory
DMAFastCopy((void*)test_Tiles, (void*)CharBaseBlock(0),
57984/4, DMA_32NOW);

//copy the tile map into background 0
DMAFastCopy((void*)test_Map, (void*)bg0map, 512, DMA_32NOW);

Ce que je voudrais faire à présent c’est afficher une carte de 512x512. Jusqu’ici je sais qu’un screenblock est suffisant pour une carte de 256x256, et que pour une carte de 512x512, il faudrait 4 screenblocks. J’ai fais plusieurs tentative, mais en vain… Est-ce qu’une personne pourrait m’aider en modifiant le code ci-dessus afin qu’il marche pour une carte de 512x512 tout en restant simple afin de facilité l’apprentissage?

Merci!

Brunni
29/06/2006, 10h02
Le screenblock que tu utilises, le 31, est le dernier de la liste (il y'en a 32), et il t'en faut 4 (à la suite) pour une map de 512x512, c'est pour ça que ça ne joue pas ;)

king501
29/06/2006, 10h36
même si je l'initialise le screenblock a 28, ça ne marche pas...

Frenecrid-Jae
29/06/2006, 23h48
As-tu aussi cherché dans le tuto de TONC dans la partie "Regular tiled backgrounds" pour bien comprendre comment ça marche ? Essaye de jongler entre le livre de J. Harbour et TONC, tu verras qu'ils sont complémentaires ;)

Si vraiment tu ne trouves pas l'erreur, poste ton code en entier que je puisse voir ce que tu as fais. Je connais ce genre de problèmes et très souvent ça venait d'une mauvaise écriture du code ou d'un bête oublie...

Brunni
30/06/2006, 00h00
Non mais je crois que l'erreur est dans ce code:
unsigned short* bg0map =(unsigned short*)ScreenBaseBlock(31);

//set up background 0
REG_BG0CNT = BG_COLOR256 | TEXTBG_SIZE_256x256 |
(31 << SCREEN_SHIFT);
BG0CNT => n° du screenblock (31)
bg0map => 31

Nesgba
30/06/2006, 01h11
il me semble que tu doit specifier le charblock utilisé et aussi le screenblock quand tu defini un bg (sinon il sais pas ou aller chercher ses tiles le pauvre petit)

ca fait supra longtemp que j'ai pas touché au mode tile.
un bout de code, y'a ptet des erreurs...


// bg texte
#define BG_TEXTE_256x256 0x0
#define BG_TEXTE_512x256 0x4000
#define BG_TEXTE_256x512 0x8000
#define BG_TEXTE_512x512 0xC000

// bg rotation
#define BG_ROTATION_128x128 0x0
#define BG_ROTATION_256x256 0x4000
#define BG_ROTATION_512x512 0x8000
#define BG_ROTATION_1024x1024 0xc000

// CharBlocks (1 charblock = 16 ko)
#define BG_CHARBLOCK_0 0x0000
#define BG_CHARBLOCK_1 0x0004
#define BG_CHARBLOCK_2 0x0008
#define BG_CHARBLOCK_3 0x000C

// pourquoi je met ca en hexa moi ?...
#define BG_PRIORITE_0 0x0000
#define BG_PRIORITE_1 0x0001
#define BG_PRIORITE_2 0x0002
#define BG_PRIORITE_3 0x0003

// tourne en rond
#define BG_WRAP 0x2000
#define BG_NON_WRAP 0x0000

// mode de palette
#define BG_1_PALETTE 0x0080 // 256 couleurs, 1 pixel = 8 bits (pointe sur la palette)
#define BG_16_PALETTES 0x0000 // 16 couleurs, 1 pixel = 4 bits (pointe sur la palette)

// charblocks (1 charblock = 16 ko)
#define CharBaseBlock(n) ((void*)(((n)*0x4000)+0x6000000)) // stocker les tiles
// screenblocks (1 screenblock = 2 ko)
#define ScreenBaseBlock(n) ((void*)(((n)*0x0800)+0x6000000)) // stocker les maps


unsigned char screenblock = 29 ;
REG_BG0CNT = BG_TEXTE_512x512 | BG_1_PALETTE | BG_WRAP | BG_CHARBLOCK_0 | screenblock<<8 | BG_PRIORITE_0 ;

Brunni
30/06/2006, 09h19
Juste, j'ai oublié ^^
Si jamais tu te demandes pourquoi ça marche quand même, c'est parce que:
#define BG_CHARBLOCK_0 0x0000
Donc par défaut (si on précise rien), on utilise le charblock 0 ;)