Jump to content
Sign in to follow this  
oof-will

Les instructions MD

Recommended Posts

X death est demandé à l'accueil... X death, merci ! :mrgreen:

 

Bon je me suis lancé dans une petite démo MD et comme je n'ai pas vraiment d'expérience (le dernier truc que j'ai programmé c'était un petit jeu sur Ti-83 il y a 10ans :lol:) je me suis dit qu'une explication sur les différentes instructions pourrait être utile...

 

Alors, dans un premier temps, je vais commencer par poser des questions sur les instructions qui m'intéressent, puis je mettrai à jour le premier post pour réunir un peu les infos si ca intéresse du monde...

 

Le premier truc que j'ai voulu faire, c'est un petit écran titre, c'est a dire juste un texte blanc qui au bout de quelques secondes s'assombrit pour laisser place à un écran noir.

 

J'ai vu qu'il existait une fonction du VDP, VDP_fadeOut. Malheureusement, j'ignore totalement quels paramètres utiliser.

 

Bon, en utilisant plusieurs fonctions ainsi que des timers, j'ai tout de même pu réaliser mon fade out, mais mon prog fait déjà 140 rien que pour ca :oops: Si je pouvais faire ca en seulement quelques lignes...

 

Alors, qui peut me dire à quoi correspondent les paramètres dans :

 

VDP_fadePalOut(u16 numpal, u16 numframe, u8 async);

Share this post


Link to post
Share on other sites

Bon tu veut faire un Fade Out ok:

c' est quelque chose que je fait rarement mais Gendev inclut ce qui faut apparemment ( je viens de faire un test).

 

Alors voila comment je l' ai fait:

 

#include "genesis.h"

int main()
{
     VDP_drawTextBG(APLAN,"Loader By Oof-Will !!!!", 0x0000, 2, 5);
     VDP_fadeOutAll(100, 0);  // 100 pour la vitesse du fade
     VDP_waitFadeCompletion();
     VDP_resetScreen();
while (1)
   {}
}

 

VDP_fadeOutAll semble le faire sur tout l' écran après il suffit de faire un Reset sur l' écran vu que je pense que c' est pour l' intro c' est plus simple ainsi.

 

Je sais pas trop ce que tu voulait faire donc je t' ai fait un code très classique.

ça te va ? , rien de bien compliquer dans le code normalement.

si tu veut des infos sur un truc bien précis poste ton code ça m' aidera à bien comprendre ce que tu veut faire.

Share this post


Link to post
Share on other sites

Bon, c'est chiant quand on a pas l'explication des arguments.

 

J'ai essayé de faire un fadein, mais ca me fait n'importe quoi avec les couleurs...

 

Il y a plus d'arguments que dans le fadeOut...

 

Et au fait, a quoi sert le while(1) ?

Share this post


Link to post
Share on other sites
Bon, c'est chiant quand on a pas l'explication des arguments.

 

J'ai essayé de faire un fadein, mais ca me fait n'importe quoi avec les couleurs...

Il y a plus d'arguments que dans le fadeOut...

 

Oui c' est parceque fadeIN attends que tu lui spécifie une palette en argument, sinon il va faire le fade avec une des palettes de bases et ça doit donner des résultats assez relou.

La de mémoire je ne sais plus comment fonctionne FadeIn je regarderai demain.

 

Et au fait, a quoi sert le while(1) ?

 

Définit de cette manière c' est une boucle infinie.

Il est plus "propre" de ne pas laisser le Processeur dans un état d' arrêt ( ce qui n' est jamais le cas dans un jeu ).

Je croit également que sur le RH un arrêt brusque provoque une illégal instruction !

 

Prochaine étape ? :mrgreen:

Share this post


Link to post
Share on other sites

^^

 

