Bonjour
J'ai codé un petit moteur qui fait de la 3D à base de sprite.
Le zip contient un exemple d'utilisation avec toutes les sources nécessaires (les fichiers c1,c2,s1 et les main.c, inputs.c, trigo.c et 3d.c).
https://www.mirari.fr/l6lb
Je compile avec NGdevkit mais ça devrait fonctionner avec les autres kits.
J'aimerai connaître vos idées d'optimisation en restant en C (je ne pratique pas l'assembleur). Je pense notamment à la gestion de la boucle principale, et aux 2 fonctions dédiées à l'affichage proprement dit:
- display_sprite dans main.c
- display dans 3d.c
En gros, frames paires on traite les données 3D:
move_cam();
transform_3d_to_2d();
sort_2d();
Cette partie là me semble assez bien optimisée.
Frames impaires, c'est l'affichage proprement dit, gérée par la fonction display(). Dans le détail, on se retrouve alors avec une liste dsorted_index d'indices correspondant à des sprites à afficher dans l'ordre parmi:
#define ball_black 0
#define ball_red 1
#define ball_white 2
...
lesquels sont définis graphiquement dans les listes def_htiles[], def_vtiles[] et def_tile_index[], ces dernières correspondant aux assets dans c1, c2.
La difficulté consiste alors à mettre à jour le plus rapidement possible la Vram, sachant que les sprites n'ont pas tous le même nombre de tiles en V et en H.
Je reste à dispo pour expliciter toute partie de code un peu obscure.
J'aimerai aussi essayer de coder l'affichage d'un plan en mode 7 simplifié. Mais je n'arrive pas à faire fonctionner les Timer Interrupt. Quelqu'un saurait-il me proposer un exemple minimaliste d'utilisation d'un Timer Interrupt ?