developper sur SNES avec pvsneslib !

Page 5 sur 5 Précédent  1, 2, 3, 4, 5

Voir le sujet précédent Voir le sujet suivant Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par TOUKO le Sam 18 Nov 2017 - 10:32

mais dès que je dépasse la vingtaine ça commence à ralentir (entre les tests de collisions, les animations, etc)
En même temps 20 sprites animés qui doivent gérer les collisions entre eux,en C c'est pas anodin niveau ressource,encore plus sur snes .

TOUKO
Interne
Interne

Nombre de messages : 12523
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par Vetea le Sam 18 Nov 2017 - 10:50

Meuuuh si !! 


Le C est fantastique !!
Faut au maximum utiliser la force des pointeurs pour tout usage de tableau de structure.
Putain, c'est moi qui donne des conseils de prog ... °_°
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4492
Age : 46
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par TOUKO le Sam 18 Nov 2017 - 11:01

Le C est les 65xxx c'est pas trop des copains, ça dépend aussi du compilo (en général pas top pour ces CPU), du coder, et pour finir y'a aussi l'archi de la snes qui vient compliquer les choses .

Mais j'ai pas l'impression que tu gères les collisions(ou alors de manière simplifiée ??) .
avatar
TOUKO
Interne
Interne

Masculin Nombre de messages : 12523
Age : 44
Localisation : LE MANS/MARSEILLE
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par Vetea le Sam 18 Nov 2017 - 11:06

60 sprites animés et gérés c'est normal hein !
Mais c'est vrai, j'ai souvenir que Alek utilisait beaucoup l'ASM pour ses projets en plus du C du fait de l'Hardware a la ramasse et désastreux de la SNES ... Mais cela est une autre histoire à évoquer dans le post des rageux SNES vs MD. Wink
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4492
Age : 46
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par ichigobankai le Sam 18 Nov 2017 - 11:25

Le moins cher pour le pseudo alétaoire c'est des valeurs précalculées. D'une maniere général tout ce qui est prédictible devrait déjà etre maché pour gagner en perf.

Tu génères un binaire de 256 valeurs (0..255) pour boucler facilement via un char, valeur comprise en X et Y X et Y étant tes valeurs min/max)

Après juste a aller chercher la valeur dans le tableau et incrémenter la position pour la prochaine valeur à recup.

tu peux créer ces valeurs via un logiciel hexa (comme HxD) ou dans wla (mais vu que c'est en asm, pas sur que ce soit utile d'en parler...)
avatar
ichigobankai
Patient incurable

Masculin Nombre de messages : 1058
Age : 38
Localisation : 49
Date d'inscription : 04/04/2011

http://www.mastersystem-france.com

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par TOUKO le Sam 18 Nov 2017 - 11:45

Avoir une valeur aléatoire n'est pas compliqué, la problématique c'est plus d'éviter d'avoir les mêmes valeurs aléatoires à chaque partie,surtout au début .
Pour moi il faut incrémenter la valeur de référence dans les commandes pad du ou des joueur(s) pour avoir un truc le plus aléatoire possible vu que les actions des joueurs ont peu de chances d'être toujours les mêmes .

l'Hardware a la ramasse et désastreux de la SNES
Le hardware n'est pas à la ramasse, il est juste mal pensé a cause des restes évidents de compatibilité nes .
Ce qui tape dans les ressources limitées du CPU qui a 2,6 mhz  n'en avait pas besoin, du coup tu dépenses des cycles inutilement sur des trucs qui sont natifs sur la MD et la PCE .


Dernière édition par TOUKO le Sam 18 Nov 2017 - 13:35, édité 1 fois
avatar
TOUKO
Interne
Interne

Masculin Nombre de messages : 12523
Age : 44
Localisation : LE MANS/MARSEILLE
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par Vetea le Sam 18 Nov 2017 - 11:58

Mal pensé est une cause de la "Ramasse". Wink
Néanmoins, je pense qu'utiliser des tableaux genre t[i] avec une boucle for peut être rédhibitoire.

