Jump to content
FantaX

Ma première réalisation

Recommended Posts

Coucou les amis,

 

Voilà, après toute vos bonnes infos sur les sprites, j'ai réalisé une première étude de personnage sur papier, je l'ai finalisé (mais pas en couleur dans un premier temps), et je doit le décliner dans plusieurs positions en suivant un gabarit.

Mais avant de me lancer trop en avant comme tu me la suggéré Will, je me suis remis à suivre le tuto d'X-Death, pour déjà faire apparaître une image fixe tile de 320 x240pix avec une palette de 16 maxi (8 avec la couleur de transparence pour mon image).

 

Maintenant j'en suis à l'étape ou il me faut ajouter les deux fichiers générés par genitil via le script d'X-Death, mais....là y a plus d'explications^^ alors ben je sais pas comment faire :)

 

Share this post


Link to post
Share on other sites

Ok, donc du dev sur megadrive, hum je te conseille d'utiliser la sgdk, c'est une librairie conçue par Stéphane Dallongeville, l'auteur de gens (l'émulateur megadrive genesis), lesexemple y sont nombreux pour faire ce genre de chose ;)

 

http://code.google.com/p/sgdk/

 

Ho oui cerise sur le gâteau, il est français ^^

Share this post


Link to post
Share on other sites

Bonjour,

si tu a utilisé Genitile et suivit mon tuto il y a de fortes chances que tu ai générés deux fichier assembleur ( format .s).

Les fichiers assembleurs , si il sont à la racine de ton projet ( dans le cas ou tu utilise SGDK) sont inclu automatiquement.

 

Toutefois tu devra quand même spécifier leur type exemple:

 

extern u16 backt_pal[];
extern u32 backt_tiles[];

Après le reste c'est de l'utilisation de fonction inclu dans SGDK.

si tu bloque à toi de nous dire ou exactement ;)

Share this post


Link to post
Share on other sites

Bien j'ai mes deux fichiers .S qui ont été créer par genitile dans le dossier genitile.

Donc pour continuer mon apprentissage, dans un premier temps et pour comprendre la démarche,

je voulais incorporer une image dans le projet de début de ton tutu "hello world" que j'ai réalisé.

 

Donc je prend les deux fichiers et je l'ai ajoutes dans le dossier Hello world. 

(d'ailleurs a quoi correspondent ces deux fichiers ? : mon image et la palette ?

et donc maintenant je doit taper quoi  et ou dans codeblock ?

 

 pour rappelle, pour le moment j'ai ça : 

 

 

#include "genesis.h"
 
// Fonction Principale
 
int main()
{
    VDP_init();
    VDP_setPaletteColor(0,15,0x00F);
        VDP_drawTextBG(APLAN, " hello world  ",0x0000, 10, 10);
    while(1);
}
 

Share this post


Link to post
Share on other sites

Ce que je te propose c'est de prendre 5min pour lire cette courte docs ( 12 pages seulement et presque entièrement en français);

http://www.genny4ever.net/g4e_modules2/download.php?file=sega_md_prog_intro

 

Fonzie l'avait écrite à l'époque et je pense que ça va t'aider a clarifier pas mal de choses.

D'ailleurs j'invite toute personne souhaitant faire de la programmation MD à la lire ;)

 

Après ça , précise moi exactement à quelle étape tu bloque et je t'aiderai

 

source : http://www.genny4ever.net/index.php?page=docs

Share this post


Link to post
Share on other sites

Merci X death,  je vais garder et lire attentivement ce document !

Bien sinon j'en suis au niveau de ton tuto avec l'image zelda de link, ou tu fini par avoir les 2 fichiers et tu dis que tu expliquera le reste plus tard mais que ça fonctionne ^^   :) 

Share this post


Link to post
Share on other sites

Oui je n'ai jamais prit le temps de continuer ce tuto.

Après il est la pour donner une base aux gens , le reste peut s apprendre en échangeant ici ou par soi même.

Bon pour ton code :


La première chose à faire est ajouter les fichiers assembleurs générés avec mon script + Genitile à ton code :

 


extern u16 Sega_pal[];
extern u32 Sega_tiles[];

??videmment tu remplace Sega par le nom de ton fichier hein


Alors pour l' affichage tu peut le faire via trois fonctions qui vont très bien :

1) tu définit la palette avec ton fichier asm :

 

VDP_setPalette(0, (u16 *) Sega_pal);
2) tu envoie les tiles de ton image en mémoire vidéo ( VRAM) :
VDP_doVRamDMA( (u32) Sega_tiles, 32, 14400/2);

 


32: Valeur en Tiles de la position ou va commencer la mise en Vram
14400: quantitée en word à envoyer en Vram ( bytes/2)

3) Tu affiche ton image sur l' écran:

 

 VDP_fillTileMapRectInc(BPLAN, TILE_ATTR(0, 0, 0, 0) + (32/32),5,5,240/8,120/8);


BPLAN: Plan d' affichage

TILE_ATTR(0, 0, 0, 0): le premier chiffre corresponds au numéro de palette à utiliser , les autres je détaillerais plus tard, tu en a pas vraiment besoin dans un premier temps.

