PureBasic

Forums PureBasic
Nous sommes le Sam 25/Mai/2013 14:10

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page Précédente  1, 2, 3  Suivante
Auteur Message
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Jeu 19/Mai/2011 18:29 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 417
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.

_________________
Ceci n'est pas une signature.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Jeu 19/Mai/2011 18:38 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 417
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 ?

_________________
Ceci n'est pas une signature.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Lun 13/Juin/2011 17:11 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 907
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 :)

_________________
http://blendman.blogspot.com/


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mer 15/Juin/2011 8:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 488
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:
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.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mer 15/Juin/2011 12:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 907
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:
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
;}

_________________
http://blendman.blogspot.com/


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mer 15/Juin/2011 13:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 488
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.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mer 15/Juin/2011 13:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 907
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:
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.

Citation:
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.

_________________
http://blendman.blogspot.com/


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mer 15/Juin/2011 17:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 488
Citation:
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.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Jeu 16/Juin/2011 7:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 907
kelebrindae a écrit:
Citation:
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 ;).

Citation:
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 ;).

_________________
http://blendman.blogspot.com/


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Ven 24/Juin/2011 11:03 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 488
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/download/purebasic/EXT_sprite3D.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.


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Ven 24/Juin/2011 11:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2387
Localisation: Eragny
merci beaucoup pour ce partage :D


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Ven 24/Juin/2011 11:23 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 5229
Merci kelebrindae c'est top :wink:

_________________
.: Ar-S :. - Windows 8 x64 - Radeon HD 7870 - PB 5.11
LDV MULTIMEDIA : Assistance informatique Isère (38) Oyeu
PURE BASIC forum non officiel : Forum PB


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Ven 24/Juin/2011 11:27 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 3063
Localisation: Arras, France
Yep, bien pratique!!! Merci! :)

_________________
The shooting crew ~> http://www.shootingcrew.com
Bobble Puzzle ~> http://djes.free.fr


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Ven 24/Juin/2011 12:02 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 907
kelebrindae a écrit:
J'ai refait quelques petites modifs pour rendre le truc un peu plus pratique:

excellent !!

Citation:
(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 ;).

_________________
http://blendman.blogspot.com/


Haut
 Profil  
 
 Sujet du message: Re: Sprite3D: colorer, flip, clipsprite, hotspot, etc..
MessagePosté: Mar 28/Juin/2011 16:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Mai/2007 15:21
Messages: 488
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/download/purebasic/EXT_sprite3D.zip

A+

_________________
Les idées sont le souvenir de choses qui ne se sont pas encore produites.


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page Précédente  1, 2, 3  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye