Besoin d'explications claires sur TransformSprite()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Besoin d'explications claires sur TransformSprite()

Message par TazNormand »

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.
Image
Image
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Besoin d'explications claires sur TransformSprite()

Message par falsam »

TazNormand a écrit :j'affiche un sprite, quels sont les paramètres par défaut pour afficher ce sprite avec son aspect initial
Un exemple qui affiche un sprite aprés transformation de son aspect initial vers son aspect initial :mrgreen:

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%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Besoin d'explications claires sur TransformSprite()

Message par falsam »

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%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Besoin d'explications claires sur TransformSprite()

Message par falsam »

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%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Besoin d'explications claires sur TransformSprite()

Message par falsam »

■ 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.

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
On exécute et pas de changement.

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%
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Besoin d'explications claires sur TransformSprite()

Message par TazNormand »

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
Image
Image
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Besoin d'explications claires sur TransformSprite()

Message par blendman »

Tu ne peux pas utiliser les fonctions ZoomSprite() et RotateSprite() sur un sprite qui vient de subir un changement d'aspect avec TransFormSprite.
oui, visiblement, si on utiliser zoomsprite() ou rotatesprite() après transformsprite(), ça réinitialise le sprite.

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
D'ailleurs, Falsam, je pensais à ça : il doit être possible d'utiliser TransformSprite() pour créer des rotations avec un "anchor" qu'on pourrait spécifier nous-mêmes, autrement dit, une rotation avec un centre différent du milieu ;)
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).
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Besoin d'explications claires sur TransformSprite()

Message par G-Rom »

tu radotes taz : http://www.purebasic.fr/french/viewtopic.php?f=1&t=9774 :mrgreen:

@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.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Besoin d'explications claires sur TransformSprite()

Message par G-Rom »

Répondre