
Sega Genesis Dev Kit (SGDK)
Moderator: Stef
-
- Interested
- Posts: 42
- Joined: Fri Sep 24, 2010 11:32 pm
- Location: toulouse
-
- Interested
- Posts: 42
- Joined: Fri Sep 24, 2010 11:32 pm
- Location: toulouse
Hi,
Je souhaite étudier 3TilesBitmap mais j'imagine qu'il y a un moyen d'intégrer les fichiers .cproject et .project dans Code::Blocks ?
Le fichier moon.h doit surement contenir les données de l'image moon convertis (64 tiles de 8*8 pixels), mais quelque chose m'échappe car je ne le vois nulle part ?
Une lecture d'un tableau en decimal est possible en C pour la console Lynx:
c'est aussi possible avec Genesis Mini DevKit ?
En fait je souhaite afficher les images suivantes sur le plane A, par la lecture d'un tableau de 1 à 12:
http://www.mirari.fr/tn9b
(8 tiles par images) donc je cherche la commande approprié pour cela.
Je souhaite étudier 3TilesBitmap mais j'imagine qu'il y a un moyen d'intégrer les fichiers .cproject et .project dans Code::Blocks ?
Le fichier moon.h doit surement contenir les données de l'image moon convertis (64 tiles de 8*8 pixels), mais quelque chose m'échappe car je ne le vois nulle part ?
Une lecture d'un tableau en decimal est possible en C pour la console Lynx:
Code: Select all
uchar tbr01[5][5]=
{
{1,0,1,0,1},
{1,1,1,1,1},
{1,0,1,0,1},
{1,1,1,1,1},
{0,1,1,1,0}
};
En fait je souhaite afficher les images suivantes sur le plane A, par la lecture d'un tableau de 1 à 12:
http://www.mirari.fr/tn9b
(8 tiles par images) donc je cherche la commande approprié pour cela.
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Tu voulais surement parler de Bmp2Tile plutot que 3TilesBitmap ? sinon je ne vois pas... de même je ne comprends pas de quel fichier .cproject ou .project tu parles.
La manière la plus simple d'intégrer un bitmap dans ton projet c'est de simplement mettre ton fichier BMP dans le même répertoire que tes sources (ou dans un sous répertoire appelé "res"). Il faut que ton fichier BMP soit en 16 couleurs (4BPP) et que sa taille soit alignée sur un multiple de 8 pixels en largeur comme en hauteur.
Ton fichier BMP sera automatiquement transformé en fichier .o (binaire) par le makefile, de même un fichier .h (header) est généré.
Par exemple si tu as un fichier image.bmp tu obtiendras un fichier image.o et un autre image.h
Ensuite en reprenant le code très légèrement modifié du tutorial fait par Kaneda, tu peux charger tes tiles en mémoire vidéo et afficher ton image :
La manière la plus simple d'intégrer un bitmap dans ton projet c'est de simplement mettre ton fichier BMP dans le même répertoire que tes sources (ou dans un sous répertoire appelé "res"). Il faut que ton fichier BMP soit en 16 couleurs (4BPP) et que sa taille soit alignée sur un multiple de 8 pixels en largeur comme en hauteur.
Ton fichier BMP sera automatiquement transformé en fichier .o (binaire) par le makefile, de même un fichier .h (header) est généré.
Par exemple si tu as un fichier image.bmp tu obtiendras un fichier image.o et un autre image.h
Ensuite en reprenant le code très légèrement modifié du tutorial fait par Kaneda, tu peux charger tes tiles en mémoire vidéo et afficher ton image :
Code: Select all
#include "image.h"
int main( )
{
// get the image width (in pixel) ==> should be 8pix aligned
u16 w = image[0];
// get the image height (in pixel) ==> should be 8px aligned
u16 h = image[1];
// get the palette at image[2 to 17]
VDP_setPalette(PAL1, &image[2]);
// load bitmap data at image[18....] in VRAM
// w/8 = width in tiles we want to load
// h/8 = height in tile we want to load
// w/8 = width in tiles of the bitamp
// the 3rd arg is needed because you could load only a part of the bitmap if you want but SGDK needs the width as reference
VDP_loadBMPTileData((u32*) &image[18], 1, w / 8, h / 8, w/8 );
// draw the image at (12,12)
VDP_fillTileMapRectInc(BPLAN, TILE_ATTR_FULL(PAL1, 0, 0, 0, 1), 12, 12, w / 8, h / 8);
while(1)
{
VDP_waitVSync();
}
return 0;
}
-
- Interested
- Posts: 42
- Joined: Fri Sep 24, 2010 11:32 pm
- Location: toulouse
La lune s'affiche bien maintenant, merci.
On n'a plus besoin de convertir les données des images manuellement, et ça c'est très cool.
Maintenant, il y a un problème pour afficher deux tiles, car je ne comprend pas pourquoi seule la valeur 18 est valable pour l'emplacement en VRAM du premier tile... donc impossible pour moi de deviner l'emplacement en vram pour le deuxième tile.
J'ai fait un nouveau projet avec 2 images d'une taille de 32*32 pixels chacune:
http://www.mirari.fr/G0g8
Pour la définition d'un tableau, j'ai fait d'autres recherches et j'ai enfin trouvé comment faire:

