Page 16 of 57

Posted: Thu Apr 28, 2011 9:27 pm
by Stef
Le principal c'est qu'on ai réussi à résoudre ton problème ;)

Posted: Sat Apr 30, 2011 7:42 pm
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

Posted: Wed May 04, 2011 9:38 pm
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.

Posted: Wed May 04, 2011 11:36 pm
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;
}

Posted: Thu May 05, 2011 8:27 am
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

Posted: Thu May 05, 2011 8:53 am
by Stef
Oh i see, didn't noticed you named the tutorial this way ;)

Posted: Thu May 05, 2011 10:48 pm
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
};

Posted: Thu May 05, 2011 11:07 pm
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;

  ...

Posted: Thu May 05, 2011 11:32 pm
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 ?

Posted: Fri May 06, 2011 7:40 am
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".

Posted: Fri May 06, 2011 12:07 pm
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 ?

Posted: Fri May 06, 2011 5:01 pm
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...

Posted: Fri May 06, 2011 8:03 pm
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]')

Posted: Sat May 07, 2011 11:03 am
by letoulousain
My brother received my EverdriveMD. I am happy. :)
http://www.mirari.fr/96Ux

Posted: Sat May 07, 2011 9:40 pm
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 !