(32/32): le premier chiffre 32 corresponds à la valeur de départ d' incrémentation à inscrire en Tiles donc en fait voila pourquoi je fait la division par 32 , comme ça tu a toujours qu'a recopier la même valeur que la fonction précédente.

5: Coordonnées sur l' écran en X

5: coordonnées sur l' écran en Y

240: Hauteur de l' image en Tiles ( d' ou la division par 8)

120: Largeur de l' image en Tiles

Voila M'sieur ;)

 

source ( cf off will en 2011 ;) ) : http://www.ultimate-consoles.fr/topic/15156-les-instructions-md/

Share this post


Link to post
Share on other sites

J'avais une question X-death,

Comment tu fait pour calculer la valeur du paramètre "len" pour l'instruction VDP suivante:

VDP_doVRamDMA (from, to, len)

 

Edit : l'image a affiché fait 384*288 soit 1728 tiles donc je devrait mettre 27648, je me trompe?

Share this post


Link to post
Share on other sites

Quand tu as créé ton fichier tiles.s, tu as la taille en byte sur la 4e ou 5e ligne.

 

Avant le VDP_doVRamDMA utilisait la taille en byte, maintenant en word (byte/2)

 

Dans ton cas ce devrait être un truc du genre 13824/2 mais attention, ton image est plus grande que la résolution de la MD (320*240 en NTSC), tu ne la verras pas en entier.

Share this post


Link to post
Share on other sites

J'ai bien la taille dans le fichier .s 55296bytes (5eme ligne)

 

mais attention, ton image est plus grande que la résolution de la MD (320*240 en NTSC), tu ne la verras pas en entier.

je vais redimensionner l'image 320*240 et recommencer.

 

EDIT : C'est bon, 38400/2 et l'image est affiché entièrement, merci Oof-will

Share this post


Link to post
Share on other sites
Peut être mes questions sont maladroite ou ce ne sont pas les bonnes, mais je n'en poserais pas autant si je ne cherchais pas à comprendre, désolé de te donner c'est impression.

 

C'est moi qui ai mal du comprendre, désolé :]

 

Bon courage pour ton projet!

Share this post


Link to post
Share on other sites

desolé de déterrer un sujet qui a plus de 3 mois mais j'avais une question:

imaginons que je veuilles mettre plusieurs tiles

VDP_doVRamDMA( (u32) Sega_tiles, 32, 14400/2);
VDP_doVRamDMA( (u32) Sega2_tiles, ???, 14800/2); // qu'est ce que je mets a la place des points ??? 64 ?

Share this post


Link to post
Share on other sites

Salut,

la fonction VDP_doVram DMA: a pour but d'envoyer des tiles dans la mémoire du VDP en utilisant le DMA.

Elle prends donc pour paramètre :

 

-Le nom de ton tableau

-Son adresse de départ

-La quantités de Tiles en word ( bytes / 2)

 

Donc si tu met 64 il va déja copier toute ta première image à partir de 32 et ensuite en 64 il va commencer à copier la seconde image qui va remplacer une grande partie des Tiles de la première.

 

l'adresse à écrire est donc : ((14400/2)+32)/8 = 904 qui corresponds à l'adresse du dernier tiles.

donc 905*8 = 7240

 

au final :

VDP_doVRamDMA( (u32) Sega2_tiles, 7240, 14800/2);

Share this post


Link to post
Share on other sites
l'adresse à écrire est donc : ((14400/2)+32)/8 = 904 qui corresponds à l'adresse du dernier tiles.

donc 905*8 = 7240

il y avait un truc que je comprenais pas mais en fait on prend la taille en byte, on la divise par 2 pour avoir des world et on la redivise par 2?

donc chaque ligne de la memoire vram contient 4 bytes cad 1 ligne d'un tiles?

et sinon pourquoi on divise 32/32 dans le vdp_FillTilesMapRectInc et pas 32/8 pour avoir l'adresse de mon tile?

Share this post


Link to post
Share on other sites

Parceque ça dépends du paramètre de la fonction , il y a un paramètre qui attends une valeur en tiles ( 8*8 pixels) et un autre qui attends un index de démarrage :

 

 *  \param ind
 *      Tile index where to start to set tilemap.
 *  \param num
 *      Number of tile to set.

Share this post


Link to post
Share on other sites

Moi ce que j'ai compris , c'est que 32, c'est le nombre de bytes d'un tiles , et que du coup, un tile prend 32 lignes (ou case enfin bref) dans la vram et que du coup, on divise par 32 pour avoir l'index, est ce que j'ai bon???

 

merci de votre patience et de vos reponses

Share this post


Link to post
Share on other sites

Pour faire simple, si tu mets tes tiles à la suite:

 

VDP_doVRamDMA( (u32) Sega_tiles, 32, 14400/2);14400 est la place que prend l'image, on l'a mise à 32, la prochaine on la mettra donc à 14400+32
VDP_doVRamDMA( (u32) Sega2_tiles, 14400+32, 256/2); Dans ce cas, la prochaine image sera:
VDP_doVRamDMA( (u32) Sega2_tiles, 14400+32+256, 768/2);

Share this post


Link to post
Share on other sites

×
×
  • Create New...