Page 1 sur 1
clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 12:28
par blendman
salut
Il semblerait que clipSprite() et sprite3D() ne marche pas ensemble (d'après la doc). Alors, comment peut -on faire pour faie du clipspsirte avec un sprite3D ?
Je continue à chercher de mon coté, mais si vous avez une solution, cela m'intéresse grandement

.
Merci à vous.
Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 12:44
par Cool Dji
Salut,
Pas moyen, il faut un sprite3D par objet.
ça présente l'avantage de pas t'embeter à faire des clipsprites et tu affiches sprite de l'anim.
Moi, si j'ai une animation en 5 sprites, je les stock dans 5 sprites numérotés les uns à la suite des autres.
J'ai en mémoire le n° du premier sprite et le nombre de sprite composant l'animation.
Ainsi, j'affiche
animation=animation+1
IF animation=nombre de sprite composant l'animation : animation=0 : endIF
DisplaySprite3D( n° du premier sprite+animation, X,Y...)
Bien sur tu peux ajouter un tempo pour fluidifier l'animation...
Je trouve ça plus simple que de jouer avec les clipsprites...
Si tu n'as pas envie de te trimballer 50 fichiers d'images, tu peux mettre toutes tes animations sur une seule image et construire tes sprites3D avec la fonction Grabimage...
Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 12:58
par G-Rom
si , changer les valeur UV de chaque vertex du sprite , SuperSprite3D propose ce type de fonction.
Voir aussi ici :
http://www.purebasic.fr/french/viewtopi ... anim%C3%A9
Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 13:30
par Cool Dji
Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 13:58
par djes
Un exemple vite fait basé sur les codes de Stefan Moebius et Fluid Byte
Code : Tout sélectionner
; ==========================================
; # ClipSprite3D for DirectX7 / DirectX9 #
; ==========================================
; Original by: S.M. (Stefan Moebius)
; Modfied by: Christian Kemna (Fluid Byte)
; Created: March 15, 2009
; Test-Platform: Windows XP SP3
; PB Version: 4.30
; Web: http://www.codedreality.de/
CompilerIf Subsystem("DirectX9")
Structure D3DTLVERTEX
x.f
y.f
z.f
rhw.f
Color.l
tu.f
tv.f
EndStructure
Structure PB_DX9Sprite3D
TexRes.l ; TexRes
Vertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
TmpVertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
Width.l ; width set with ZoomSprite3D()
Height.l ; height set with ZoomSprite3D()
RealWidth.l
RealHeight.l
Angle.f
Transformed.l
EndStructure
Procedure ClipSprite3D(Sprite3D,ClipX,ClipY,ClipWidth,ClipHeight)
Protected *ptr.PB_DX9Sprite3D = IsSprite3D(Sprite3D)
If *ptr = 0 : ProcedureReturn #False : EndIf
If ClipX < 0 : ClipX = 0 : EndIf
If ClipY < 0 : ClipY = 0 : EndIf
If ClipWidth < 0 : ClipWidth = 0 : EndIf
If ClipHeight < 0 : ClipHeight = 0 : EndIf
If ClipX > *ptr\RealWidth : ClipX = *ptr\RealWidth : EndIf
If ClipY > *ptr\RealHeight : ClipY = *ptr\RealHeight : EndIf
If ClipX + ClipWidth > *ptr\RealWidth : ClipWidth = *ptr\RealWidth - ClipX : EndIf
If ClipY + ClipHeight > *ptr\RealHeight : ClipHeight = *ptr\RealHeight - ClipY : EndIf
*ptr\Vertice[0]\tu = ClipX / *ptr\RealWidth
*ptr\Vertice[0]\tv = ClipY / *ptr\RealHeight
*ptr\Vertice[1]\tu = (ClipX + ClipWidth) / *ptr\RealWidth
*ptr\Vertice[1]\tv = ClipY / *ptr\RealHeight
*ptr\Vertice[2]\tu = ClipX / *ptr\RealWidth
*ptr\Vertice[2]\tv = (ClipY + ClipHeight) / *ptr\RealHeight
*ptr\Vertice[3]\tu = (ClipX + ClipWidth) / *ptr\RealWidth
*ptr\Vertice[3]\tv = (ClipY + ClipHeight) / *ptr\RealHeight
ProcedureReturn #True
EndProcedure
CompilerElse
Structure D3DTLVERTEX
x.f
y.f
z.f
rhw.f
Color.l
Specular.l
tu.f
tv.f
EndStructure
Structure PB_DX7Sprite3D
Texture.IDirectDrawSurface7 ; DirectDrawSurface7
Vertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
Width.w ; width set with ZoomSprite3D()
Height.w ; height set with ZoomSprite3D()
unknown.l
EndStructure
Procedure ClipSprite3D(Sprite3D,ClipX,ClipY,ClipWidth,ClipHeight)
Protected *ptr.PB_DX7Sprite3D = IsSprite3D(Sprite3D)
If *ptr = 0 : ProcedureReturn 0 : EndIf
Protected RealWidth = SpriteWidth(Sprite3D)
Protected RealHeight = SpriteHeight(Sprite3D)
If ClipX < 0 : ClipX = 0 : EndIf
If ClipY < 0 : ClipY = 0 : EndIf
If ClipWidth < 0 : ClipWidth = 0 : EndIf
If ClipHeight < 0 : ClipHeight = 0 : EndIf
If ClipX > RealWidth : ClipX = RealWidth : EndIf
If ClipY > RealHeight : ClipY = RealHeight : EndIf
If ClipX + ClipWidth > RealWidth : ClipWidth = RealWidth - ClipX : EndIf
If ClipY + ClipHeight > RealHeight : ClipHeight = RealHeight - ClipY : EndIf
*ptr\Vertice[0]\tu = ClipX / RealWidth
*ptr\Vertice[0]\tv = ClipY / RealHeight
*ptr\Vertice[1]\tu = (ClipX + ClipWidth) / RealWidth
*ptr\Vertice[1]\tv = ClipY / RealHeight
*ptr\Vertice[2]\tu = ClipX / RealWidth
*ptr\Vertice[2]\tv = (ClipY + ClipHeight) / RealHeight
*ptr\Vertice[3]\tu = (ClipX + ClipWidth) / RealWidth
*ptr\Vertice[3]\tv = (ClipY + ClipHeight) / RealHeight
ProcedureReturn 1
EndProcedure
CompilerEndIf
InitSprite()
InitSprite3D()
OpenWindow(0, 0, 0, 640, 480, "ClipScreen3D")
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
CreateSprite(0, 128, 128, #PB_Sprite_Texture)
If StartDrawing( SpriteOutput(0) )
Box(0, 0, 128, 128, #Green)
Circle(64, 64, 64, #Red)
StopDrawing()
EndIf
CreateSprite3D(0, 0)
ClipSprite3d(0, 50, 80, 100, 100)
Repeat
If Start3D()
DisplaySprite3D(0, x, 50)
x = (x + 1) % 200
Stop3D()
EndIf
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 14:01
par djes
Un autre truc vachement utile, le ClipScreen()
Code : Tout sélectionner
;*****************************************************************************
;*
;* Clipscreen3D Demo
;* djes 10/2009
;*
;* Tested on PB 4.4b4
;* Subsystem DirectX9
;*
;*****************************************************************************
Structure D3DVIEWPORT9
X.l
Y.l
Width.i
Height.i
MinZ.f
MaxZ.f
EndStructure
Procedure.l ScreenWidth()
!extrn _PB_Screen_Width
!MOV eax, [_PB_Screen_Width]
ProcedureReturn
EndProcedure
Procedure.l ScreenHeight()
!extrn _PB_Screen_Height
!MOV eax, [_PB_Screen_Height]
ProcedureReturn
EndProcedure
Procedure.l ScreenDepth()
!extrn _PB_Screen_Depth
!MOV eax, [_PB_Screen_Depth]
ProcedureReturn
EndProcedure
;*****************************************************************************
;*
;* Restrain the future drawing operations to the specified box
;*
;*****************************************************************************
Procedure.i ClipScreen3D(x.l, y.l, width.l, height.l)
!extrn _PB_Screen_Direct3DDevice
Protected *ViewPort.D3DVIEWPORT9
Protected D3Ddevice_interface.IDirect3DDevice9
!MOV dword EAX, [_PB_Screen_Direct3DDevice]
!MOV dword [p.v_D3Ddevice_interface],EAX
*ViewPort.D3DVIEWPORT9 = AllocateMemory(SizeOf(D3DVIEWPORT9))
If *Viewport
If D3Ddevice_interface\GetViewport(*ViewPort) = #S_OK
*ViewPort\X = x
*ViewPort\Y = y
*ViewPort\Width = Width
*ViewPort\Height = Height
*ViewPort\MinZ = 0.0
*ViewPort\MaxZ = 1.0
If D3Ddevice_interface\SetViewport(*ViewPort) = #S_OK
clip = #True
Else
clip = #False
EndIf
EndIf
FreeMemory(*Viewport)
EndIf
ProcedureReturn Clip
EndProcedure
;*****************************************************************************
InitSprite()
InitSprite3D()
OpenWindow(0, 0, 0, 640, 480, "ClipScreen3D")
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
CreateSprite(0, 128, 128, #PB_Sprite_Texture)
If StartDrawing( SpriteOutput(0) )
Box(0, 0, 128, 128, #Green)
Circle(64, 64, 64, #Red)
StopDrawing()
EndIf
CreateSprite3D(0, 0)
frame_counter = 0
ClipScreen3D(320 - 250, 240 - 150, 500, 300)
Repeat
ClearScreen(0)
ev = WindowEvent()
If Start3D()
DisplaySprite3D(0, 320 + frame_counter * Sin(frame_counter / 20) - 64, 240 + frame_counter * Cos(frame_counter / 20) - 64)
Stop3D()
EndIf
FlipBuffers()
frame_counter + 1
Until ev = #PB_Event_CloseWindow
Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 14:15
par blendman
salut
Merci pour ton exemple

.
j'ai testé l'exemple, mais ça ne marche pas chez moi, même en passant par openGL.
J'ai essayé de changé des valeurs et lorsque je commente les lignes :
(hauteur et largeur son la hauteur et largeur du sprite chargé)
Code : Tout sélectionner
; *S\Vertice[0]\sx=0
; *S\Vertice[0]\sy=0
;
; *S\Vertice[1]\sx=largeur/12
; *S\Vertice[1]\sy=0
;
; *S\Vertice[2]\sx=0
; *S\Vertice[2]\sy=hauteur
;
; *S\Vertice[3]\sx=largeur/2
; *S\Vertice[3]\sy=hauteur
je vois un morceaux d'image tout écrasé qui bouge

Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 14:17
par G-Rom
Regarde l'exemple de djes. c'est plus d'actualité.

Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 14:48
par blendman
j'ai regardé l'exemple de djes, mais il ne marche pas correctement : il ne coupe pas le sprite, il affiche un sprite de la taille du sprite d'origine et c'est à l'intérieur de celui-ci qu'il change certaine chose.
Moi, j'aimerai la même chose que le clipsprite() : c'est à dire que la faille du sprite affichée soit "coupée" et ensuite, que je puisse décaler l'offset pour l'animation

.
Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 15:04
par Cool Dji
yep, t'es trop pressé de tester ton animation

Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 15:20
par djes
Le code est ouvert, tu modifies comme tu veux

Re: clipsprite() et sprite3D()
Publié : jeu. 17/mars/2011 15:27
par G-Rom
en opengl c'est mort , d'après mes tests
IsSprite3D() renvois vers un pointeur , en lisant tout les floats après ce pointeur , j'ai que la position 2D de tout les vertices , pas d'autre d'infos , uv ,taille , etc...