En fait pour le moment j'essaie de comprendre les arguments des instructions, j'ai du mal a savoir ce que je dois mettre comme paramètres (u16 tocol, u16 numframe, u8 async j'en passe et des meilleures)

 

Prochaine étape, j'aimerais pouvoir faire quelque chose d'un peu "graphique".

Il va falloir que j'apprenne a gérer les palettes et le système de tiles...

 

Merci pour les infos en tout cas. Je me doutais de l'utilité du while(1), mais je n'étais pas sûr puisque même sans, ca ne débouche pas sur une erreur (du moins dans kmods)

Share this post


Link to post
Share on other sites

ok bah fait moi signe dès que tu veut des infos sur les palettes , utilisation de la VRAM etc..

j' ai une combinaison d' outils et de fonction qui va vraiment bien.

 

EDIT: pour le FadeIN c' est guère plus compliquer:

 

#include "genesis.h"

int main()
{

     VDP_drawTextBG(APLAN,"Loader By Oof-Will !!!!", 0x0000, 2, 5);
     VDP_fadeIn(0, 15, palette_grey, 100, 1);
     VDP_waitFadeCompletion();
     VDP_resetScreen();
while (1)
   {}
}

 

0: Adresse de la palette

15: numéro de la couleur de la palette ( VDP Draw text utilise toujours le numéro 15 de la palette que tu lui spécifie)

100 : vitesse du fade

et le dernier j en ai aucune idée faudra que je regarde comment la fonction est écrite :mrgreen:

 

Voila :lol:

Share this post


Link to post
Share on other sites

Merci pour le coup de main !

 

Bon alors, je ne saisi pas encore tous les arguments, mais j'ai pu néanmoins utiliser les fonctions et en faire ce que j'en voulais.

 

Maintenant je vais attaquer les images et la j'aurais surement besoin d'aide, je vais déjà convertir mon image pour pouvoir être affichée par la MD, ensuite je te demanderai de l'aide pour l'utilisation des tiles...

Share this post


Link to post
Share on other sites

La conversion est faite.

 

Sur ton tuto, tu dis que tu donneras les détails sur le code dans le tuto principal, mais comme tu n'as pas continué :D

 

Comment faire pour afficher mon image ensuite ?

Share this post


Link to post
Share on other sites

ah oui merde c' est vrai :D

 

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[];

 

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);

 

32: Valeur en Tiles de la position ou va commencer la mise en Vram

14400: quantitée en bytes à envoyer en Vram

 

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 ;)

Share this post


Link to post
Share on other sites

Merci.

 

Je dois avoir manqué quelque chose parce que j'ai le message suivant lors du build :

 

main.o||In function `main':|

main.c|| undefined reference to `ppong_pal'|