Pour ma part, avec Papi Reload la somme très importante que j'ai à gérer, je procède comme ceci :
Sprite1_ est ma Structure et Sprites[x] le tableau de cette structure.
Sprite1_ Sprites[x];

Code:

  //Déclaration pointeur tableau
 u16 i=MaxObjet;
 Sprite1_* spr=Sprites;

    // Boucle Principale
 while (i--)
    {
        //Affichage des sprites
        RoutineAffichage(spr);
        // next sprite
        spr++;
    }

Faudrait faire des tests avec cette méthode pour voir si c'est un peu plus rapide. Wink
Bon courage ! :)
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4492
Age : 46
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par drludos le Sam 18 Nov 2017 - 16:24

Merci à tous pour vos conseils, je vais essayer tout cela pour voir si ça booste un peu le jeu !

Je note notamment le fait d'utiliser plutôt des pointeurs vers des structures dans un tableau, au lieu de copier la structure dans une variable locale, ainsi que vos diverses méthodes pour le random "moins gourmand" (après, celui de la lib est vraiment bon, car il génère des valeurs bien différentes).

Sinon oui, je sais très bien qu'utiliser du C sur SNES c'est déjà un gros handicap pour les performances. Je crois même que le 65816 est pire que le 6502 à ce niveau, surtout que le seul compilo disponible (tcc-816) est loin d'être parfait d'après ce qu'on peut lire sur les forums américains (où tout le monde de dit de faire de l'assembleur, ou d'oublier la SNES sinon).

Personnellement, c'est en voyant les réalisations d'Alekmaul avec sa lib que je me suis que quand même, les membres du forum SNESDev exagéraient un peu - même si c'est plus lent, il est possible de faire des petits jeux sympa en C sur SNES.

Maintenant que j'ai commencé, j'avoue que oui, ça se met vite à ramer. Surtout quand je vois ce que fait Vétéa avec Papi Reloaded sur Megadrive. Comme quoi, le "Blast processing" c'est pas qu'un mythe :p. Après, tout est relatif: par rapport à la GB, la SNES est un monstre de puissance pour moi :). En comparaison, sur GB, j'avais commencé un petit shoot: avec 5 ennemis et 3 projectiles à l'écran, qui bougent et collisionnent, mais ne sont pas encore animés, je sature déjà le CPU de la portable).

D'ailleurs, est-ce que vous savez s'il y a émulateur / débugger qui permet de connaitre la "charge CPU" de la SNES ? BGB permet de savoir ça pour la Gameboy, ce qui est hyper pratique pour savoir si ton programme rame ou non !

drludos
Patient en incubation

Masculin Nombre de messages : 64
Age : 37
Localisation : 34
Date d'inscription : 12/10/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par TOUKO le Sam 18 Nov 2017 - 19:17

Sinon oui, je sais très bien qu'utiliser du C sur SNES c'est déjà un gros handicap pour les performances.
Disons que connaitre comment le compilo va te générer tel code en C peut te permettre de faire du code C le plus efficace .
Par exemple je pense qu'il vaut mieux éviter les switch/case en général, je sais pas si le compilo qui est dans la lib optimise ce genre de choses .

Surtout quand je vois ce que fait Vétéa avec Papi Reloaded sur Megadrive
Le 68000 de la Md tourne déjà à 7,6 mhz (vs 2,68 pour celui de la snes), ensuite c'est un CPU taillé pour le C contrairement au 65816, et pour finir le compilateur de SGDK est sans cesse amélioré, contrairement a ceux pour les 65xxx qui datent et sont en général peu performants .
Au final le résultat entre les 2 peut être assez conséquent .

D'ailleurs, est-ce que vous savez s'il y a émulateur / débugger qui permet de connaitre la "charge CPU" de la SNES ? BGB permet de savoir ça pour la Gameboy, ce qui est hyper pratique pour savoir si ton programme rame ou non !
En général on change la couleur de l'overscan avant et après une fonction,ou un bout de code pour avoir une idée .