On n'a plus besoin de convertir les données des images manuellement, et ça c'est très cool.

Maintenant, il y a un problème pour afficher deux tiles, car je ne comprend pas pourquoi seule la valeur 18 est valable pour l'emplacement en VRAM du premier tile... donc impossible pour moi de deviner l'emplacement en vram pour le deuxième tile.
Code: Select all
VDP_loadBMPTileData((u32*) &sapf01[18], TILE1, w/8, h/8, w/8);
Code: Select all
VDP_loadBMPTileData((u32*) &sapf02[34], TILE2, w/8, h/8, w/8); // 18+16 = 34
http://www.mirari.fr/G0g8
Pour la définition d'un tableau, j'ai fait d'autres recherches et j'ai enfin trouvé comment faire:
Code: Select all
const unsigned char tbr01[25]=
{
0x00,0x01,0x01,0x00,0x01,
0x01,0x01,0x01,0x01,0x01,
0x01,0x00,0x01,0x00,0x01,
0x01,0x01,0x01,0x01,0x01,
0x00,0x01,0x01,0x01,0x00
};
Last edited by letoulousain on Thu May 05, 2011 11:10 pm, edited 1 time in total.
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Ce que tu affiches ce n'est pas un tile mais un ensemble de tiles !
Un tile fait 8x8 pixels or tes images font 32x32 pixels soit des bloc de 4x4 tiles.
Et pourquoi changer l'offset sur 34 sur les données de l'image ?
Comme indiqué dans le tutorial tu as la taille W en 0, la taille H en 1, la palette en 2 (16 valeurs) et donc les données du tile en 18 (toujours).
Je pense que tu confonds avec l'index du tile !
Ton code doit être comme suit :
Un tile fait 8x8 pixels or tes images font 32x32 pixels soit des bloc de 4x4 tiles.
Et pourquoi changer l'offset sur 34 sur les données de l'image ?
Comme indiqué dans le tutorial tu as la taille W en 0, la taille H en 1, la palette en 2 (16 valeurs) et donc les données du tile en 18 (toujours).
Je pense que tu confonds avec l'index du tile !
Ton code doit être comme suit :
Code: Select all
// initialize tile index where to transfert tile data
u16 tile_ind = TILE_USERINDEX;
// get the image width (in tile)
u16 wt = sapf01[0] / 8;
// get the image height (in tile)
u16 ht = sapf01[1] / 8;
// number of tiles composing the image
u16 num_tiles = wt * ht;
// get the palette at sapf01[2 to 17]
VDP_setPalette(PAL1, (u16 *) &sapf01[2]);
// load bitmap data at sapf01[18....] in VRAM
// wt = width in tiles we want to load
// ht = height in tile we want to load
// wt = width in tiles of the bitmap
// the 3rd arg is needed because you could load only a part of the bitmap if you want but SGDK needs the width as reference
VDP_loadBMPTileData((u32*) &sapf01[18], tile_ind, wt, ht, wt);
// draw the sapf01 at (12,12)
VDP_fillTileMapRectInc(APLAN, TILE_ATTR_FULL(PAL1, 0, 0, 0, tile_ind), 0, 0, wt, ht);
// adjust tile index for next transfert
tile_ind += num_tiles;
// load next image
wt = sapf02[0] / 8;
ht = sapf02[1] / 8;
num_tiles = wt * ht;
VDP_loadBMPTileData((u32*) &sapf02[18], tile_ind, wt, ht, wt);
VDP_fillTileMapRectInc(APLAN, TILE_ATTR_FULL(PAL1, 0, 0, 0, tile_ind), 4, 0, wt, ht);
tile_ind += num_tiles;
...
-
- Interested
- Posts: 42
- Joined: Fri Sep 24, 2010 11:32 pm
- Location: toulouse
Je viens de tester avec un troisième tile et cela fonctionne à merveille.Stef wrote:Ce que tu affiches ce n'est pas un tile mais un ensemble de tiles !
Un tile fait 8x8 pixels or tes images font 32x32 pixels soit des bloc de 4x4 tiles.
Et pourquoi changer l'offset sur 34 sur les données de l'image ?
Comme indiqué dans le tutorial tu as la taille W en 0, la taille H en 1, la palette en 2 (16 valeurs) et donc les données du tile en 18 (toujours).
Je pense que tu confonds avec l'index du tile !
Ton code doit être comme suit :

