Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Fig »

Bah oui c'est hyper utile. Rien que le flip pour les sprites on économise de la mémoire en ayant pas à charger les symétriques.
Si c'est possible avec direct3d, il doit y avoir un équivalent pour linux, c'est sûr.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Fig »

Est ce que quelqu'un peu lister les commandes et leur paramètre car j'ai un problème avec EXT_transformsprite3d(). Quels sont ses paramètres ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par blendman »

salut

Bon, j'ai regardé plus en détail ton fichier, et j'ai essayé certaines transformations, mais cela ne fonctionne pas tout à fait comme je le pensais :).

Zoom et miroir :
- lorsque l'on zoome ou que l'on effectue un miroir, cette transformation s'effectue toujours par rapport à l'origine (0,0) du sprite et non le nouveau pivot.

Est-ce normal ?

Des images pour illustrer ( j'ai repris ton exemple) :
Là, c'est normal, j'ai ajouté une ombre en dessous du personnage pour voir où se trouve le pivot du sprite (hotspot)) :
Image

Là, en faisant un miroir vertical, le personnage marche sur la tête, alors que je voudrais que les pieds collent à l'ombre (donc que le sprite soit plus bas). Je n'ai pas réussi à modifier EXT_FlipVertSprite3D() pour que ça marche :(.
Image
ce serait intéressant pour faire un reflet dans l'eau par exemple :)

Pareil, lorsque je fais un zoom/dézoom, je voudrais que cela zoom en son pivot et non en haut à gauche (en gros, que le personnage soit toujours centré les pieds sur l'ombre (son pivot), je n'ai pas réussi non plus à modifier la procédure de zoom.
Image

Voilà, si quelqu'un sait comment modifier cette petite lib bien sympa, pour ce genre de chose, ce serait top :)
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

Désolé de ne pas avoir répondu plus vite, je suis en période "priorité boulot", en ce moment.. :(

Je t'ai modifié l'include en page 1 pour ajouter et gérer une commande:

Code : Tout sélectionner

EXT_SetTransformHandle(numsprite3d,#True)
Tu mets ça une seule fois, en dehors de ta boucle, et les flip/zoom affecteront aussi le pivot du sprite 3D.
Attention: vu que les largeurs/hauteurs sont de type "Long" (.l), il y a des problèmes d'arrondis quand tu fais de nombreux zooms. :?

Allez, à+, je file en formation UML (joie... :roll: )
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par blendman »

ah super, merci, je vais tester ça de suite :)

Edit :
j'ai testé sur ta démo, mais visiblement, le zoom ne marche plus on dirait.

voici un code test:

Code : Tout sélectionner

IncludeFile "EXT_sprite3D.pbi"

;{ global
Global quit.b,event.i
Global red.i,green.i,blue.i
Global sprite.i,spriteBis.i
Global sprite3d.i,sprite3dBis.i, newsizeX.f=1,newsizeY.f=1
;}

;{ init
InitSprite()
InitSprite3D()
InitKeyboard()
UsePNGImageDecoder()

; Open a 640x480 windowed screen
OpenWindow(0, 0, 0, 640, 480, "Extended Sprite 3D", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0, #PB_Screen_SmartSynchronization)
;}

;{ Load a sprites sheet, i.e. a big image containing all the frames of the animation.

LoadSprite(0,"shado.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
EXT_CreateSprite3D(0,0)
EXT_SetHandleSprite3D(0,115,68)
EXT_SetTransformHandle(0,#True) 

; NB: it's better (faster) if the image's width and height are powers of 2.
sprite = LoadSprite(#PB_Any, "chara.png", #PB_Sprite_Texture)

; Creates the EXT_sprite3D from the image
sprite3d = EXT_CreateSprite3D(#PB_Any, sprite)
EXT_SetHandleSprite3D(sprite3d,128,230); Position its handle in its center

EXT_SetTransformHandle(sprite3d,#True) 
;EXT_ZoomSprite3D(sprite3d,0.5,0.5); Resize it to 128x128

; Load and create another sprite
spriteBis = LoadSprite(#PB_Any, "robot.png", #PB_Sprite_Texture)
sprite3dBis = EXT_CreateSprite3D(#PB_Any, spriteBis)

; Resize it to 200x200
;EXT_ZoomSprite3D(sprite3dBis,3,3)
; Set its pivot outside of its boundary
EXT_SetHandleSprite3D(sprite3dBis,-50,50)
; Make it semi-transparent
EXT_SetAlphaSprite3D(sprite3dBis,200)
EXT_SetTransformHandle(sprite3dBis,#True) 
;}

;{ Main loop
Repeat
  Delay(1)
  Repeat
    ; Process the windows events
    Event = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        Quit = #True
    EndSelect
  Until Event = 0

  ; Keyboard
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_H)
      EXT_FlipHoriSprite3D(sprite3d)
    EndIf
    If KeyboardReleased(#PB_Key_V)
      EXT_FlipVertSprite3D(sprite3d)
      EXT_FlipVertSprite3D(0)
    EndIf    
    If KeyboardReleased(#PB_Key_Add)
      newsizeX + 0.1 : newsizeY + 0.1      
      EXT_ZoomSprite3D(sprite3d,newSizeX,newSizeY)
    ElseIf KeyboardReleased(#PB_Key_Subtract)
      newsizeX - 0.1 : newsizeY - 0.1
      EXT_ZoomSprite3D(sprite3d,newSizeX,newSizeY)
    EndIf
    If KeyboardPushed(#PB_Key_Escape)
      Quit = #True
    EndIf
  EndIf

  ; Every 100ms, clip the first sprite for animation
  If ElapsedMilliseconds() - oldTimer > 100
    oldTimer = ElapsedMilliseconds()

    xclip+50
    If xclip >= 250
      xclip = 0
      yclip+50
    EndIf
    If xclip = 150 And yclip = 50
      xclip = 0
      yclip = 0
    EndIf

    EXT_ClipSprite3D(sprite3D,xclip,yclip,xclip+49,yclip+49)
  EndIf

  ; Rotate and color the big transparent sprite
  angle + 1
  EXT_RotateSprite3D(sprite3dBis,Radian(angle/3))
  red = 128+127*Cos(Radian(angle))
  blue = 128+127*Sin(Radian(angle))
  green = 255 - red - blue
  If green < 0
    green = 0
  EndIf
  EXT_SetColorSprite3D(sprite3dBis,RGB(red,green,blue))

  ; Clear the screen and draw some line to indicate the screen's center
  ClearScreen(RGB(125,125,125))
  StartDrawing(ScreenOutput())
    Line(320,0,1,480)
    Line(0,240,640,1)
    DrawText(2,0,"H - Horizontal flip")
    DrawText(2,15,"V - Vertical Flip")
    DrawText(2,30,StrF(newsizeX)+" / "+StrF(newsizeY))
  StopDrawing()

  ; Display the sprites
  Start3D()
  EXT_DisplaySprite3D(0,320,240+18)
  EXT_DisplaySprite3D(sprite3d,320,240)
  EXT_DisplaySprite3D(sprite3dBis,320,240)
  Stop3D()

  FlipBuffers()

Until Quit = #True
;}
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

Je crois que je sais pourquoi: les tailles que tu passes à "EXT_ZoomSprite3D" ne sont pas des facteurs mais des dimensions absolues: "EXT_ZoomSprite3D(num,128,128)" passe ton sprite à 128x128 pixels. (et oui, je suis d'accord, la proc aurait dû s'appeler "resizeSprite3D"' plutôt que "zoomSprite3D" :wink: )

Par ailleurs, deux remarques:
- tu n'as pas besoin de faire "EXT_SetTransformHandle(num,#False)" à l'initialisation du sprite car c'est la valeur par défaut (par défaut, les flip/zoom ne repositionnent pas le pivot = comportement avant la modif');
- Je trouve bizarre que tu zoomes/dezoomes le sprite du bonhomme alors que c'est le seul sur lequel tu à mis le "EXT_SetTransformHandle" à faux; ça devrait être l'inverse. :?

Voilà, dis-moi si ça va mieux comme ça. :)
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par blendman »

kelebrindae a écrit :Je crois que je sais pourquoi: les tailles que tu passes à "EXT_ZoomSprite3D" ne sont pas des facteurs mais des dimensions absolues: "EXT_ZoomSprite3D(num,128,128)" passe ton sprite à 128x128 pixels. (et oui, je suis d'accord, la proc aurait dû s'appeler "resizeSprite3D"' plutôt que "zoomSprite3D" :wink: )
ah oui, c'est normal, j'avais modifié ton pbi, donc forcément, ça ne marche plus vu que c'est redevenu comme avant ;).

Du coup, j'ai modifié un peu ta macro pour proposer les 2 mode (resize et zoom ;)). Tu peux tester et vérifier mais normalement, ça fonctionne bien :

Code : Tout sélectionner

Macro EXT_ZoomSprite3D(numEXT_Spr3d,newSizeX,newSizeY, mode = 0)
  ; zoom -> mode = 1 (pourcentage for the size (width/height)
  ; resize -> mode = 0 (real value of the pixel)
  *TRF3D_DX9sprite3D = EXT_Sprite3D(numEXT_Spr3d)\ptrSprite3D
 
  If EXT_Sprite3D(numEXT_Spr3d)\transformPivot = #True And mode = 0
    TRF3D_v1 = (newSizeX) / *TRF3D_DX9sprite3D\Width
    TRF3D_v2 = (newSizeY) / *TRF3D_DX9sprite3D\Height
       
    EXT_Sprite3D(numEXT_Spr3d)\pivotX * TRF3D_v1
    EXT_Sprite3D(numEXT_Spr3d)\pivotY * TRF3D_v2
  ElseIf EXT_Sprite3D(numEXT_Spr3d)\transformPivot = #True And mode = 1
    TRF3D_v1 = Round(*TRF3D_DX9sprite3D\Width*(newSizeX),0) / *TRF3D_DX9sprite3D\Width
    TRF3D_v2 = Round(*TRF3D_DX9sprite3D\Height*(newSizeY),0) / *TRF3D_DX9sprite3D\Height
       
    EXT_Sprite3D(numEXT_Spr3d)\pivotX * TRF3D_v1
    EXT_Sprite3D(numEXT_Spr3d)\pivotY * TRF3D_v2
    
  EndIf
 
If  mode= 0
  *TRF3D_DX9sprite3D\Width = (newSizeX)
  *TRF3D_DX9sprite3D\Height = (newSizeY)
ElseIf mode = 1
  *TRF3D_DX9sprite3D\Width = Round(*TRF3D_DX9sprite3D\Width*(newSizeX),0)
  *TRF3D_DX9sprite3D\Height = Round(*TRF3D_DX9sprite3D\Height*(newSizeY),0)
EndIf

  EXT_TransformSprite3D(*TRF3D_DX9sprite3D\Width,*TRF3D_DX9sprite3D\Height,EXT_Sprite3D(numEXT_Spr3d)\pivotX,EXT_Sprite3D(numEXT_Spr3d)\pivotY,*TRF3D_DX9sprite3D\Angle)   
EndMacro
Par defaut (mode = 0):
- c'est le resize autrement dit, on entre les nouvelles tailles de pixels (128,128)
Mode = 1
c'est le zoom, on entre un pourcentage. (0.5,0.5) par exemple

Comme ça on a le choix, qu'en penses-tu ? :)

En tout cas, merci beaucoup, car ça va cartonner grâce à toi dans mon jeu :D.
Par ailleurs, deux remarques:
- tu n'as pas besoin de faire "EXT_SetTransformHandle(num,#False)" à l'initialisation du sprite car c'est la valeur par défaut (par défaut, les flip/zoom ne repositionnent pas le pivot = comportement avant la modif');
- Je trouve bizarre que tu zoomes/dezoomes le sprite du bonhomme alors que c'est le seul sur lequel tu à mis le "EXT_SetTransformHandle" à faux; ça devrait être l'inverse. :?
ouip, c'est une erreur de ma part, en fait, je l'ai mis sur #true pour tester, mais j'ai posté le mauvais code.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

mode = 0 - c'est le resize
Mode = 1 - c'est le zoom, on entre un pourcentage

Comme ça on a le choix, qu'en penses-tu ?
C'est super, effectivement: quelquefois l'un est plus pratique que l'autre et c'est bien de ne pas avoir à faire les calculs à la main.
Perso, j'aurais peut-être créé une macro séparée ("resize" d'un côté, "zoom" de l'autre), parce que dans les cas extrêmes, le code pourrait être exécuté des centaines de fois par itérations et que ça fait un test de moins; mais bon, le gain de perfs est sans doute négligeable...
C'est le gros avantage des includes par rapport aux librairies: chacun peut les adapter à sa sauce et selon ses besoins.
blendman a écrit :Merci beaucoup, car ça va cartonner grâce à toi dans mon jeu
De rien; ça bien fait plaisir d'être un peu utile de temps en temps... :wink:
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par blendman »

kelebrindae a écrit :
mode = 0 - c'est le resize
Mode = 1 - c'est le zoom, on entre un pourcentage

Comme ça on a le choix, qu'en penses-tu ?
C'est super, effectivement: quelquefois l'un est plus pratique que l'autre et c'est bien de ne pas avoir à faire les calculs à la main.
Perso, j'aurais peut-être créé une macro séparée ("resize" d'un côté, "zoom" de l'autre), parce que dans les cas extrêmes, le code pourrait être exécuté des centaines de fois par itérations et que ça fait un test de moins; mais bon, le gain de perfs est sans doute négligeable...
tu as tout à fait raison, je vais en faire 2 macro séparées, je n'avais pas pensé au fait que ce soit exécuter beaucoup de fois, mais étant donné que je vais utiliser ta lib sur tous les personnages et mob de notre jeu 3Arks, c'est préférable que ce soit séparé effectivement ;).
De rien; ça bien fait plaisir d'être un peu utile de temps en temps... :wink:
Ah mais, je ne sais pas si tu te rends compte comme cela va nous être utile sur le jeu 3arks ce genre de chose, ça va notamment me permettre :
- d'afficher des ennemis par "age" (petit, moyen, adulte), ou simplement de varier les tailles.
- de modifier et de faire des transformations sur tous les personnages joueurs du jeu.
- de faire des transformations de tailles ou de miroir sur tous les décors quand c'est nécessaire :)
- de réfléchir à un système de réflexion en temps réel (avec le miroir horizontal) par exemple, de faire des étendues d'eau, des rivières, etc.. :)

A ce propos, penses-tu que je puisse utiliser sur tous les sprites affichés ce genre de lib sans trop de soucis (sur par exemple 500 sprites affichés) ?
Je vais faire quelques essais et je pense qu'il ne devrait y avoir aucun soucis.

Encore un très grand merci ;).
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

J'ai refait quelques petites modifs pour rendre le truc un peu plus pratique:
- Modif : La macro "EXT_ZoomSprite3D" fonctionne maintenant avec des coordonnées relatives (pour diviser la taille par 2, on fait "EXT_ZoomSprite3D(numsprite, 0.5,0.5)" et pour la doubler on fait "EXT_ZoomSprite3D(numsprite, 2,2)"
- Ajout: la macro "EXT_ResizeSprite3D" fait la même chose, mais avec des tailles en pixels (elle fait ce que faisait "EXT_ZoomSprite3D" avant, quoi)
- Modif: La macro "EXT_SetHandleSprite3D" fonctionne maintenant avec des coordonnées relatives (pour centrer le pivot, on fait "EXT_SetHandleSprite3D(numsprite, 0.5,0.5)"
- Ajout: La macro "EXT_SetAbsHandleSprite3D" fait la même chose, mais avec des positions en pixels.
- Ajout: La macro "EXT_MidHandleSprite3D(numsprite)" centre le pivot du sprite (comme en Blitz).
- Modif: Par défaut, le pivot est maintenant repositionné lors des zooms/retaillages (c'est l'inverse de la version précédente, mais c'est plus intuitif comme ça)
- Modif: Lorsque le pivot suit le retaillage, il n'y a plus de problème d'arrondis (le résultat devrait donc toujours être correct).

J'ai mis à jour l'include dans le premier post, ainsi que le .zip contenant les exemples à cette adresse:
http://keleb.free.fr/codecorner/downloa ... rite3D.zip
Au passage, j'ai ajouté dans ce zip mon "blob monster" modifié pour utiliser ces commande.

(et cette fois, promis, je ne touche plus à rien... :mrgreen: )
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Thyphoon »

merci beaucoup pour ce partage :D
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par Ar-S »

Merci kelebrindae c'est top :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par djes »

Yep, bien pratique!!! Merci! :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par blendman »

kelebrindae a écrit :J'ai refait quelques petites modifs pour rendre le truc un peu plus pratique:
excellent !!
(et cette fois, promis, je ne touche plus à rien... :mrgreen: )
mais si, n'aies pas peur d'ajouter des trucs si ça permet de toujours améliorer ta lib :D

Encore un immense merci ;).
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..

Message par kelebrindae »

Une dernière update:
- Ajout: une macro "EXT_RotateDegSprite3D" dont le paramètre "angle" est en degrés (je trouve ça plus intuitif...)
- Modif': Un mode "Fast rotation" qui force les calculs de rotation à utiliser des Cosinus et Sinus pré-calculés et stockés dans un tableau plutôt que les fonctions Cos() et Sin(). Ce mode est activé en déclarant une variable "#EXT_FASTTRANSFORM = #TRUE" avant l'insertion de l'include (Cf. exemples dans le zip); Le choix du mode est fait à la pré-compilation, de façon à ne pas pénaliser les perfs. Dans les faits, cette optimisation a un effet tout à fait négligeable (voire négatif, si le debuggger est activé)...
- Modif' : Correction d'un bug stupide dans "EXT_SetAbsHandleSprite3D".

J'ai mis à jour l'include dans le premier post, ainsi que le zip. Au passage, j'ai ajouté un exemple de plus dans le zip (un petit vaisseau qui bouge façon "Asteroids").
http://keleb.free.fr/codecorner/downloa ... rite3D.zip

A+
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Répondre