Page 1 of 1

Fonction clipping inexistante

Unread postPosted: 18 Mar 2025, 08:57
by elyas.creates
Bonjour,
Dans mon projet, pour afficher les attaques, j'ai d'abord utilisé gfx_RotatedTransparentSprite_NoClip dans la fonction draw_attacks dans game.c. Ensuite, j'ai agrandi la tilemap (au début elle avait la taille de l'écran) et j'ai du enlever le _NoClip de plusieurs fonctions pour que les sprites s'affichent correctement. Malheuresement, je n'ai pas trouvé de fonction gfx_RotatedTransparentSprite (avec clipping), j'ai donc du changer le code d'apparition des attaques dans attacks.c en utilisant gfx_RotateSprite. Ca avait l'air de marcher mais assez souvent les sprites s'affichaient très bizarrement, j'ai donc du changer le code d'allocation de mémoire et donner une taille plus grande que celle du sprite (normalement 20x20, dans le code 28x28) pour que ça s'affiche correctement, mais après ça les sprites avaient un décalage, leur rotation est devenue incorrecte (direction vers un ennemi plus loin alors que le joueur est plus proche et qu'il a attendu d'être dans sa LOS pour tirer... Je ne sais plus quoi faire... Mais je pense que ce serait plus simple qu'il y ait une fonction gfx_RotatedTransparentSprite, ou peut être est-ce une erreur dans mon code?
BrawlCE.zip

Re: Fontcion clipping inexistante

Unread postPosted: 18 Mar 2025, 09:22
by Adriweb
Il y a un paragraphe clair dans la doc de graphx sur la différence clip et noclip et quand les utiliser ou non (il est probable que si ton jeu a besoin de noclip pour fonctionner correctement, ce n'est pas que tu cherches juste a optimiser en perf, mais que tu fais quelque chose de pas correct en premier lieu) : https://ce-programming.github.io/toolch ... -unclipped
Cette page d'ailleurs te liste toutes les fonctions disponibles, pas besoin de deviner si une existe ou non ^^ et puis si une variante noclip ou non n'existe pas c'est pas un hasard non plus, disons.

Re: Fontcion clipping inexistante

Unread postPosted: 18 Mar 2025, 09:43
by elyas.creates
Je ne comprend pas trop, les attaques ont une grande chance de pouvoir s'afficher hors de l'écran, et c'est parce que la fonction n'existe pas que j'ai posté ce message, et en premier lieu je n'avais pas vraiment utilisé toutes ces allocations de mémoire, mais maintenant que la map est plus grande et que les attaques peuvent aller en dehors de l'écran, je me suis dit qu'il fallait utiliser une fonction avec clipping (sans _NoClip), donc d'après ce que tu as dit, je devrait utiliser la fonction avec _NoClip? Mais sans clipping les attaques s'affichent bizarrement (se retrouvent de l'autre coté de l'écran, par exemple.

Re: Fontcion clipping inexistante

Unread postPosted: 18 Mar 2025, 09:58
by Adriweb
L'écran est une zone mémoire contiguë. Du coup c'est normal que quand quelque chose "dépasse" à droite ça continue à gauche après. Le problème est qu'avant (et après) la zone mémoire (VRAM) pour l'écran, si tu utilises le _NoClip ça ne va pas vérifier la zone mémoire écrite et donc tu peux overwriter des choses du système en ram ce qui peut donner des corruptions, crashs, etc. (En l'occurrence si tu ne fais pas de double buffering (cela dit c'est une bonne idée de le faire), la 2eme partie de la vram sera "libre" et donc si tu dépasses un peu hors de la première ça ne fera pas de mal...
Ce qu'il faudrait vraiment faire plutôt c'est de ne jamais tomber dans des situations où tu te retrouves avec des choses qui soient potentiellement plus grande que la zone écran. Au moins, noclip ou pas, il n'y aura pas de problème. Ça veut par exemple dire que si un personnage s'approche d'un côté de l'écran, soit il est bloqué (mur et ), soit il "passe sur un autre écran" et se retrouve donc téléporte de l'autre côté de la map avec la nouvelle zone de dessinee.
Mais ça peut être "smooth" aussi, il y a des exemples de tilemap dans la toolchain ou le changement se fait petit à petit et non écran par écran.

Re: Fonction clipping inexistante

Unread postPosted: 18 Mar 2025, 10:07
by elyas.creates
Comme la tilemap bouge en fonction du déplacement du joueur (toujours centré sauf s'il s'approche des bords, je pense comme Zelda), il faut que je fasse le clipping moi même, c'est ça? Et le double buffering, c'est bien avec gfx_SwapDraw, comme je le fais dans mon code? Donc en gros je supprime juste la partie d'allocation de mémoire avec gfx_rotate sprite (comme avant) et j'utilise gfx_RotatedTransparentSprite_NoClip mais je fais le clipping moi même?