main.c|| undefined reference to `ppong_tiles'|

||=== Build finished: 2 errors, 0 warnings ===|

Share this post


Link to post
Share on other sites

Bon, j'ai réussi à faire ma rom, mais au moment d'afficher l'image, c'est un peu n'importe quoi qui s'affiche...

 

De plus la palette chargée n'est même pas la bonne...

 

Screen demain, la j'en ai marre ^^

Share this post


Link to post
Share on other sites

Alors voila les infos :

 

J'ai bien mis le ".global" dans mes 2 fichiers asm.

J'ai utilisé les infos que tu m'as donné.

voila mon code :

 

extern u16 ppong_pal[];
extern u32 ppong_tiles[];

...

VDP_setPalette(0, (u16 *) "ppong_pal");
//JOY_waitPressBtn();
VDP_doVRamDMA( (u32) "ppong_tiles", 32, 26600);
VDP_fillTileMapRectInc(APLAN, TILE_ATTR(0, 0, 0, 0) + (32/32),5,5,240/8,320/8);

 

Et voila le resultat ! (déjà la palette n'est pas bonne c'est sur...)

 

EDIT : c'est bon, ca fonctionne presque, mais mes tiles sont dans les désordre on dirait...

EDIT² : ca fonctionne. en fait, les dimensions sont inversées dans ta formule (ou j'avais mal compris, enfin bref, je suis content ;))

Le styme me fait trop penser à un jeu MCD :D

 

Au fait, la 32X n'est elle pas capable d'afficher plus de couleurs ?

Share this post


Link to post
Share on other sites

Impec !

Beau boulot

tu voit c' est pas dur :D

 

Oui la 32X affiche plus de couleur ( Super VDP à une capacités d' affichage de 32768 couleurs), mais je croit qu'elle n' est pas supporter nativement par SGDK.

Si tu peut toujours m' en récupérer un , je regarderai pour faire un Kit car on pourrais faire de très beau Loader avec des modifs seulement pour l' affichage.

Share this post


Link to post
Share on other sites

Ca fait rever les capacités du 32X :D

 

En fait, pour cette image, je n'ai utilisé qu'une palmette, donc 16 couleurs.

 

J'imagine qu'on peut avoir de belles images en utilisant les 4 palettes, mais pour l'instant, je ne me suis pas penché sur le découpage. Peut être la prochaine étape ? ;)

 

Pour un loader, ce n'est peut être pas super intéressant d'utiliser le 32X (ou alors pour des jeux 32X évidemment)

Par contre, je me serait bien fait un petit programme 32X après la Méga drive... mais je n'en suis pas encore la ^^

 

Merci pour l'aide et les encouragement en tout cas.

 

Pour l'heure, j'ai réussi à faire un fadein sur l'image en utilisant le fadeInAll, le problème, c'est que j'ai l'image qui s'affiche une fraction de seconde et ensuite l'éran devient noir et ca me fait le FadeIn. Je ne sais pas à quel moment placer mon fadeIn car si je le met avant, il met fait le fadeIn sur une image noire et ensuite m'affiche mon image directement avec les couleurs normales...

 

    VDP_setPalette(0, (u16 *) ppong_pal);
   VDP_doVRamDMA( (u32) ppong_tiles, 32, 38400);
   VDP_resetScreen();
   VDP_fillTileMapRectInc(BPLAN, TILE_ATTR(0, 0, 0, 0) + (32/32),0,1,320/8,214/8);
   VDP_fadeInAll((u16 *) ppong_pal, 100, 0);
   VDP_waitFadeCompletion();

 

EDIT : j'ai réussi. En fait je n'initialise pas la palette de couelur avant le fadeIn sinon mon image apparait.

Ma palette est initialisée par le fadeInAll, et la ca fonctionne !!

 

    VDP_doVRamDMA( (u32) ppong_tiles, 32, 38400);
   VDP_fillTileMapRectInc(BPLAN, TILE_ATTR(0, 0, 0, 0) + (32/32),0,1,320/8,214/8);
   //VDP_setPalette(0, (u16 *) ppong_pal);
   VDP_fadeInAll((u16 *) ppong_pal, 100, 0);
   VDP_waitFadeCompletion();

Share this post


Link to post
Share on other sites

Ha Ha Nice !

Ma première démo n' était pas aussi bien ;)

J' espère que c' est pas le tient sur l' image :D

 

Edit: Pour modifier le noms de ta roms , ouvre la avec un éditeur Héxa , Sample Program est dans le Header.

Share this post


Link to post
Share on other sites

Merci, je vais modifier cela ;)

 

Ah ah, non ce n'est pas ma voiture :D

 

Je vais essayer de faire bouger un sprite maintenant.

 

Première étape : réussir à l'afficher.

La seconde, le faire bouger avec la croix directionnelle.

 

??videmment pour le moment, pas d'animation, juste faire bouger un truc sur l'écran ^^

Share this post


Link to post
Share on other sites

En ce qui me concerne j' utilise les fonctions suivantes:

 

exemple pour la fleche de Golden Axe:

 

VDP_doVRamDMA( (u32) fleche_tiles, 55680,32);
VDP_setSprite(0, 10, 10, 0xF, 0x4000+1, 1);
VDP_updateSprites();

 

donc Set sprite doit fonctionner comme ça:

 

0 : adresse du sprite en Spritelist ( à voir dans le debug du Kmods)

10 : position du sprite en X

10: position du sprite en Y

0xF : notion de priorité ( on verra plus tard )

0x4000 : palettes à utiliser donc ici la 2

+1 : adresse du sprite en Vram à augmenter de 16 en 16 soit +17 pour la seconde en 32x32

1: link ne modifie pas ça pour l' instant

 

Tu appelle UpdateSprite dès que tu fait une modif sur un sprite !

 

Voila :mrgreen:

Share this post


Link to post
Share on other sites

Bon, je n'arrive pas à afficher mon sprite.

 

Je ne comprends pas les valeurs que tu renseignes pour le VDP_doVRamDMA

 

Je croyais que le 32 tout a la fin correspondait à la taille en bytes, mais quelle est la valeur avant dans le cas ?

Share this post


Link to post
Share on other sites

c' est un exemple !

surtout n' en tient pas compte c' est juste quand dans le Loader Golden Axe je démarre de loin pour les sprites car j' utilise beaucoup de Vram pour afficher mes différentes images.

tu peut commencer à partir de 32 par exemple pour la première valeur et effectivement oui la seconde valeur est en bytes donc moi tu peut voir que j' affiche un sprite de 8*8 :mrgreen:

Share this post


Link to post
Share on other sites

Ok j'ai compris.

 

par contre, je ne sais pas pourquoi, j'ai des trucs bizarres qui s'affichent un peu partout dans l'écran... j'ai du mal a voir ou est mon erreur. Je vais essayer de refaire mon sprite...

 

Au fait, peux tu m'expliquer pour la couleur transparente ? ce doit être la première dans la palette non ? mais je n'arrive pas à la paramétrer dans photoshop... Par exemple en première couleur j'ai du rouge et du coup il m'affiche un fond rouge (logique...)

 

EDIT : ca vient de la taille de mon sprite, bien trop gros je pense ^^

C'est quoi la taille maxi ? 32*32 ?

 

J'ai pu afficher un truc a peu près ressemblant, mais les tiles sont dans le désordre ...

Share this post


Link to post
Share on other sites

-la première couleur de la palette 0 est utiliser pour le fonds d' écran.

-la première couleur de chaque palette est la couleur de transparence.

-La plan A est au dessus du plan B

 

Voila avec ça tu peut tu débrouiller je pense :mrgreen:

Après j' utilise PaintShopPro et Pedit pour faire mes palettes donc peut pas t'aider pour Photoshop , mais bon je sais que Ichigo m' avait sortit un truc parfait avec golden axe donc doit y avoir moyen.

 

Edit : si tu veut envoie moi ton dossier avec tes sources + BMP

 

EDIT 2 : oui taille maxi 32*32

Share this post


Link to post
Share on other sites

pour l'ordre sur photoshop :

 

 

> Enregistrer pour le web

il faut évidemment un zone transparente dans l'image

 

cap10.jpg

 

ensuite clic comme indiqué dans la capture, et ca te mettra la transparence en 1 choix (après tu pourras changer la valeur de couleur dans Image > Mode > Couleurs indéxées, sauvegarder ta palette, la recharger...)

 

bon la c'est pour te montrer, j'ai pas limité à une palette de 16 couleurs, mais c'est pareil.

Share this post


Link to post
Share on other sites

Super, merci pour l'explication !

 

Je vais tenter de m'y remettre, histoire de faire de jolis images en plus de 16 couleurs... ;)

 

Mais avant cela, j'ai un problème pour l'acquisition des touches. J'ai fait mes petits essais et je n'arrive pas a grand chose.

 

J'arrive à interroger un bouton en particulier (JOY_waitPress(u16 joy, u16 btn)), mais quand il y a le choix entre plusieurs boutons, ca ne va plus...

 

Voila mon code si jamais ...

 

while(1);
       {if(JOY_readJoypad(0x0000)==0x0002);  //si appui sur DOWN
           {
               VDP_clearText(1, a, 2);
               a=a+1;
               VDP_drawText("->", 1, a);
           }
        if(JOY_readJoypad(0x0000)==0x0001);  //si appui sur UP
               {
               VDP_clearText(1, a, 2);
               a=a-1;
               VDP_drawText("->", 1, a);
               }
       }

Share this post


Link to post
Share on other sites

un switch case serait plus approprier sinon avec ees if elseif

 

switch ( JOY_readJoypad(0x0000) )
{
  case ( 2 ):
  {
      VDP_clearText(1, a, 2);
      a=a+1;
      VDP_drawText("->", 1, a);
      break;
  }
  case ( 1 ):
  {
      VDP_clearText(1, a, 2);
      a=a-1;
      VDP_drawText("->", 1, a);
      break;
  }
}


Share this post


Link to post
Share on other sites

Ok visiblement tu a suivit l' exemple sur le site de SGDK je pense.

Personnellement je ne procède pas comme ça , je vais te montrer avec un code exemple , mais ne sachant pas " Programmer" je sait pas ce qui est le mieux pour la machine:

 

je fait ça en deux temps , déja je prépare le terrain

 


JOY_init();

// Gestion du Joystick

   u16 value;
   u16    up;
   u16  down;
   u16  left;
   u16 right;
   u16 start;
   u16     A;
   u16     B;
   u16     C;



 

et Après tu gère tes actions dans une boucle

 

// Boucle Principale

   while (1)
   {
         value = JOY_readJoypad(JOY_1);
       up    = value & BUTTON_UP;
       down  = value & BUTTON_DOWN;
       left  = value & BUTTON_LEFT;
       right = value & BUTTON_RIGHT;
       start = value & BUTTON_START;
         A   = value & BUTTON_A;
         B   = value & BUTTON_B;
         C   = value & BUTTON_C;
              JOY_update();

           if (down)

             {
                  for(i=0;i<10;i++){VDP_waitVSync();}
                  jeu++;
             }

              if (up)
             {
                  for(i=0;i<10;i++){VDP_waitVSync();}
                  jeu--;
             }

           if (jeu==1) // Golden Axe 2
           {
               pal_jeu1=8192;
               pal_jeu2=0;
               pal_jeu3=8192;
               VDP_fillTileMapRectInc(APLAN, TILE_ATTR(1, 0, 0, 0) + (37760/32),21,9,32/8,32/8);
           }
}

 

Voila c' est un exemple , avec mon raisonnement , y'a des gens qui programme bien mieux que moi ici , ils seront mieu placer que moi pour te dire ce qui est "Propre"

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...