Personnellement, c'est en voyant les réalisations d'Alekmaul avec sa lib que je me suis que quand même, les membres du forum SNESDev exagéraient un peu - même si c'est plus lent, il est possible de faire des petits jeux sympa en C sur SNES.
Un sdk ne peut s'améliorer que si des gens l'utilisent et font remonter les bugs,et puis contrairement a SGDK qui existe depuis pas mal d'années maintenant(depuis 2006 je crois), celui d'alek est qd même assez jeune,donc forcement il ne peut en aucun cas être aussi bon.
avatar
TOUKO
Interne
Interne

Masculin Nombre de messages : 12523
Age : 44
Localisation : LE MANS/MARSEILLE
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par ichigobankai le Dim 19 Nov 2017 - 7:51

@TOUKO a écrit:Par exemple je pense qu'il vaut mieux éviter les switch/case en général, je sais pas si le compilo qui est dans la lib optimise ce genre de choses

C'est con moi j'aime bien (autant en php qu'en C) Wink
Faut regarder l'asm en sortie pour savoir comment ton compilo gère cette fonction.

Normalement un switch/case "bien fait" devrait générer une belle jumptable.
Evidemment dans un switch/case il faut impérativement des valeurs successives à tester et non un gruyère Razz
avatar
ichigobankai
Patient incurable

Masculin Nombre de messages : 1058
Age : 38
Localisation : 49
Date d'inscription : 04/04/2011

http://www.mastersystem-france.com

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par TOUKO le Dim 19 Nov 2017 - 12:19

C'est con moi j'aime bien (autant en php qu'en C) 
Pas sur PC bien sur, moi aussi j'aime bien et je l'utilisais avec HuC,sauf qd j'ai vu l'impact que ça avait car le compilo ne faisait aucune optimisation .

Normalement un switch/case "bien fait" devrait générer une belle jumptable.
Justement le compilo de la PCE ne le faisait pas . Confused
avatar
TOUKO
Interne
Interne

Masculin Nombre de messages : 12523
Age : 44
Localisation : LE MANS/MARSEILLE
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par drludos le Dim 19 Nov 2017 - 16:32

@TOUKO a écrit:Un sdk ne peut s'améliorer que si des gens l'utilisent et font remonter les bugs,et puis contrairement a SGDK qui existe depuis pas mal d'années maintenant(depuis 2006 je crois), celui d'alek est qd même assez jeune,donc forcement il ne peut en aucun cas être aussi bon.

Loin de moi l'idée de critiquer la PVSNESLib - au contraire, je trouve ça absolument génial comme outil, surtout quand on voit la complexité de l'ASM 65816 et de l'architecture "atypique" de la SNES !
Je trouve notamment super pratique le "workflow" pour ajouter des graphismes (j'ai pas encore testé le son), mais comparé à celui de la GB par exemple, c'est plus simple. Il suffit de dessiner directement dans des fichiers BMP en 16 couleurs, et hop çaa te génère les sprites et les palettes tout seul, c'est extra!

Le seul point que j'ai encore du mal à saisir, c'est comment déterminer l'adresse dans la VRAM où envoyer les sprites et les tiles. J'ai l'impression qu'il y a des contraintes à respecter (alignement, zone haute ou zone basse), mais je ne sais pas encore lesquelles.

C'est vrai que la scène homebrew de la SNES est très chiche en comparaison de celle de la MD, et je pense que c'est avant tout du aux outils et à la complexité de la console (deux processeurs différents, CPU atypique et plus lent que sur la MD, etc.). Mais bon, quand je vois l'enthousiasme sur ce post (qui rassemble trois ou quatre projets mine de rien :p), on se dit que ça peut toujours démarrer :).

De mon coté, j'avance toujours à mon petit rythme. Quand j'aurai un prototype "montrable", j'en ferais un post séparé, mais j'ai déjà une petit base de jeu (deux joueurs qui bougent et peuvent tirer, des ennemis qu'on peut shooter, des compteurs de vie et de score). Merci donc à la PVSNESlib pour me permettre de faire cela, car sinon cela m'aurait été inaccessible.

---------

Au fait, j'ai rencontré un autre problème tout bête. Mon "proto-jeu" marche bien sur ma SNES PAL (testé avec SD2SNES), il marche aussi impeccable sur ZSNES. Par contre, sur Higan et BSNES-accuracy, ca affiche de la bouillie (on dirait qu'il ne trouve pas les palette, les sprites sont là, mais avec des couleurs complètement random).

Sur BSNES Classic normal et SNES9X ça marche, sauf que mes sprites de 32x32 ne s'affichent qu'à moitié (seul le haut est visible, pas le bas). Mon jeu mélangeant des sprites de 16x16 (small) et 32x32 (large), j'imagine que c'est du à une contrainte à respecter dans l'endroit où tu charges les données graphiques de tes sprites.

En effet, au début je chargeait un fichier de sprites en 16x16, un autre en 32x32, et un troisième en 16x16, et ce dernier ne s'affichait pas. Depuis que je charge (via oamInitGfxSet()) mes deux fichiers de sprites 16x16 d'abord, puis celui de 32x32 ensuite, tous les sprites 16x16 sont visibles. Mais ceux de 32x32 sont toujours coupés sur deux émulateurs (sur ZSNES et la vraie SNES j'ai pas ce pb).

Quelqu'un aurait-il des idées sur la source potentielle de ce problème ?
Ou à défaut, quelqu'un saurait-il quelles sont les "règles" à respecter pour déterminer les adresses mémoire où charger les données graphiques de sprites dans la VRAM ?

Merci encore pour votre aide !

drludos
Patient en incubation

Masculin Nombre de messages : 64
Age : 37
Localisation : 34
Date d'inscription : 12/10/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par F.L le Dim 19 Nov 2017 - 17:19

concernant ton bug ,je pense que le plus important c'est que cela fonctionne bien sur ta snes. l'inverse aurait été plus embettant !
avatar
F.L
Docteur *
Docteur *

Masculin Nombre de messages : 2461
Age : 42
Localisation : hérault
Date d'inscription : 11/06/2012

http://fl.basic.free.fr

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par hoit le Mer 29 Nov 2017 - 12:04

Hello tout le monde,

Content de trouver ce topic récent qui parle de pvsneslib :)
J'aimerais aussi développer avec cette lib mais j'ai pas mal de questions et de points qui sont encore flou.

Tout d'abord, merci pour le folder contenant toute l'install: je viens de le comparer avec le miens (car je n'utilise pas la dernière version) mais j'ai l'impression qu'il ne s'agit pas de la dernière non plus. Quand on regarde sur le site portabledev, le tuto jour 3 sur les sprites indique cette signature pour mettre une image en vram :
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, 0, 0x4000, OBJ_SIZE16);
mais celle de ton install (et de la mienne) attend un paramètre supplémentaire (la taille de palsprite) :
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, (&palsprite_end-&palsprite),0, 0x4000, OBJ_SIZE16);
Y a-t'il une version encore plus à jour ?

Pour mes 1ères lignes de code, j'ai voulu afficher un sprite de 32*32 que j'ai dessiné sous paint.
Je le charge avec :
oamInitGfxSet(&snakehead, (&snakehead_end-&snakehead), &snakeheadpal, (&snakeheadpal_end-&snakeheadpal), 0, 0x4000, OBJ_SIZE32);
puis oamSetEx(0, OBJ_SMALL, OBJ_SHOW); et enfin je l'affiche dans la boucle avec oamSetXY(...).
=> L'image ne correspond pas à ce que j'ai dessiné (et le résultat à l'écran est différent entre ton folder d'install et le miens).
Du coup pour bien comprendre, quel est l'intérêt de la palette et que contient-elle ?
Comment savoir à quelle adresse je dois écrire l'image en vram (le 0x4000) et d'où vient cette valeur ?

J'ai besoin de tirer un nombre aléatoire entre 2 valeurs, la lib ne propose qu'une fonction random sans arguments.
J'ai donc inclus stdlib.h puis
srand(time(NULL));
const int MAX = 100, MIN = 1;
int randomvalue = (rand() % (MAX - MIN + 1)) + MIN;
Le compilateur indique malgré tout "warning: implicit declaration of function 'srand'" (alors que l'include est bien fait).
Quelles libs C peut-on utiliser avec du code snes ?
Pour le nombre aléatoire, j'ai trouvé la réponse page précédente :
=> rand() & 3

La vitesse d'animation à l'écran est trop rapide (par exemple dans l'exemple de sprite animé ou de mario), comment ralentir le framerate proprement ?

Y-a-t'il une fonction pour nettoyer l'écran quand il y a du texte pour qu'il ne s'affiche plus sans avoir à repasser dessus ?

Enfin, une dernière question mais pas des moindres : comment faites-vous pour debugger le code ? Le debugger de no$sns est assez obscure...

Merci d'avance :)

hoit
Visiteur de l'hôpital

Masculin Nombre de messages : 3
Age : 30
Localisation : Moselle
Date d'inscription : 29/11/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par F.L le Mer 29 Nov 2017 - 19:10

Salut hoit et bienvenue au  club  BIENVENUE
Alekmaul a dit recemment qu'il mettrait a jour pvsneslib. Il manque dd temps libre en ce moment. Esperons qu'il en trouve pour la fin d'année !
Pour tes questions, j'ai mis entre parentheses le dev sur snes pour qq semaines,il faut que j'optimise mon code,  alors je n'ai plus les codes en tete, desolé. Si qq d'autre ici peut lui repondre, ça serait sympa
A+
avatar
F.L
Docteur *
Docteur *

Masculin Nombre de messages : 2461
Age : 42
Localisation : hérault
Date d'inscription : 11/06/2012

http://fl.basic.free.fr

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par hoit le Mer 29 Nov 2017 - 22:16

Merci :) pas de soucis, je vais attendre bien gentillement et je poursuis mes tests demain !
Bonne soirée


Allez je complète un peu le post précédent après quelques tests.
J'ai lu sur la page précédente que pour obtenir un nombre aléatoire entre 0 et 4, on peut faire un rand() % 4 mais que ce n'est pas optimisé.
Je viens de tester la solution de contournement proposé : rand() & 3 et ca retourne des valeurs entre 0 et 3. Evidemment en mettant rand() & 4 ca donne pas une valeur entre 0 et 4...
Par contre si je le fais en version modulo : consoleDrawText(1,1,"Random value=%u",rand()%4);
la fenêtre no$sns perd immédiatement le focus et repasse sur le debugger.
A quoi est-ce lié ?

Au cas où quelqu'un a le temps de regarder au moins pour le problème d'affichage de sprite, j'ai fais un code minimal qui montre le problème :
s000.tinyupload.com/?file_id=52344458183847874266

hoit
Visiteur de l'hôpital

Masculin Nombre de messages : 3
Age : 30
Localisation : Moselle
Date d'inscription : 29/11/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par drludos le Lun 4 Déc 2017 - 22:43

De mon coté aussi, pas eu le temps de continuer le dev depuis 15 jours. Je me suis remis un peu sur mon projet ce weekend, et je bute sur un nouveau chapitre : le son !

Pour faire simple, j'ai du mal à comprendre comment fonctionne le système audio de PVSnesLib. En prenant les exemples, j'arrive bien à jouer un son (la musique on verra plus tard, je commence par les sons), avec les commandes suivantes :

Code:

extern char shootSFX,shootSFX_end; //adresse du début et de la fin du fichier son au format BRR dans la rom, spécifié dans data.asm

//Variable utilisée pour stocker les params du son (brrsamples et un "struct" de la lib)
brrsamples SFXshoot;

//Charge le son en mémoire et sauve les params dans la struct associée
spcSetSoundEntry(15, 8, 6, &shootSFX_end-&shootSFX, &shootSFX, &SFXshoot);

//Joue le son chargé en mémoire
spcPlaySound(0);

Ce code marche, ce qui est super cool. Malheureusement, je n'arrive à jouer qu'un seul effet sonore à la fois ! En effet, pour jouer d'autres sons, j'ai remis ces mêmes lignes, en changeant le son "source" :

spcSetSoundEntry(15, 8, 6, &explosionSFX_end-&explosionSFX, &explosionSFX, &SFXexplosion);
spcPlaySound(0);

Problème : chaque nouveau son joué remplace instantanément l'autre, il n'y en a donc qu'un seul qui se joue à la fois. La SNES possède plein de voies sonores, mais je ne sais pas comment y accéder Sad.

En regardant le code source de la librairie (/include/sound.h), je vois les fonctions :

Code:
/*! \fn  spcLoadEffect(u16 sfxIndex)
 \brief load sound effect into sm-spc. this function may take some time to execute
 \param sfxIndex sfx_id
*/
void spcLoadEffect(u16 sfxIndex);

/*! \fn  spcEffect(u16 pitch,u16 sfxIndex, u8 volpan)
 \brief Play sound effect (load with spcLoadEffect)
 \param pitch pitch (0-15, 8=32khz)
 \param sfxIndex effect index (0-15)
 \param volpan volume(0..15) AND panning(0..15) (volume*16+pan)
*/
void spcEffect(u16 pitch,u16 sfxIndex, u8 volpan);

Elle m'ont l'air adaptées à mon cas (chargement de plusieurs effets pour ensuite jouer l'effet sonore X en précisant son index). Mais je ne sais pas comment charger plusieurs effets sonore dans la mémoire !

En effet, la fonction "spcLoadEffect" prend elle aussi un index comme seul paramètre, je ne sais donc pas comment "charger" plusieurs effets sonore au format BRR depuis la ROM.

Quelqu'un a des pistes à ce sujet ?


@hoit: je regarde ton code pour voir si je peux t'aider avec mes maigres connaissances

drludos
Patient en incubation

Masculin Nombre de messages : 64
Age : 37
Localisation : 34
Date d'inscription : 12/10/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par drludos le Lun 4 Déc 2017 - 23:17

Quelques éléments dont j'ai déjà la réponse (enfin, je crois :p)

@hoit a écrit:Tout d'abord, merci pour le folder contenant toute l'install: je viens de le comparer avec le miens (car je n'utilise pas la dernière version) mais j'ai l'impression qu'il ne s'agit pas de la dernière non plus. Quand on regarde sur le site portabledev, le tuto jour 3 sur les sprites indique cette signature pour mettre une image en vram :
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, 0, 0x4000, OBJ_SIZE16);
mais celle de ton install (et de la mienne) attend un paramètre supplémentaire (la taille de palsprite) :
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, (&palsprite_end-&palsprite),0, 0x4000, OBJ_SIZE16);
Y a-t'il une version encore plus à jour ?

Je pense au contraire que ta version est plus à jour que celle du site : le tuto date de 2012 sauf erreur de ma part. Ma version aussi, comme la tienne, attends en paramètre la taille de la palette, et je pense que c'est la version la plus récente.
D'ailleurs, c'est un ajout intéressant, car tu peux ainsi charger plusieurs "planches de sprites" et plusieurs palette d'un seul coup avec cette fonction : il suffit de mettre le "palsprite_end" à la fin de ta série de fichier palette dans le data.asm.

Sans cela, il faudrait charger les palettes une par une avec des "dmaCopyCGram()" (car tu ne peux avoir qu'un seul "oamInitGfxSet()" dans ton fichier).

@hoit a écrit:
Pour mes 1ères lignes de code, j'ai voulu afficher un sprite de 32*32 que j'ai dessiné sous paint.
Je le charge avec :
oamInitGfxSet(&snakehead, (&snakehead_end-&snakehead), &snakeheadpal, (&snakeheadpal_end-&snakeheadpal), 0, 0x4000, OBJ_SIZE32);
puis oamSetEx(0, OBJ_SMALL, OBJ_SHOW); et enfin je l'affiche dans la boucle avec oamSetXY(...).
=> L'image ne correspond pas à ce que j'ai dessiné (et le résultat à l'écran est différent entre ton folder d'install et le miens).
Du coup pour bien comprendre, quel est l'intérêt de la palette et que contient-elle ?

Alors, je viens de regarder tes fichiers. Ton code m'a l'air OK, par contre, c'est ton fichier image qui a un problème : c'est un BMP en 256 couleur. Or, sur SNES les sprites sont de 16 couleurs au maximum. En plus, il faut forcément que la couleur transparente (le violet donc) soit la couleur 0 de ta palette.

N'utilise pas Paint, il génère des fichiers que la librairie ne peut pas traiter ensuite (en 256 couleurs avec un palette système windows). Personnellement, j'utilise GraphicsGale, qui te permet de facilement manipuler les palettes (en plus d'être un super logiciel de PixelArt) :
https://graphicsgale.com/us/

Le fichier .pal contient donc une "traduction" de la palette de ton fichier .bmp au format d'image de la SNES. La lib te fait ça toute seule, mais il faut quand même respecter deux conditions :
- Lui fournir des bmps de 16 couleurs maximum
- Que la couleur 0 de ta palette soit la couleur transparente.

@hoit a écrit:
Comment savoir à quelle adresse je dois écrire l'image en vram (le 0x4000) et d'où vient cette valeur ?
Pour le 0x4000, je tâtonne moi aussi. Mais, d'après ce que j'ai compris :

- La SNES à 64ko de mémoire vidéo. Les adresses mémoire vont donc de 0x0000 à 0xFFFF (64 ko).
Cette mémoire contient à la fois les tiles graphiques (patterns) et les tilemap. Tu est libre de choisir les endroit où tu envoie des données dans la mémoire (et donc de faire des bêtises :p)

- Pour bien faire, l'adresse de "début" de chargement des tiles, doit forcément être un multiple de 16ko. Donc ça te laisse uniquement comme choix :
- 0x0000 (0ko mais le système de texte de la lib se les attribue)
- 0x4000 (16ko: moi aussi je charge les sprite en 0x4000)
- 0x8000 (32ko)
- 0xC000 (48ko)


@hoit a écrit:
J'ai besoin de tirer un nombre aléatoire entre 2 valeurs, la lib ne propose qu'une fonction random sans arguments.
J'ai donc inclus stdlib.h puis
srand(time(NULL));
const int MAX = 100, MIN = 1;
int randomvalue = (rand() % (MAX - MIN + 1)) + MIN;
Le compilateur indique malgré tout "warning: implicit declaration of function 'srand'" (alors que l'include est bien fait).
Quelles libs C peut-on utiliser avec du code snes ?
Pour le nombre aléatoire, j'ai trouvé la réponse page précédente :
=> rand() & 3

Pour générer un nombre en X et Y, ton code est bon :
int randomvalue = (rand() % (MAX - MIN + 1)) + MIN;

Mais tu n'a pas besoin de srand() : la libraire initialise déjà le tirage aléatoire lors du "consoleInit()".

@hoit a écrit:
La vitesse d'animation à l'écran est trop rapide (par exemple dans l'exemple de sprite animé ou de mario), comment ralentir le framerate proprement ?

C'est simple, moi je fait un "compteur de frames", que auquel j'applique ensuite un modulo ou un bitmask pour ne bouger que toutes les 2 ou 4 frames.

Pour la SNES, la librairie dispose déjà d'un compteur de frame en interne : "snes_vblank_count" (un unsigned int16 je crois).

Pour bouger toutes les deux frames, tu fait donc :
if( snes_vblank_count % 2 ){
  //Bouge ton sprite
}

Tu peux mettre toutes les 3,4,5... frames pour un mouvement encore plus lent :)

@hoit a écrit:
Y-a-t'il une fonction pour nettoyer l'écran quand il y a du texte pour qu'il ne s'affiche plus sans avoir à repasser dessus ?

Si tu trouves, ça m'intéresse aussi :).

@hoit a écrit:
Enfin, une dernière question mais pas des moindres : comment faites-vous pour debugger le code ? Le debugger de no$sns est assez obscure...

Pour l'instant, je fais sans "débugger" : j'affiche les variables à l'écran via les fonctions d'affichage de texte de la lib. Ensuite, pour aller plus loin (inspecter la VRAM par exemple), j'ai utilisé le débuggeur de no$SNS, mais aussi un programme appelé vSNES, qui te donne plein d'infos à partir d'une savestate de ton jeu:
https://www.romhacking.net/utilities/274/

drludos
Patient en incubation

Masculin Nombre de messages : 64
Age : 37
Localisation : 34
Date d'inscription : 12/10/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par drludos le Mer 6 Déc 2017 - 21:53

Alors, suite des aventures sur l'audio. J'ai écrit à Mukunda, l'auteur de la librairie SNESmod, qui est incluse dans PVSNESLib pour gérer la partie audio.

Il est très sympa et m'a répondu dans la foulée, malheureusement ça fait plus de dix ans qu'il a pas touché au code, et ne se rappelle plus le fonctionnement de sa libraire.

Il n'est même pas sur que la libraire gère le fait de jouer plusieurs effets sonores en même temps.

@Alekmaul, comment fais-tu donc dans tes jeux pour jouer plusieurs sons à la fois (dans Sydney Hunter ou même dans Uwol par exemple) ?

drludos
Patient en incubation

Masculin Nombre de messages : 64
Age : 37
Localisation : 34
Date d'inscription : 12/10/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par hoit le Jeu 7 Déc 2017 - 17:37

drludos, un grand merci pour cette réponse :)
Ca donne déjà pas mal d'éléments, je vais tester les différents points et reviens prochainement !


Edit 1 :
"D'ailleurs, c'est un ajout intéressant, car tu peux ainsi charger plusieurs "planches de sprites" et plusieurs palette d'un seul coup avec cette fonction"
=> j'ai modifié data.asm pour obtenir cela :
snakehead:
.incbin "head.pic"
.incbin "body.pic"
snakehead_end:

snakeheadpal:
.incbin "head.pal"
.incbin "body.pal"
snakeheadpal_end:

Avec un appel à oamInit, je pensais voir en vram (avec no$sns) les 2 images mais il n'y en a aucune
oamInitGfxSet(&snakehead, (&snakehead_end-&snakehead), &snakeheadpal, (&snakeheadpal_end-&snakeheadpal), 0, 0x4000, OBJ_SIZE32);

Si je reviens à la méthode plus "classique" (chaque image a sa section dans data.asm), j'ai :
oamInitGfxSet(&snakehead, (&snakehead_end-&snakehead), &snakeheadpal, (&snakeheadpal_end-&snakeheadpal), 0, 0x4000, OBJ_SIZE32);
oamSet(0,  100, 100, 3, 0, 0, 0, 0);
oamSetEx(0, OBJ_SMALL, OBJ_SHOW);
oamSetVisible(0, OBJ_SHOW);

dmaCopyVram(&snakebody, 0x4000/2+(&snakehead_end-&snakehead)/2,(&snakebody_end-&snakebody));
oamSet(4,  132, 132, 3, 0, 0, 0, 0);
oamSetEx(4, OBJ_SMALL, OBJ_SHOW);
oamSetVisible(4, OBJ_SHOW);

J'ai bien 2 images en vram d'après l'émulateur, mais c'est 2 fois la même (celle chargé avec oamInitGfx).
www.portabledev.com/smf/index.php?topic=313.0
Je me suis inspiré de ce que j'ai lu sur le forum francais de la lib mais je ne comprends pas pourquoi l'image n'est pas la bonne et pour quelles raisons les adresses sont divisées par 2. (le résultat est identique en chargeant par exemple la 2eme image en 0x8000).



Autre question : les caractères de la lib vont des codes ascii 32 à 127. Si j'ai besoin de caractères accentués, y-a-t'il une solution ?


Je reste preneur de toutes infos complémentaires :)

hoit
Visiteur de l'hôpital

Masculin Nombre de messages : 3
Age : 30
Localisation : Moselle
Date d'inscription : 29/11/2017

Revenir en haut Aller en bas

Re: developper sur SNES avec pvsneslib !

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Page 5 sur 5 Précédent  1, 2, 3, 4, 5

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum