Sega Genesis Dev Kit (SGDK)

SGDK only sub forum

Moderator: Stef

Stef
Very interested
Posts: 3131
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Post by Stef »

Le principal c'est qu'on ai réussi à résoudre ton problème ;)
letoulousain
Interested
Posts: 42
Joined: Fri Sep 24, 2010 11:32 pm
Location: toulouse

Post by letoulousain »

Oui, j'espère atteindre le même niveau qu'avec BasiEgaXorz (j'ai suivis ton conseil), pseudo philip, soit l'affichage de sprites et de tiles pour les plans B et A (j'ai réalisé un petit éditeur de niveaux pour l'occasion).

philippe
letoulousain
Interested
Posts: 42
Joined: Fri Sep 24, 2010 11:32 pm
Location: toulouse

Post by letoulousain »

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:

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}
};
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.
Stef
Very interested
Posts: 3131
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Post by Stef »

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 :

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;
}
KanedaFr
Administrateur
Posts: 1154
Joined: Tue Aug 29, 2006 10:56 am
Contact:

Post by KanedaFr »

3TilesBitmap is the name of the 3rd tutorial

.cproject & .project files are related to Eclipse, you can delete them if you use CodeBlock

moon.h is automatically generated by SGDK because, like Stef said, there is a moon.bmp in \res folder
Stef
Very interested
Posts: 3131
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Post by Stef »

Oh i see, didn't noticed you named the tutorial this way ;)
letoulousain
Interested
Posts: 42
Joined: Fri Sep 24, 2010 11:32 pm
Location: toulouse

Post by letoulousain »

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. 8)

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
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:

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.
Stef
Very interested
Posts: 3131
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Post by Stef »

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 :

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;

  ...
letoulousain
Interested
Posts: 42
Joined: Fri Sep 24, 2010 11:32 pm
Location: toulouse

Post by letoulousain »

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 :
Je viens de tester avec un troisième tile et cela fonctionne à merveille. :D

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 ?
Stef
Very interested
Posts: 3131
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Post by Stef »

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".
letoulousain
Interested
Posts: 42
Joined: Fri Sep 24, 2010 11:32 pm
Location: toulouse

Post by letoulousain »

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".
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.

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 ?
Stef
Very interested
Posts: 3131
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Post by Stef »

letoulousain wrote:
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".
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.

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 ?
Oui bien sur ça peut dépasser 128Ko ;) c'est juste que la taille doit être alignée sur 128 Ko pour que ça fonctionne sur le vrai hardware selon les cartes flash.
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...
letoulousain
Interested
Posts: 42
Joined: Fri Sep 24, 2010 11:32 pm
Location: toulouse

Post by letoulousain »

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 :

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: missing braces around initializer
warning: (near initialization for 'tbr[0]')
letoulousain
Interested
Posts: 42
Joined: Fri Sep 24, 2010 11:32 pm
Location: toulouse

Post by letoulousain »

My brother received my EverdriveMD. I am happy. :)
http://www.mirari.fr/96Ux
Stef
Very interested
Posts: 3131
Joined: Thu Nov 30, 2006 9:46 pm
Location: France - Sevres
Contact:

Post by Stef »

letoulousain 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.

...
Thanks for your kind comment :)
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}};
This is the correct syntax for 2D table.
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 !
Post Reply