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
:D

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
G-Rom a écrit :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
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 :P

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 :D

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