developper sur SNES avec pvsneslib !
+11
Stef
upsilandre
ichigobankai
Tryphon
uran
drludos
tetsuro
lincruste
vincent2105
mic
F.L
15 participants
Page 4 sur 9
Page 4 sur 9 • 1, 2, 3, 4, 5, 6, 7, 8, 9
Re: developper sur SNES avec pvsneslib !
Bon j'avance doucement, à mon rythme (le weekend quoi), mais j'avance :).
Je me retrouve un peu bloqué par la gestion des background et du texte, et du coup j'ai 3 nouvelles questions:
- Comment faire pour qu'un Sprite apparaisse "progressivement" depuis la gauche de l'écran. En affectant des valeur en X et Y des sprites (via oamSetXY), j'arrive bien à déplacer des sprites en dehors de l'écran par le haut, le bas et la droite. Et on peut donner l'illusion qu'il arrivent de dehors / d'un scrolling. Par contre, dès que je leur donne une position X < 0, ils se téléportent à droite de l'écran, impossible donc de les faire apparaitre progressivement par ce coté.
Je sais que c'est possible car Alekmaul l'a fait par exemple dans Uwol (le perso peut être visible "en partie" à gauche comme à droite de l'écran), mais j'arrive pas à savoir comment ?
- Pour les tiles du background, j'ai dessiné une tile de 32x32 pixels. Comment arriver à l'afficher sur tout l'écran?
- Enfin, je n'arrive pas à faire marcher le moteur de texte. J'arrive bien à compiler les exemples fournis avec la lib, mais une fois dans mon jeu, les fonctions initSetText et autres ne font qu'ajouter du "déchet" graphique. On dirait que la lib n'arrive pas à charger les données graphiques du texte, mais trouve des données "corrompues" à la place (en tout cas, la font n'apparait pas dans la VRAM en utilisant no$sns). J'ai testé en prenant le fichier pvsneslibfont.pic directement d'un exemple qui marche, ça fait pareil.
Une idée de la source potentielle du problème ?
Merci encore pour votre aide !
Je me retrouve un peu bloqué par la gestion des background et du texte, et du coup j'ai 3 nouvelles questions:
- Comment faire pour qu'un Sprite apparaisse "progressivement" depuis la gauche de l'écran. En affectant des valeur en X et Y des sprites (via oamSetXY), j'arrive bien à déplacer des sprites en dehors de l'écran par le haut, le bas et la droite. Et on peut donner l'illusion qu'il arrivent de dehors / d'un scrolling. Par contre, dès que je leur donne une position X < 0, ils se téléportent à droite de l'écran, impossible donc de les faire apparaitre progressivement par ce coté.
Je sais que c'est possible car Alekmaul l'a fait par exemple dans Uwol (le perso peut être visible "en partie" à gauche comme à droite de l'écran), mais j'arrive pas à savoir comment ?
- Pour les tiles du background, j'ai dessiné une tile de 32x32 pixels. Comment arriver à l'afficher sur tout l'écran?
- Enfin, je n'arrive pas à faire marcher le moteur de texte. J'arrive bien à compiler les exemples fournis avec la lib, mais une fois dans mon jeu, les fonctions initSetText et autres ne font qu'ajouter du "déchet" graphique. On dirait que la lib n'arrive pas à charger les données graphiques du texte, mais trouve des données "corrompues" à la place (en tout cas, la font n'apparait pas dans la VRAM en utilisant no$sns). J'ai testé en prenant le fichier pvsneslibfont.pic directement d'un exemple qui marche, ça fait pareil.
Une idée de la source potentielle du problème ?
Merci encore pour votre aide !
drludos- Patient contaminé
- Nombre de messages : 247
Date d'inscription : 12/10/2017
Re: developper sur SNES avec pvsneslib !
Un peu normal je dirai, X<0,on va dire -1 ,c'est 255, donc à droite(sinon impossible de dépasser les 127 sur ton écran) .contre, dès que je leur donne une position X < 0, ils se téléportent à droite de l'écran, impossible donc de les faire apparaitre progressivement par ce coté.
Je dirai que X doit être sur 16 bits (et non 8), donc déclaré en int si tu veux le faire sortir de l'écran (gauche ou droite) .
Et je pense qu'une valeur inférieure à 65535 ou $FFFF devrait marcher .
Invité- Invité
Re: developper sur SNES avec pvsneslib !
Faut dire que l'OAM de la SNES c'est une cata par rapport a une Megadrive (ou une PCE).
upsilandre- Interne
- Nombre de messages : 5138
Age : 49
Localisation : val de marne 94
Date d'inscription : 31/05/2015
Re: developper sur SNES avec pvsneslib !
Es tu certain que la variable qui gère la coordonnée de ton sprite en X est bien de type signed short ?drludos a écrit:
- Comment faire pour qu'un Sprite apparaisse "progressivement" depuis la gauche de l'écran. En affectant des valeur en X et Y des sprites (via oamSetXY), j'arrive bien à déplacer des sprites en dehors de l'écran par le haut, le bas et la droite. Et on peut donner l'illusion qu'il arrivent de dehors / d'un scrolling. Par contre, dès que je leur donne une position X < 0, ils se téléportent à droite de l'écran, impossible donc de les faire apparaitre progressivement par ce coté.
Invité- Invité
Re: developper sur SNES avec pvsneslib !
alekmaul a écrit:Es tu certain que la variable qui gère la coordonnée de ton sprite en X est bien de type signed short ?
Je dirais que théoriquement il faut juste du short (signed ou unsigned qu'importe), si tu fais x -= 20 sur un unsigned short < 20 alors il va passer à 655xx, ce qui sera bien interprété comme une valeur négative au final dans l'OAM.
Je pense qu'il doit utiliser du byte actuellement d'où le problème.
Sinon dans ta doc je vois que la fonction est définie comme :
void oamSetXY(u16 id, u16 xspr, u16 yspr)
Le fait d'utiliser des u16 ne change en réalité pas grand chose mais pour le développeur je pense que des s16 serait plus logique (car la position peut effectivement être < 0), d'ailleurs j'avais fait la même chose dans SGDK au début
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: developper sur SNES avec pvsneslib !
Merci à tous pour vos suggestions !
Ma variable de position X est bien en signed short. J'ai aussi essayé de la mettre en int, et dans le deux cas ça ne change rien. J'ai l'impression que c'est l'OAM qui, dès qu'on lui donne une valeur < 0 en X, bascule automatiquement sur 255. Ca me fait pareil que j'utilise oamSet ou oamSetXY.
Pour info, j'utilise la version 2.3.0 de la lib, et non la dernière version, comme suggéré sur le gitHub pour éviter le bug de "les examples se compilent mais rien ne s'affiche à l'écran". Donc peut-être que c'est un bug qui a été corrigé depuis ?
-------------
Sinon, j'ai finalement réussi à trouver la solution à ma question 3, celle du texte qui ne s'affichait pas. C'était tout simplement lié à une "collision" d'adresse mémoire visiblement. En effet, je chargeais mes sprites en 0x0000, et apparemment le moteur de texte lui aussi charge la font à cette adresse. En passant l'adresse mémoire des sprites à 0x4000, le problème est résolu.
A ce propos, pourquoi faut-il que l'adresse de chargement en VRAM des sprites ou des tiles de backround soit alignée sur 4K?
(ce qui ne laisse que 4 adresses de départ donc si j'ai bien suivi : 0x0000, 0x4000, 0x8000, 0xC000)
Ma variable de position X est bien en signed short. J'ai aussi essayé de la mettre en int, et dans le deux cas ça ne change rien. J'ai l'impression que c'est l'OAM qui, dès qu'on lui donne une valeur < 0 en X, bascule automatiquement sur 255. Ca me fait pareil que j'utilise oamSet ou oamSetXY.
Pour info, j'utilise la version 2.3.0 de la lib, et non la dernière version, comme suggéré sur le gitHub pour éviter le bug de "les examples se compilent mais rien ne s'affiche à l'écran". Donc peut-être que c'est un bug qui a été corrigé depuis ?
-------------
Sinon, j'ai finalement réussi à trouver la solution à ma question 3, celle du texte qui ne s'affichait pas. C'était tout simplement lié à une "collision" d'adresse mémoire visiblement. En effet, je chargeais mes sprites en 0x0000, et apparemment le moteur de texte lui aussi charge la font à cette adresse. En passant l'adresse mémoire des sprites à 0x4000, le problème est résolu.
A ce propos, pourquoi faut-il que l'adresse de chargement en VRAM des sprites ou des tiles de backround soit alignée sur 4K?
(ce qui ne laisse que 4 adresses de départ donc si j'ai bien suivi : 0x0000, 0x4000, 0x8000, 0xC000)
drludos- Patient contaminé
- Nombre de messages : 247
Age : 44
Localisation : 34
Date d'inscription : 12/10/2017
Re: developper sur SNES avec pvsneslib !
drludos a écrit:Merci à tous pour vos suggestions !
Ma variable de position X est bien en signed short. J'ai aussi essayé de la mettre en int, et dans le deux cas ça ne change rien. J'ai l'impression que c'est l'OAM qui, dès qu'on lui donne une valeur < 0 en X, bascule automatiquement sur 255. Ca me fait pareil que j'utilise oamSet ou oamSetXY.
Pour info, j'utilise la version 2.3.0 de la lib, et non la dernière version, comme suggéré sur le gitHub pour éviter le bug de "les examples se compilent mais rien ne s'affiche à l'écran". Donc peut-être que c'est un bug qui a été corrigé depuis ?
Ca m'étonnerait mais peut être que la fonction ne met pas à jour le 9eme bit de la position X (qui se trouve dans la HIGH OAM) et qu'il faut utiliser une autre fonction pour ça ?
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: developper sur SNES avec pvsneslib !
Je confirme ce que je disais par rapport aux fonctions oamSet() et oamSetXY().
J'ai repris un fichier "vide" pour faire d'autres tests (pour éviter que ce soit un autre élément de mon futur jeu qui cause le pb). En affectant directement une valeur négative en X via un de ces deux fonctions, le sprite se téléporte du coté droit de l'écran. Il fait un "wrap", sans disparaitre d'abord progressivement du coté gauche.
Peut-être est-ce lié à ce que propose Stef?
En lisant le code source de la fonction oamSetXY, elle a l'air de modifier à la fois le "high bit" et le "low bit" de position, mais je dois avouer ne pas m'y connaitre assez sur l'architecture de la SNES pour savoir s'il y a éventuellement un bug dans cette fonction ou non.
Ma seule hypothèse naïve serait que le pb viendrait peut-être du fait que la fonction reçoit une position X en "unsigned int" au lieu de "int", ce qui fait que le code permettant de déterminer s'il faut activer ou non le bit 9 déterminant le "signe" de la position X du sprite dans l'OAM ne marche pas?
J'ai repris un fichier "vide" pour faire d'autres tests (pour éviter que ce soit un autre élément de mon futur jeu qui cause le pb). En affectant directement une valeur négative en X via un de ces deux fonctions, le sprite se téléporte du coté droit de l'écran. Il fait un "wrap", sans disparaitre d'abord progressivement du coté gauche.
Peut-être est-ce lié à ce que propose Stef?
En lisant le code source de la fonction oamSetXY, elle a l'air de modifier à la fois le "high bit" et le "low bit" de position, mais je dois avouer ne pas m'y connaitre assez sur l'architecture de la SNES pour savoir s'il y a éventuellement un bug dans cette fonction ou non.
- Code:
void oamSetXYEx(unsigned int id, unsigned int x, unsigned char y) {
#define OAM_HI_TABLE_START 128*4
// Set low byte of x position and y position:
unsigned char x_lo = (unsigned char)x;
oamSetXY(id,x,y);
// Note that id isn't the OAM id, but a direct index into OAM shadow memory;
// the result is that id/4 is the actual oam index, which is required for determining
// the OAM high table position.
unsigned char oam_id = (unsigned char)(id >> 2);
// Set highest bit of x position: Either at bit 0,2,4,6 depending on oam id,
// as 4 oam entries are merged into one byte of the OAM high table.
int bit_shift = 2*(oam_id % 4);
int in_byte_position = 1 << bit_shift;
int oam_high_table_pos = OAM_HI_TABLE_START + oam_id / 4;
oamMemory[oam_high_table_pos] &= ~in_byte_position; // Clear current high bit of x
oamMemory[oam_high_table_pos] |= (x>>8)<<bit_shift; // Fill in new high bit of x
}
Ma seule hypothèse naïve serait que le pb viendrait peut-être du fait que la fonction reçoit une position X en "unsigned int" au lieu de "int", ce qui fait que le code permettant de déterminer s'il faut activer ou non le bit 9 déterminant le "signe" de la position X du sprite dans l'OAM ne marche pas?
drludos- Patient contaminé
- Nombre de messages : 247
Age : 44
Localisation : 34
Date d'inscription : 12/10/2017
Re: developper sur SNES avec pvsneslib !
Le code de la fonction que tu montres c'est oamSetXYEx(..) qui elle même utilise oamSetXY(..), il faut donc que tu utilises oamSetXYEx(..) si tu veux que le bit de poids fort soit mis à jour dans la high OAM.
D'ailleurs j'espère que le %4 est bien optimisé par le compilateur (remplacé par un &3) sinon laisse tomber la catastrophe :p
Le unsigned / signed int ne change rien ici car il n'y a pas d'opération qui dépende du signe ici (ou plutot pas qui puisse faire une différence ici).
D'ailleurs j'espère que le %4 est bien optimisé par le compilateur (remplacé par un &3) sinon laisse tomber la catastrophe :p
Le unsigned / signed int ne change rien ici car il n'y a pas d'opération qui dépende du signe ici (ou plutot pas qui puisse faire une différence ici).
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: developper sur SNES avec pvsneslib !
hello
moi aussi ça avance doucement.
je suis enfin arrivé à afficher des variables à l'écran, youpi
et j'ai aussi le meme probleme que drludos, quand mes valeurs deviennent negatives.
c'est bizarre ce sont les memes codes que sur pcengine et ça ne le faisait pas.
je vais essayer des if ( x <= 0 ) { x = 0 ; }
plutot que if ( x < 0 ) { x = 0 ; }
pour voir si ça resout le probleme
aussi, la compilation est longue chez moi....
bref, cette snes est dificile à dompter, mais le jeu en vaut la chandelle
@+
moi aussi ça avance doucement.
je suis enfin arrivé à afficher des variables à l'écran, youpi
et j'ai aussi le meme probleme que drludos, quand mes valeurs deviennent negatives.
c'est bizarre ce sont les memes codes que sur pcengine et ça ne le faisait pas.
je vais essayer des if ( x <= 0 ) { x = 0 ; }
plutot que if ( x < 0 ) { x = 0 ; }
pour voir si ça resout le probleme
aussi, la compilation est longue chez moi....
bref, cette snes est dificile à dompter, mais le jeu en vaut la chandelle
@+
Re: developper sur SNES avec pvsneslib !
Je me lance dans l'aventure également.
J'espère ne pas trop galérer pour afficher mes premières images.
J'espère ne pas trop galérer pour afficher mes premières images.
Re: developper sur SNES avec pvsneslib !
Je vous envie, j'aimerais me lancer dans l 'aventure aussi :)
Vous codez en quel langage ?
Vous codez en quel langage ?
tetsuro- Patient contaminé
- Nombre de messages : 593
Age : 47
Localisation : Carcassonne
Date d'inscription : 27/12/2015
Re: developper sur SNES avec pvsneslib !
En C. Nous suivons le chemin tracé par Alekmaul.
Pour l'instant, j'essaye doucement de modifier les exemples pour arriver à un truc assez complet qui aurait du texte et des images.
Pour l'instant, j'essaye doucement de modifier les exemples pour arriver à un truc assez complet qui aurait du texte et des images.
Re: developper sur SNES avec pvsneslib !
à l'heure actuelle c'est le seul compilo en C pour la snes
et c'est un français qui l'a fait. cocorico
alekmaul a dit que dès qu'il aurait un peu de temps il mettrait à jour pour corriger qq defauts
et c'est un français qui l'a fait. cocorico
alekmaul a dit que dès qu'il aurait un peu de temps il mettrait à jour pour corriger qq defauts
Re: developper sur SNES avec pvsneslib !
La snes est ma console préférée, j'aimerais vraiment pouvoir dev quelques bricoles dessus.
J'ai le même soucis que vous concernant les positions négatives qui ne sont pas prises en compte (disparition du sprite pour revenir s'afficher à droite).
Je n'arrive pas à comprendre ce phénomène. Lorsqu'un sprite passe à une position X négative, il "saute" à 256. Chose qui n'est pas vrai en Y...
J'ai le même soucis que vous concernant les positions négatives qui ne sont pas prises en compte (disparition du sprite pour revenir s'afficher à droite).
Je n'arrive pas à comprendre ce phénomène. Lorsqu'un sprite passe à une position X négative, il "saute" à 256. Chose qui n'est pas vrai en Y...
Re: developper sur SNES avec pvsneslib !
Vous utilisez oamSetXY(..) ou oamSetXYEx(..) ?
A priori il faut utiliser la seconde fonction...
A priori il faut utiliser la seconde fonction...
Stef- Interne
- Nombre de messages : 5087
Age : 45
Localisation : Sevres
Date d'inscription : 04/04/2007
Re: developper sur SNES avec pvsneslib !
Est-ce que vous parvenez tous à voir l'exemple du mario ? Moi je n'ai que le son pour l'instant. En modifiant le code pour forcer la visibilité peut être ?
Le wiki du site est très bien fait bien qu'en anglais ce soit moins évident. Hâte qu'n ai la suite des articles. Comment afficher un fond etc...mais déjà si on parvient à décortiquer l'exemple de mario...
Le wiki du site est très bien fait bien qu'en anglais ce soit moins évident. Hâte qu'n ai la suite des articles. Comment afficher un fond etc...mais déjà si on parvient à décortiquer l'exemple de mario...
Re: developper sur SNES avec pvsneslib !
Stef a écrit:Vous utilisez oamSetXY(..) ou oamSetXYEx(..) ?
A priori il faut utiliser la seconde fonction...
Alors, visiblement, avec oamSetXYEx ça ne marche pas mieux.
Voici ce que j'obtiens en utilisant cette fonction:
Au lieu de téléporter le sprite à droite, celui-ci disparait effectivement progressivement. Par contre, du coup il s'affiche en triple quand on met un X < 0 en utilisant oamSetXYEx().
Je suis débutant en SNES, mais je pense que c'est peut-être un bug de la fonction, qui au lieu de modifier uniquement le bit de l'OAM qui contrôle le signe de la position X du sprite, il modifie sans doute aussi celui qui contrôle sa taille (le faisant passer de "SMALL" à "LARGE"). Cela qui expliquerai qu'il passe d'un affichage 8x8 à un affichage 16x16 lorsque le X < 0 (qui montre donc les deux autres sprites présents dans la VRAM).
Dernière édition par drludos le Jeu 16 Nov 2017 - 18:01, édité 1 fois
drludos- Patient contaminé
- Nombre de messages : 247
Age : 44
Localisation : 34
Date d'inscription : 12/10/2017
Re: developper sur SNES avec pvsneslib !
Fax a écrit:Est-ce que vous parvenez tous à voir l'exemple du mario ? Moi je n'ai que le son pour l'instant. En modifiant le code pour forcer la visibilité peut être ?
Le wiki du site est très bien fait bien qu'en anglais ce soit moins évident. Hâte qu'n ai la suite des articles. Comment afficher un fond etc...mais déjà si on parvient à décortiquer l'exemple de mario...
Bienvenue dans l'aventure SNES avec nous Fax :)!
Pour la PVSNESLib, oui, la dernière version est buggué et les exemples ne se compilent pas. C'est un problème connu que plusieurs personne ont rencontré: https://github.com/alekmaul/pvsneslib/issues/5
En attendant qu'il soit résolu, la solution est d'utiliser une version un peu plus ancienne de la librairie, qui marche impeccable :
http://www.portabledev.com/wiki/doku.php?id=currentversion_en
Avec cette version, j'arrive à compiler l'exemple "LikeMario" qui marche bien et sans pb.
C'est d'ailleurs avec cette "vieille" version que je travaille depuis le début.
Je crois que F.L. a réussi à faire marcher une version plus récente, dont tu peux récuperer le dossier "prêt à l'emploi" ici :
https://www.dropbox.com/s/g4gb2ypmdfqpihr/dossierSNESdEV.zip?dl=0
@Tetsuro: si tu veux te lancer, n'hésites pas à nous rejoindre ! A mon avis, c'est plus facile de coder un jeu SNES en C grâce à la super librairie d'Alekmaul, que de coder un jeu Atari ST en ASM
drludos- Patient contaminé
- Nombre de messages : 247
Age : 44
Localisation : 34
Date d'inscription : 12/10/2017
Re: developper sur SNES avec pvsneslib !
J'ai déjà pris son dossier qui a fonctionné au poil sous Windows 10 d'ailleurs. Mais la plupart des exemples n'affichent rien. Probablement dû au bug qu'alekmaul à déjà répondu (visibilité des images à forcer).
Je vais tester un peu ce soir je vous redirai. Si avec la visibilité ça ne fonctionne pas je passerai à la vieille version.
Je vais tester un peu ce soir je vous redirai. Si avec la visibilité ça ne fonctionne pas je passerai à la vieille version.
Re: developper sur SNES avec pvsneslib !
Oui mon dossier n'affiche pas grand chose a part simple sprite avec une petite manip et celle du mode7
Pour la version ancienne, je l'ai essayée et elle ne marche pas mieux chez moi... mystere
Pourtant alekmaul a modifié son code pour afficher un background et ça marche avec mon dossier.
Pour la version ancienne, je l'ai essayée et elle ne marche pas mieux chez moi... mystere
Pourtant alekmaul a modifié son code pour afficher un background et ça marche avec mon dossier.
Re: developper sur SNES avec pvsneslib !
Est-ce que tu sais ce qu'il a changé par hasard dans le code ? Car je t'avoue que pouvoir faire fonctionner l'exemple du mario m'aiderait grandement à comprendre ce qui cloche dans mon code à l'heure actuelle.
Re: developper sur SNES avec pvsneslib !
tu n'es pas le seul a vouloir l'exemple de mario qui marche !
Re: developper sur SNES avec pvsneslib !
J'ai réussis à afficher le fond grâce à ce lien : https://github.com/alekmaul/pvsneslib/issues/5
Il suffit d'ajouter
juste après
Je constate que le personnage se situe en dehors de l'écran sur la droite et qu'on ne peux pas le faire "revenir" à l'écran.
C'est tout de même pas simple à comprendre tout ça.
Il suffit d'ajouter
- Code:
setBrightness(0xF);
juste après
- Code:
// Wait VBL 'and update sprites too ;-) )
WaitForVBlank();
Je constate que le personnage se situe en dehors de l'écran sur la droite et qu'on ne peux pas le faire "revenir" à l'écran.
C'est tout de même pas simple à comprendre tout ça.
Re: developper sur SNES avec pvsneslib !
Promis, je reprends la lib au mois de décembre, trop de choses dans la real life ce mois ci.
Désolé ....
Désolé ....
Invité- Invité
Re: developper sur SNES avec pvsneslib !
y'a pas de soucis ! c'est déja super d'avoir fait ce compilo sur snes !
au fait, j'ai enfin reussi à afficher une variable à l'écran pour mon debuggage
au fait, j'ai enfin reussi à afficher une variable à l'écran pour mon debuggage
Re: developper sur SNES avec pvsneslib !
Pour l'affichage d'une String ou d'une Variable y à le wiki qui l'explique.
J'attendrai que la lib soie un poil plus avancée pour continuer l'aventure. Mais ce sera avec ferveur et un réel plaisir ^^.
En attendant, je vous souhaite à tous de bonnes lignes de code !!
PS: Pas de soucis Alekmaul, c'est vraiment top ce que tu fais, on attendra le temps qu'il faut. Priorité à la vraie vie :).
J'attendrai que la lib soie un poil plus avancée pour continuer l'aventure. Mais ce sera avec ferveur et un réel plaisir ^^.
En attendant, je vous souhaite à tous de bonnes lignes de code !!
PS: Pas de soucis Alekmaul, c'est vraiment top ce que tu fais, on attendra le temps qu'il faut. Priorité à la vraie vie :).
Re: developper sur SNES avec pvsneslib !
Pas de problème Alekmaul, merci déjà énormément à toi d'avoir réaliser un lib aussi puissante et accessible !
S'il m'avait fallu passer par l'ASM j'en serais encore au code d'initialisation de la console. Alors que là j'ai déjà plein de sprites qui bougent à l'écran :)
S'il m'avait fallu passer par l'ASM j'en serais encore au code d'initialisation de la console. Alors que là j'ai déjà plein de sprites qui bougent à l'écran :)
Dernière édition par drludos le Sam 18 Nov 2017 - 1:43, édité 1 fois
drludos- Patient contaminé
- Nombre de messages : 247
Age : 44
Localisation : 34
Date d'inscription : 12/10/2017
Re: developper sur SNES avec pvsneslib !
J'ai encore une question technique, cette fois-ci liée à l'optimisation du code. En effet, dans mon jeu j'essaie d'afficher un max de sprites (16x16) qui bougent en même temps, mais dès que je dépasse la vingtaine ça commence à ralentir (entre les tests de collisions, les animations, etc).
Du coup j'essaie d'optimiser un peu mon code, et j'ai quelques questions à ce sujet :
- Pour la gestion de l'OAM, est-ce qu'il est plus rapide de faire:
=> un seul "OAMSet()" général pour chaque sprite toute les frames ?
=> ou par exemple un "OAMsetXY()" toutes les frames pour modifier uniquement la position, avec en plus un "OAMsetGFXOffset()" toutes les deux frames pour gérer l'animation ?
- J'utilise, pour gérer facilement tout mes sprites, un array de "struct", que je "traite" un à un dans une boucle for. J'ai lu dans la doc que le fait d'accéder à un tableau c'était lent, donc, au début de ma boucle for, j'utilise une variable de plus dans laquelle je copie le "struct" en cours (je copie le struct du tableau hein, je ne fait pas juste une référence / un pointeur dessus).
En clair, je ne fait un "sprite = sprites[ i ]" au début de ma boucle pour ne faire que des "++sprite.x" après au lieu de "++sprites[ i ].x".
Est-ce que cela permet vraiment d'optimiser le code, ou au contraire ça le ralenti ?
- Est-ce que le fait de déclarer toutes ses variables en "static" permet d'optimiser ou non ?
(sachant que je n'ai aucune variable déclarée dans mon main, elles sont toutes déclarées au niveau du script principal)
- Pour obtenir un nombre aléatoire entre 0 et 4, j'utilise rand() % 4, comme me l'a appris Alekmaul. Le "modulo" étant à priori une opération couteuse en CPY, est-ce qu'il y a une méthode pour générer une valeur aléatoire plus "optimisée" ?
Du coup j'essaie d'optimiser un peu mon code, et j'ai quelques questions à ce sujet :
- Pour la gestion de l'OAM, est-ce qu'il est plus rapide de faire:
=> un seul "OAMSet()" général pour chaque sprite toute les frames ?
=> ou par exemple un "OAMsetXY()" toutes les frames pour modifier uniquement la position, avec en plus un "OAMsetGFXOffset()" toutes les deux frames pour gérer l'animation ?
- J'utilise, pour gérer facilement tout mes sprites, un array de "struct", que je "traite" un à un dans une boucle for. J'ai lu dans la doc que le fait d'accéder à un tableau c'était lent, donc, au début de ma boucle for, j'utilise une variable de plus dans laquelle je copie le "struct" en cours (je copie le struct du tableau hein, je ne fait pas juste une référence / un pointeur dessus).
En clair, je ne fait un "sprite = sprites[ i ]" au début de ma boucle pour ne faire que des "++sprite.x" après au lieu de "++sprites[ i ].x".
Est-ce que cela permet vraiment d'optimiser le code, ou au contraire ça le ralenti ?
- Est-ce que le fait de déclarer toutes ses variables en "static" permet d'optimiser ou non ?
(sachant que je n'ai aucune variable déclarée dans mon main, elles sont toutes déclarées au niveau du script principal)
- Pour obtenir un nombre aléatoire entre 0 et 4, j'utilise rand() % 4, comme me l'a appris Alekmaul. Le "modulo" étant à priori une opération couteuse en CPY, est-ce qu'il y a une méthode pour générer une valeur aléatoire plus "optimisée" ?
drludos- Patient contaminé
- Nombre de messages : 247
Age : 44
Localisation : 34
Date d'inscription : 12/10/2017
Re: developper sur SNES avec pvsneslib !
Hello,
Pour le rand() % 4 cela donne une valeur entre 0 et 3.
Tu peux le remplacer par un rand() & 3.
Pour l'histoire plus haut du sprite qui s'affiche mal lorsque x<0, c'est peut être parce que le x est sur 9 bits.
Il faudrait essayer de faire un & 511 sur la coordonnée x avant d'appeler oamSetXY :
Pour le rand() % 4 cela donne une valeur entre 0 et 3.
Tu peux le remplacer par un rand() & 3.
Pour l'histoire plus haut du sprite qui s'affiche mal lorsque x<0, c'est peut être parce que le x est sur 9 bits.
Il faudrait essayer de faire un & 511 sur la coordonnée x avant d'appeler oamSetXY :
- Code:
void oamSetXYEx(unsigned int id, unsigned int x, unsigned char y) {
#define OAM_HI_TABLE_START 128*4
// Set low byte of x position and y position:
unsigned char x_lo = (unsigned char)x;
oamSetXY(id,x,y);
// Note that id isn't the OAM id, but a direct index into OAM shadow memory;
// the result is that id/4 is the actual oam index, which is required for determining
// the OAM high table position.
unsigned char oam_id = (unsigned char)(id >> 2);
// Set highest bit of x position: Either at bit 0,2,4,6 depending on oam id,
// as 4 oam entries are merged into one byte of the OAM high table.
int bit_shift = 2*(oam_id % 4);
int in_byte_position = 1 << bit_shift;
int oam_high_table_pos = OAM_HI_TABLE_START + oam_id / 4;
oamMemory[oam_high_table_pos] &= ~in_byte_position; // Clear current high bit of x
//modif sur x ici
oamMemory[oam_high_table_pos] |= ((x & 511)>>8)<<bit_shift; // Fill in new high bit of x
}
nemokantio- Patient contaminé
- Nombre de messages : 345
Age : 48
Localisation : Delgastan
Date d'inscription : 23/01/2013
Re: developper sur SNES avec pvsneslib !
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 .mais dès que je dépasse la vingtaine ça commence à ralentir (entre les tests de collisions, les animations, etc)
Invité- Invité
Page 4 sur 9 • 1, 2, 3, 4, 5, 6, 7, 8, 9
Sujets similaires
» PVSnesLib - Kit de développement sur SNES
» Developper sur Switch avec GAMEMAKER
» [ech]pack snes street fighter[vds]snes avec jeux/n64 avec jeux
» [ESTIM] LOT SNES EN BOITE AVEC 11 JEUX ET LOT NES AVEC 10 JEUX
» La SNES avec Raytracing
» Developper sur Switch avec GAMEMAKER
» [ech]pack snes street fighter[vds]snes avec jeux/n64 avec jeux
» [ESTIM] LOT SNES EN BOITE AVEC 11 JEUX ET LOT NES AVEC 10 JEUX
» La SNES avec Raytracing
Page 4 sur 9
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum