Besoin d'explications claires sur TransformSprite()
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Besoin d'explications claires sur TransformSprite()
J'avais posté ce message sur le forum UK espérant qu'un membre puisse me répondre, mais toujours rien, je tente donc ma chance ici :
Qui pourrais m'expliquer en langage simple et compréhensible comment fonctionne la fonction TransformSprite(). Quels sont les paramètres par défaut de cette fonction ; si j'affiche un sprite, quels sont les paramètres par défaut pour afficher ce sprite avec son aspect initial
Merci de me donner un maximum d'exemples, et si vous utiliser des fonctions sin/cos, dîtes moi pourquoi vous les utiliser (je suis nul en trigo je vous préviens).
Merci d'avance pour votre aide.
Qui pourrais m'expliquer en langage simple et compréhensible comment fonctionne la fonction TransformSprite(). Quels sont les paramètres par défaut de cette fonction ; si j'affiche un sprite, quels sont les paramètres par défaut pour afficher ce sprite avec son aspect initial
Merci de me donner un maximum d'exemples, et si vous utiliser des fonctions sin/cos, dîtes moi pourquoi vous les utiliser (je suis nul en trigo je vous préviens).
Merci d'avance pour votre aide.
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Besoin d'explications claires sur TransformSprite()
Un exemple qui affiche un sprite aprés transformation de son aspect initial vers son aspect initialTazNormand a écrit :j'affiche un sprite, quels sont les paramètres par défaut pour afficher ce sprite avec son aspect initial

