clipsprite() et sprite3D()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

clipsprite() et sprite3D()

Message 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.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: clipsprite() et sprite3D()

Message 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...
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: clipsprite() et sprite3D()

Message 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
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: clipsprite() et sprite3D()

Message par Cool Dji »

:D
Only PureBasic makes it possible
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: clipsprite() et sprite3D()

Message 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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: clipsprite() et sprite3D()

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

Re: clipsprite() et sprite3D()

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

Re: clipsprite() et sprite3D()

Message par G-Rom »

Regarde l'exemple de djes. c'est plus d'actualité. ;)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: clipsprite() et sprite3D()

Message 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 :).
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: clipsprite() et sprite3D()

Message par Cool Dji »

yep, t'es trop pressé de tester ton animation :D
Only PureBasic makes it possible
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: clipsprite() et sprite3D()

Message par djes »

Le code est ouvert, tu modifies comme tu veux :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: clipsprite() et sprite3D()

Message 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...
Répondre