Page 1 of 1

GraphX - Dessiner un sprite avec une échelle < 100%

Unread postPosted: 15 Oct 2022, 12:05
by Yobio
Bonjour, je développe actuellement un jeu en c pour :32ti83pce: mais j'ai besoin de pouvoir dessiner un sprite transparent avec une mise à l'échelle inférieure à 100% (plus petit que sa taille originale).

La fonction gfx_RotatedScaledTransparentSprite_NoClip de la lib graphx permet de dessiner un sprite transparent dont l'échelle peut être inférieure à 64 (64 correspond ici à 100%). Cependant mon sprite est rectangulaire et la fonction n'accepte que des sprites dont les dimensions sont un carré (sprite->width=sprite->height).
Il y a aussi la fonction gfx_ScaledTransparentSprite_NoClip, mais celle-ci prend une échelle entière qui ne peut qu'être agrandie (1 correspond à 100%, 2 à 200%, etc. mais 0.5 ne fonctionne pas car ça doit être un int).

Je pourrais redessiner mon sprite avec une marge pour faire un carré mais j'aimerais optimiser le stockage dans la rom.
Faut-il que j'ajoute cette marge au début du programme et ainsi stocker le sprite redimensionné seulement lors de l'exécution ? (le problème c'est que je ne sais pas comment agrandir les dimensions du sprite sans agrandir son image)
Sinon y a-t-il une autre fonction permettant cela ou un autre moyen ?

Merci pour votre aide !

Re: GraphX - Dessiner un sprite avec une échelle < 100%

Unread postPosted: 15 Oct 2022, 14:20
by Adriweb
Salut,

J'ai forwardé ta question sur le canal "officiel" de de la toolchain CE, #ez80-dev (sur IRC EFNet, ou sur Discord), et Runer112 a répondu:

14:32:42 <@Runer112> if they want to repeatedly draw the sprite at this size, they should use gfx_ScaleSprite to scale the sprite data once and then just draw it using unscaled sprite functions
15:05:08 <@Runer112> unfortunately it doesn't look like there's any way to directly draw a non-integer scaled non-square sprite, as they discovered

Si tu parles anglais, n'hésite pas à rejoindre le canal, d'ailleurs :)

Si non... une traduction rapide de ses messages, c'est que si tu veux dessiner à plusieurs reprises le sprite à cette taille, tu dois utiliser gfx_ScaleSprite pour scale les données du sprite une fois, puis juste les dessiner à l'aide de fonctions de sprite non-scaled. Malheureusement, il ne semble pas y avoir de moyen de dessiner directement un sprite non carré à l'échelle non entière, comme tu as pu le voir.

Re: GraphX - Dessiner un sprite avec une échelle < 100%

Unread postPosted: 15 Oct 2022, 15:33
by Yobio
Merci beaucoup ! Je pense que je vais faire gfx_ScaleSprite à chaque frame (peut-être pas une bonne idée :mmm: ). Sinon j'essaierai de modifier directement la matrice de l'image.
J'irai voir le canal irc, merci pour le conseil :)

Re: GraphX - Dessiner un sprite avec une échelle < 100%

Unread postPosted: 15 Oct 2022, 15:52
by Adriweb
Non, il vaut mieux le faire qu'une seule fois, pourquoi voudrais-tu le faire a chaque frame? :P

Re: GraphX - Dessiner un sprite avec une échelle < 100%

Unread postPosted: 15 Oct 2022, 16:09
by Yobio
C'est pour faire un objet qui se rapproche, donc avec la perspective il faut recalculer l'image à chaque frame non ? Je ne peux pas créer 64 buffers pour stocker chaque sprite pour chaque échelle entre 1 et 64 car ce serait probablement trop lourd.

Re: GraphX - Dessiner un sprite avec une échelle < 100%

Unread postPosted: 15 Oct 2022, 16:14
by Adriweb
Ah, je n'avais pas cette information là.
Ca serait quand même dommage de devoir faire autant de calcul lors du dessin... A mon avis il vaut mieux moins optimiser la place (on en a assez sur CE...) et faire des sprites carrés pour ensuite pouvoir utiliser gfx_RotatedScaledTransparentSprite_NoClip. Mais bon, à toi de tester plusieurs solution selon l'impact sur la taille et la performance, pour voir ce qui est acceptable en fin de compte.

Re: GraphX - Dessiner un sprite avec une échelle < 100%

Unread postPosted: 15 Oct 2022, 16:27
by Yobio
Oui je pense aussi que ça réduirait beaucoup la performance donc en attendant je vais faire des sprites carrés et je verrais plus tard si ça peut s'optimiser.