Code : Tout sélectionner
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "TransformSprite()", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
;On passe vite sur le création d'un sprite
CreateSprite(0, 128, 128)
StartDrawing(SpriteOutput(0))
Box(0, 0, 128, 128, $808080)
For x = 0 To 15
For y = 0 To 15
If (x+y)%2 : Box(x*8, y*8, 8, 8, $FFFFFF) : EndIf
Next
Next
StopDrawing()
; Les Coordonnées du sprite de taille (128 x 128) que nous venons de créer
; On ne se sert que des coordonnées x,y de chaque point x1, x2, x3, x4
; Attention à l'ordre sur ce schéma
;
; x1 (0,0) x2 (128,0)
; ---------
; | /|
; | / |
; | / |
; |/ |
; ---------
; x4 (0,128) x3 (128, 128)
;
;Le sprite avec son aspect initial
TransformSprite(0,
0,0, ;x1
128,0, ;x2
128,128,;x3
0,128) ;x4
Repeat
ClearScreen(RGB(210, 180, 140))
DisplayTransparentSprite(0, 336, 236)
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Besoin d'explications claires sur TransformSprite()
Avec ce deuxième code, nous allons décaler les points x1 et x2 de 30 pixels vers la droite.
Code : Tout sélectionner
;TransformSprite() - Création d'un triangle
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "TransformSprite()", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
CreateSprite(0, 128, 128)
StartDrawing(SpriteOutput(0))
Box(0, 0, 128, 128, $808080)
For x = 0 To 15
For y = 0 To 15
If (x+y)%2 : Box(x*8, y*8, 8, 8, $FFFFFF) : EndIf
Next
Next
StopDrawing()
;transformation du sprite (x1 & x2)
TransformSprite(0,
30,0, ;x1
168,0, ;x2
128,128,;x3
0,128) ;x4
Repeat
ClearScreen(RGB(210, 180, 140))
DisplayTransparentSprite(0, 336, 236)
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
Dernière modification par falsam le dim. 04/oct./2015 17:23, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Besoin d'explications claires sur TransformSprite()
Tu ne peux pas utiliser les fonctions ZoomSprite() et RotateSprite() sur un sprite qui vient de subir un changement d'aspect avec TransFormSprite.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Besoin d'explications claires sur TransformSprite()
■ Juste qu'à présent, on a utilisé la fonction TransformSprite() de cette manière :
TransformSprite(Sprite, x1,y1, x2,y2, x3,y3, x4,y4)
■ Il est possible aussi d'intervenir sur la profondeur de la texture avec la composant z des quatres points de coordonnées du sprite.
La fonction TransformSprite() est utilisée dans ce cas de cette manière :
TransformSprite(Sprite, x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z3)
La valeur par défaut de cette composante z est égale à 1. Reprenons le premier code est ajoutant la composante z.On exécute et pas de changement.
Modifie maintenant le parametre x1 par 0,0,2 et exécute à nouveau.
TransformSprite(Sprite, x1,y1, x2,y2, x3,y3, x4,y4)
■ Il est possible aussi d'intervenir sur la profondeur de la texture avec la composant z des quatres points de coordonnées du sprite.
La fonction TransformSprite() est utilisée dans ce cas de cette manière :
TransformSprite(Sprite, x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z3)
La valeur par défaut de cette composante z est égale à 1. Reprenons le premier code est ajoutant la composante z.
Code : Tout sélectionner
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "TransformSprite()", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
;On passe vite sur le création d'un sprite
CreateSprite(0, 128, 128)
StartDrawing(SpriteOutput(0))
Box(0, 0, 128, 128, $808080)
For x = 0 To 15
For y = 0 To 15
If (x+y)%2 : Box(x*8, y*8, 8, 8, $FFFFFF) : EndIf
Next
Next
StopDrawing()
; Les Coordonnées du sprite de taille (128 x 128) que nous venons de créer
; On ne se sert que des coordonnées x,y de chaque point x1, x2, x3, x4
; Attention à l'ordre sur ce schéma
;
; x1 (0,0) x2 (128,0)
; ---------
; | /|
; | / |
; | / |
; |/ |
; ---------
; x4 (0,128) x3 (128, 128)
;
;Le sprite avec son aspect initial
TransformSprite(0,
0,0,1, ;x1
128,0,1, ;x2
128,128,1,;x3
0,128,1) ;x4
Repeat
ClearScreen(RGB(210, 180, 140))
DisplayTransparentSprite(0, 336, 236)
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
Modifie maintenant le parametre x1 par 0,0,2 et exécute à nouveau.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: Besoin d'explications claires sur TransformSprite()
Merci Falsam, je vais regarder tes codes plus tard, je vais me tenir éloigné du forum quelques temps, histoire de m'aérer la tête
Re: Besoin d'explications claires sur TransformSprite()
oui, visiblement, si on utiliser zoomsprite() ou rotatesprite() après transformsprite(), ça réinitialise le sprite.Tu ne peux pas utiliser les fonctions ZoomSprite() et RotateSprite() sur un sprite qui vient de subir un changement d'aspect avec TransFormSprite.
Par contre, transformsprite() permet de réaliser le zoom et la rotation aussi si on s'y prend bien (mais c'est chaud, quand même ^^) :
Code : Tout sélectionner
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "TransformSprite()", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
;On passe vite sur le création d'un sprite
CreateSprite(0, 128, 128)
StartDrawing(SpriteOutput(0))
Box(0, 0, 128, 128, $808080)
For x = 0 To 15
For y = 0 To 15
If (x+y)%2 : Box(x*8, y*8, 8, 8, $FFFFFF) : EndIf
Next
Next
StopDrawing()
CopySprite(0,1)
; Les Coordonnées du sprite de taille (128 x 128) que nous venons de créer
; On ne se sert que des coordonnées x,y de chaque point x1, x2, x3, x4
; Attention à l'ordre sur ce schéma
;
; x1 (0,0) x2 (128,0)
; ---------
; | /|
; | / |
; | / |
; |/ |
; ---------
; x4 (0,128) x3 (128, 128)
;
; un zoomsprite X 2 avec transformsprite()
z = 2
TransformSprite(0,
0,0, ;x1
128*z,0, ;x2
128*z,128*z,;x3
0,128*z) ;x4
; une rotation avec transformsprite()
xa = 10
xb = 64
TransformSprite(1,
xb,-xa, ;x1
128+xa,xb, ;x2
128-xb,128+xa,;x3
0-xa,128-xb) ;x4
Repeat
ClearScreen(RGB(210, 180, 140))
DisplayTransparentSprite(0, 50, 50)
DisplayTransparentSprite(1, 436, 236)
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow

Je pense qu'il doit y avoir un algorithme pour ça quelque part sur le forum (djes avait fait un code pour une rotation, avec LSI, ainsi que Dobro).
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: Besoin d'explications claires sur TransformSprite()
tu radotes taz : http://www.purebasic.fr/french/viewtopic.php?f=1&t=9774
@blendman, avec un peu de math. regarde les sources de supersprite du topic plus haut. Les sprite sont géré avec une matrice4. tu applique une translation sur la matrice avant la transformation. et tu auras ce que tu cherches : déplacer l'origine.

@blendman, avec un peu de math. regarde les sources de supersprite du topic plus haut. Les sprite sont géré avec une matrice4. tu applique une translation sur la matrice avant la transformation. et tu auras ce que tu cherches : déplacer l'origine.