Chacune de mes images sont constituées de 16 tiles de 8x8 pixels, mais je ne comprend toujours pas où on les positionne en Vram ?
-
- Interested
- Posts: 42
- Joined: Fri Sep 24, 2010 11:32 pm
- Location: toulouse
ah oui, merci, je progresse à nouveau, je mettrai en lien le résultat de mon taf, si tu le juge utile, tu pourra l'intégrer dans ton pack SGDK dans demo samples.Stef wrote:La position en VRAM c'est le fameux "tile_ind".
En fait tu charges les tiles en VRAM et ensuite tu remplis le tilemap pour les différents plans (A et B) avec la méthode "VDP_fillTileMapRectInc".
Pour la rom.bin, j'ai remarqué qu'elle est toujours à 128 Ko et ceux même si j'intègre de nouvelles images, on peut dépasser cette limite de 128 Ko ?
Si ce n'est déjà fait, tu envisage d'intégrer des fonctions de Zoom et de Rotation qui claquent comme dans The Misadventures Flink ?
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Oui bien sur ça peut dépasser 128Koletoulousain wrote:ah oui, merci, je progresse à nouveau, je mettrai en lien le résultat de mon taf, si tu le juge utile, tu pourra l'intégrer dans ton pack SGDK dans demo samples.Stef wrote:La position en VRAM c'est le fameux "tile_ind".
En fait tu charges les tiles en VRAM et ensuite tu remplis le tilemap pour les différents plans (A et B) avec la méthode "VDP_fillTileMapRectInc".
Pour la rom.bin, j'ai remarqué qu'elle est toujours à 128 Ko et ceux même si j'intègre de nouvelles images, on peut dépasser cette limite de 128 Ko ?
Si ce n'est déjà fait, tu envisage d'intégrer des fonctions de Zoom et de Rotation qui claquent comme dans The Misadventures Flink ?

Y'a déjà une fonction de zoom mais il faut passer par le moteur bitmap software (fonction BMP_init(...)).
Pour t'inspirer tu peux lire le src/base.c (ligne 160 à 200 environ) de la librairie. Selon le paramétrage du devkit tu peux avoir un logo qui apparait en zoom au début. Rotation je n'ai pas encore fait mais pourquoi pas... Ce qu'il faut voir c'est que derrière ça utilise un moteur de rendu bitmap "software" assez lent car la megadrive n'est pas faite pour ça, ça ne sera jamais rapide en fait...
-
- Interested
- Posts: 42
- Joined: Fri Sep 24, 2010 11:32 pm
- Location: toulouse
Tu as fait un travail impressionnant, chapeau bas. Un zoom fluide sur cette machine est toujours un plaisir (et une surprise), peut être à réserver pour certains situations de jeu.
J'ai encore besoin d'un coup de main car je n'arrive toujours pas à faire un tableau multidimensionnel :
warning: missing braces around initializer
warning: (near initialization for 'tbr[0]')
J'ai encore besoin d'un coup de main car je n'arrive toujours pas à faire un tableau multidimensionnel :
Code: Select all
const unsigned char tbr[5][5]=
{
0x00,0x01,0x01,0x00,0x01,
0x01,0x01,0x01,0x01,0x01,
0x01,0x00,0x01,0x00,0x01,
0x01,0x01,0x01,0x01,0x01,
0x00,0x01,0x01,0x01,0x00
};
warning: (near initialization for 'tbr[0]')
-
- Interested
- Posts: 42
- Joined: Fri Sep 24, 2010 11:32 pm
- Location: toulouse
-
- Very interested
- Posts: 3131
- Joined: Thu Nov 30, 2006 9:46 pm
- Location: France - Sevres
- Contact:
Thanks for your kind commentletoulousain wrote:Tu as fait un travail impressionnant, chapeau bas. Un zoom fluide sur cette machine est toujours un plaisir (et une surprise), peut être à réserver pour certains situations de jeu.
...

I was always playing with that kind of visual effects, it's why you can find them in SGDK

Also about 2D table initialization, your syntax is incorrect :
Code: Select all
const u16 tab[2][2] = {{0, 1}, {2, 3}};
Don't forget the 'const' keyword when you have constant table so table with be located in ROM instead of RAM.
Congrats about your Everdrive, very nice piece of hardware imo !