Page 1 sur 3

Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 1:36
par majikeyric
Salute,

J'essaie de coder un effet, faire un dégradé de couleurs (copperbars qui bougent) dans les caractères d'une fonte. comme cela :


Image

pour faire cela, je passe par les étapes suivantes :

1) display des copperbars
2) display transparent du scrolltext (inversé) sur les copperbars
3) grabsprite du scrolltext
4) affichage de l'arrière-plan (bobs roses)
5) par dessus display du scrolltext avec les copperbars intégrées

seulement la fonction grabsprite() est assez gourmande en CPU ! (en tous cas par rapport aux autres fonctions de la bibliothèque sprites), (j'utilise PureFiler pour analyser les performances), mon affichage saccade à cause d'elle !

J'ai essayé de faire ma propre fonction avec accès directs de la mémoire écran vers la mémoire du sprite en utilisant les buffers, mais c'est pareil.

Je me suis creusé la tête pour trouver une astuce peut être toute bête pour réaliser ce simple effet de manière fluide, mais je ne trouve pas.

Si on était en mode "palettisé" ce serait tout bête, mais en RGB....

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 9:15
par Backup
perso , je ferai ceci

une image qui contient un degradé horizontale

un sprite qui contient tes caracteres de couleur rgb(255,255,0) sur fond noir
cette couleur tu peux la considéré comme transparente avec "TransparentSpriteColor(#Sprite, Couleur)"

ensuite il suffit de dessiner ton image de degradé , puis par dessus ton sprite transparent (dont une seule partie est transparente l'interieur des caracteres )
soit tu animes l'image de fond (le degradé ) de haut en pbas , ce qui fera changer le contenu de tes caracteres
soit tu animes le sprite de haut en bas , ce qui fera changer l'interieur des caracteres, qui laisseront passer
le contenu de l'image caché derriere ;)

:)

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 11:11
par Backup
ben chez moi ça ne saccade pas :
t'aurai pas oublié le "WaitWindowEvent(20)" le minuteur "20" par hasard ??
lorsque tu grab , tu ne grab que le Sprite, ou l'ecran entier ?? ...
tu liberes le sprite que tu grab ?? car a chaque grab = creation de sprite
tout ça mis bout a bout, ça peut effectivement ramer ... :)

ps: en des-aliasant la fonte ça rend mieux ;)

Code : Tout sélectionner


;*******************************************************************************************************
;- déclarations des procedures
;*******************************************************************************************************
Declare msg_erreur(Chaine$)
;*******************************************************************************************************
DisableDebugger

;- test du materiel
;*******************************************************************************************************
If InitSprite()=0
	msg_erreur("impossible d'initialiser les sprites"+Chr(10)+" le prg va quitter ")
	End 
EndIf
If InitMouse()=0
	msg_erreur("impossible d'initialiser la souris"+Chr(10)+" le prg va quitter ")
	End 
EndIf

If InitKeyboard()=0
	msg_erreur("impossible d'initialiser le clavier"+Chr(10)+" le prg va quitter ")
	End 
EndIf
If InitJoystick()=0
	msg_erreur("impossible d'initialiser le joystick"+Chr(10)+" on va continuer sans ")
	joystick=0
	Else
	joystick=1 ; le joystick est present !!
EndIf
;*******************************************************************************************************
;-initialisations constante structure tableaux variables
;*******************************************************************************************************
Enumeration
	#win
EndEnumeration
Enumeration
	#degrade
	#sprite_lettre
	#sprite_lettre_final
EndEnumeration
Enumeration
	#police
EndEnumeration

Structure degrade
	x.w
	y.w
	sensx.l
	sensy.l  
EndStructure

degrade.degrade
degrade\sensy.l=10
degrade\sensx.l=0
degrade\x.w=0
degrade\y.w=0
Largeur_degrade=1024
Hauteur_degrade=768
; ****************************************

Structure sprite
	x.w
	y.w
	sensx.l
	sensy.l  
EndStructure

sprite.sprite
sprite\sensy.l=0
sprite\sensx.l=10
sprite\x.w=0
sprite\y.w=hauteur_degrade/2
Largeur_sprite=500
Hauteur_sprite=100





;-ouvre ecran
;*******************************************************************************************************
Openwindow(#win,1,1,Largeur_degrade,Hauteur_degrade,"test",#PB_Window_SystemMenu |#PB_Window_ScreenCentered    )
OpenwindowedScreen(WindowId(#win),1,1,Largeur_degrade, Hauteur_degrade,1, 1,1)
KeyboardMode(1)
;*******************************************************************************************************

;-creation Sprite de fond
;*******************************************************************************************************
CreateSprite(#degrade,Largeur_degrade, Hauteur_degrade,32)
StartDrawing( SpriteOutput(#degrade))
	Box(1, 1, Largeur_degrade, Hauteur_degrade, $0)
	DrawingMode(#PB_2DDrawing_Gradient)   
	BackColor($0)
	;FrontColor($F102FC)
	;LinearGradient(0, 0, 0, Hauteur_degrade)
	;BoxedGradient(1, 1, Largeur_degrade, Hauteur_degrade)
	For i=0 To 255 
		GradientColor(0.4, rgb(i,0,0))
		GradientColor(0.8,rgb(0,i,0))
		GradientColor(0.16,rgb(0,0,i))
		GradientColor(0.32,rgb(0,i,i))
		GradientColor(0.64,rgb(i,i,0))
	Next i
	LinearGradient(0, 0, 0, Hauteur_degrade)
	Box(1, 1, Largeur_degrade, Hauteur_degrade)
StopDrawing()
;*******************************************************************************************************


;-creationSprite_lettre
LoadFont(#Police, "Verdana", 50 ,#PB_Font_Bold) 
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#False,0,0)
CreateSprite(#sprite_lettre,Largeur_sprite, Hauteur_sprite)
TransparentSpriteColor(#sprite_lettre, rgb(0,255,255)) ; couleur qui sert a la transparence
StartDrawing( SpriteOutput(#sprite_lettre))
	DrawingFont(FontID(#Police))
	DrawText(0, 0, "By Dobro", rgb(0,255,255) , $0) ; on ecrit donc en transparent sur fond noir
StopDrawing()
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#True,0,0)
;*******************************************************************************************************

;-boucle principale
Repeat
	WaitWindowEvent(20)
	;- Examine le materiel
	;*******************************************************************************************************
	ExamineKeyboard()
	ExamineMouse() 
	;*******************************************************************************************************
	
	;- logique de deplacement
	;*******************************************************************************************************
	degrade\y.w=degrade\y.w+degrade\sensy.l
	degrade\x.w=degrade\x.w+degrade\sensx.l
	
	if degrade\y.w>Hauteur_degrade/2
		degrade\sensy.l=-degrade\sensy.l
	Endif
	if degrade\y.w<1
		degrade\sensy.l=-degrade\sensy.l
	Endif
	
	if degrade\x.w>largeur/2
		degrade\sensx.l=-degrade\sensx.l
	Endif
	if degrade\x.w<1
		degrade\sensx.l=-degrade\sensx.l
	Endif
	
	
	; *************
	;*************
	sprite\y.w=sprite\y.w+sprite\sensy.l
	sprite\x.w=sprite\x.w+sprite\sensx.l
	
	if sprite\y.w>(hauteur_degrade-hauteur_sprite-10)
		sprite\sensy.l=-sprite\sensy.l
	Endif
	if sprite\y.w<10
		sprite\sensy.l=-sprite\sensy.l
	Endif
	
	if sprite\x.w>(largeur_degrade-largeur_sprite-10)
		sprite\sensx.l=-sprite\sensx.l
	Endif
	if sprite\x.w<10
		sprite\sensx.l=-sprite\sensx.l
	Endif
	;*******************************************************************************************************
	
	;-affichage des sprites
	;*******************************************************************************************************
	DisplaySprite(#degrade,degrade\x.w,degrade\y.w)
	DisplaytransparentSprite(#sprite_lettre,sprite\x,sprite\y)
	GrabSprite( #sprite_lettre_final,sprite\x,sprite\y,largeur_sprite,hauteur_sprite)
	ClearScreen(RGB(0, 0,0)) ; nettoie l'ecran apres capture
	DisplaytransparentSprite(#sprite_lettre_final,sprite\x,sprite\y)
	;*******************************************************************************************************
	
	FlipBuffers() ; affiche le resultat a l'ecran !
	ClearScreen(RGB(0, 0,0)) ; nettoie l'ecran apres affichage
	FreeSprite(#sprite_lettre_final)
Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(2)
End




; ********* Zone des sous-programme ******************




; **************** Zone des procedures  ******************
Procedure  msg_erreur(Chaine$)
	MessageRequester("erreur", Chaine$, #PB_MessageRequester_Ok )
EndProcedure
; *************************************************************


; Epb


Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 11:59
par Backup
code mis a jour ;)

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 12:21
par Ar-S
Cette 2eme mouture est bien mieux ;)

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 12:22
par Backup
il est a noter que avant nous avions UseBuffer()
qui etait vachement pratique on pouvais dessiner directement sur un sprite

c'etait surement trop simple ... ça a été retiré :roll: :?

parcequ Grabsprite, c'est bien, mais en dehors de l'ecran ... c'est .....hum ...

je viens de poster un message sur le forum anglais a ce propos
car il est clair que GrabSprite ne fonctionne pas en dehors de l'ecran .. !!

donc il semble ,impossible de faire apparaitre un sprite avec fond comme notre exemple ci dessus
de façon progressive dans l'ecran venant de la gauche ou de la droite ...du haut , du bas ....

bref , c'est la mouise , je ne me vois pas en train de precalculer les sprites avec un degradé mouvant
(sprite animés ) juste pour ça ... ça craint :)

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 13:09
par Fig
N'est il pas possible d'afficher le texte directement avec drawtext() et d'utiliser le mode de fusion #PB_2DDrawing_Gradient, comme dans l'exemple de la doc avec linear gradient ?
Cf http://purebasic.com/french/documentati ... gmode.html

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 13:12
par Backup
je n'y suis pas arrivé :roll:

n'oublie pas que le but c'est que la couleur soit animé ;)

ci dessous le code qui merdoie avec grapbSprite


le text va de gauche a droite , puis a nouveau de gauche a droite ...
il devrai apparaitre de façon reguliere , cependant, il CLip !! :roll:

Code : Tout sélectionner


;*******************************************************************************************************
;- déclarations des procedures
;*******************************************************************************************************
Declare msg_erreur(Chaine$)
;*******************************************************************************************************
DisableDebugger

;- test du materiel
;*******************************************************************************************************
If InitSprite()=0
	msg_erreur("impossible d'initialiser les sprites"+Chr(10)+" le prg va quitter ")
	End 
EndIf
If InitMouse()=0
	msg_erreur("impossible d'initialiser la souris"+Chr(10)+" le prg va quitter ")
	End 
EndIf

If InitKeyboard()=0
	msg_erreur("impossible d'initialiser le clavier"+Chr(10)+" le prg va quitter ")
	End 
EndIf
If InitJoystick()=0
	msg_erreur("impossible d'initialiser le joystick"+Chr(10)+" on va continuer sans ")
	joystick=0
	Else
	joystick=1 ; le joystick est present !!
EndIf
;*******************************************************************************************************
;-initialisations constante structure tableaux variables
;*******************************************************************************************************
Enumeration
	#win
EndEnumeration
Enumeration
	#degrade
	#sprite_lettre
	#sprite_lettre_final
EndEnumeration
Enumeration
	#police
EndEnumeration

Largeur_screen=1024
Hauteur_screen=768




Structure degrade
	x.w
	y.w
	sensx.l
	sensy.l  
EndStructure

degrade.degrade
degrade\sensy.l=10
degrade\sensx.l=0
degrade\x.w=0
degrade\y.w=0
Largeur_degrade=Largeur_screen
Hauteur_degrade=Hauteur_screen
; ****************************************

Structure sprite
	x.w
	y.w
	sensx.l
	sensy.l  
EndStructure

sprite.sprite
sprite\sensy.l=0
sprite\sensx.l=10
sprite\x.w=-Largeur_screen
sprite\y.w=hauteur_screen/2
Largeur_sprite=500
Hauteur_sprite=100





;-ouvre ecran
;*******************************************************************************************************
Openwindow(#win,1,1,Largeur_screen,Hauteur_screen,"test",#PB_Window_SystemMenu |#PB_Window_ScreenCentered    )
OpenwindowedScreen(WindowId(#win),1,1,Largeur_degrade, Hauteur_degrade,1, 1,1,#PB_Screen_WaitSynchronization )
KeyboardMode(1)
;*******************************************************************************************************

;-creation Sprite de fond
;*******************************************************************************************************
CreateSprite(#degrade,Largeur_degrade, Hauteur_degrade,32)
StartDrawing( SpriteOutput(#degrade))
	Box(1, 1, Largeur_degrade, Hauteur_degrade, $0)
	DrawingMode(#PB_2DDrawing_Gradient)   
	BackColor($0)
	;FrontColor($F102FC)
	;LinearGradient(0, 0, 0, Hauteur_degrade)
	;BoxedGradient(1, 1, Largeur_degrade, Hauteur_degrade)
	For i=0 To 255 
		GradientColor(0.4, rgb(i,0,0))
		GradientColor(0.8,rgb(0,i,0))
		GradientColor(0.16,rgb(0,0,i))
		GradientColor(0.32,rgb(0,i,i))
		GradientColor(0.64,rgb(i,i,0))
	Next i
	LinearGradient(0, 0, 0, Hauteur_degrade)
	Box(1, 1, Largeur_degrade, Hauteur_degrade)
StopDrawing()
;*******************************************************************************************************


;-creationSprite_lettre
LoadFont(#Police, "Verdana", 50 ,#PB_Font_Bold) 
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#False,0,0)
CreateSprite(#sprite_lettre,Largeur_sprite, Hauteur_sprite)
TransparentSpriteColor(#sprite_lettre, rgb(0,255,255)) ; couleur qui sert a la transparence
StartDrawing( SpriteOutput(#sprite_lettre))
	DrawingFont(FontID(#Police))
	DrawText(1, 1, "By Dobro", rgb(0,255,255) , $0) ; on ecrit donc en transparent sur fond noir
StopDrawing()
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#True,0,0)
;*******************************************************************************************************

;-boucle principale
Repeat
	WaitWindowEvent(20)
	;- Examine le materiel
	;*******************************************************************************************************
	ExamineKeyboard()
	ExamineMouse() 
	;*******************************************************************************************************
	
	;- logique de deplacement
	;*******************************************************************************************************
	degrade\y.w=degrade\y.w+degrade\sensy.l
	degrade\x.w=degrade\x.w+degrade\sensx.l
	
	if degrade\y.w>Hauteur_screen/2
		degrade\sensy.l=-degrade\sensy.l
	Endif
	if degrade\y.w<1
		degrade\sensy.l=-degrade\sensy.l
	Endif
	
	if degrade\x.w>largeur_screen/2
		degrade\sensx.l=-degrade\sensx.l
	Endif
	if degrade\x.w<1
		degrade\sensx.l=-degrade\sensx.l
	Endif
	
	
	; *************
	;-deplacement sprite lettre
	;*************
	sprite\y.w=sprite\y.w+sprite\sensy.l
	sprite\x.w=sprite\x.w+sprite\sensx.l
	
	if sprite\y.w>(hauteur_screen-hauteur_sprite-10)
		sprite\sensy.l=-sprite\sensy.l
	Endif
	if sprite\y.w<10
		sprite\sensy.l=-sprite\sensy.l
	Endif
	
	if sprite\x.w>(largeur_screen)
		;sprite\sensx.l=-sprite\sensx.l
		sprite\x.w=1-largeur_screen
	Endif
	if sprite\x.w<1
		;sprite\sensx.l=-sprite\sensx.l
	Endif
	;*******************************************************************************************************
	
	;-affichage des sprites
	;*******************************************************************************************************
	DisplaySprite(#degrade,degrade\x.w,degrade\y.w)
	DisplaytransparentSprite(#sprite_lettre,sprite\x,sprite\y)
	
	; ******* with GrabSprite *******************
	GrabSprite( #sprite_lettre_final,sprite\x,sprite\y,largeur_sprite,hauteur_sprite) ; 
	ClearScreen($0) ; nettoie l'ecran apres capture
	DisplaytransparentSprite(#sprite_lettre_final,sprite\x,sprite\y)
	; *************************************************
	
	; ************ without Grabsprite ***********************
	;DisplaytransparentSprite(#sprite_lettre,sprite\x,sprite\y) 
	;*******************************************************************************************************
	
	FlipBuffers() ; affiche le resultat a l'ecran !
	ClearScreen(RGB(0, 0,0)) ; nettoie l'ecran apres affichage
	; ******* with GrabSprite *******************
	FreeSprite(#sprite_lettre_final)
	; *************************************************
	
Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(2)
End




; ********* Zone des sous-programme ******************




; **************** Zone des procedures  ******************
Procedure  msg_erreur(Chaine$)
	MessageRequester("erreur", Chaine$, #PB_MessageRequester_Ok )
EndProcedure
; *************************************************************




; 

; Epb


Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 13:47
par Fig
Animé comment ? défilement de haut en bas par exemple ?
Je ne suis pas doué avec les modes de gradient, mais je vais essayer...

Edit: ça ne peut effectivement pas marcher, la doc indique qu'on ne peut afficher ce mode autre par que sur une image ou un canevas...
PB Doc a écrit :Note: The following modes only work with ImageOutput() and CanvasOutput(). They are ignored for all other outputs:

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 16:27
par Fig
En réutilisant ton code, Dobro, avec Clipsprite, ça semble propre et rapide... :idea:

Code : Tout sélectionner

;*******************************************************************************************************
;- déclarations des procedures
;*******************************************************************************************************
Declare msg_erreur(Chaine$)
;*******************************************************************************************************
DisableDebugger

;- test du materiel
;*******************************************************************************************************
If InitSprite()=0
   msg_erreur("impossible d'initialiser les sprites"+Chr(10)+" le prg va quitter ")
   End
EndIf
If InitMouse()=0
   msg_erreur("impossible d'initialiser la souris"+Chr(10)+" le prg va quitter ")
   End
EndIf

If InitKeyboard()=0
   msg_erreur("impossible d'initialiser le clavier"+Chr(10)+" le prg va quitter ")
   End
EndIf
;*******************************************************************************************************
;-initialisations constante structure tableaux variables
;*******************************************************************************************************
Enumeration
   #win
EndEnumeration
Enumeration
   #degrade
   #sprite_lettre
   #sprite_lettre_final
EndEnumeration
Enumeration
   #police
EndEnumeration

Largeur_screen=1024
Hauteur_screen=768

Structure degrade
   x.w
   y.w
   sensx.l
   sensy.l
EndStructure

degrade.degrade
degrade\sensy.l=10
degrade\sensx.l=0
degrade\x.w=0
degrade\y.w=0
Largeur_degrade=Largeur_screen
Hauteur_degrade=Hauteur_screen
; ****************************************

Structure sprite
   x.w
   y.w
   sensx.l
   sensy.l
EndStructure

sprite.sprite
sprite\sensy.l=0
sprite\sensx.l=10
sprite\x.w=-Largeur_screen
sprite\y.w=hauteur_screen/2
Largeur_sprite=500
Hauteur_sprite=100

;-ouvre ecran
;*******************************************************************************************************
OpenWindow(#win,1,1,Largeur_screen,Hauteur_screen,"test",#PB_Window_SystemMenu |#PB_Window_ScreenCentered    )
OpenWindowedScreen(WindowID(#win),1,1,Largeur_degrade, Hauteur_degrade,1, 1,1,#PB_Screen_WaitSynchronization )
KeyboardMode(1)
;*******************************************************************************************************

;-creation Sprite de fond
;*******************************************************************************************************
CreateSprite(#degrade,Largeur_degrade, Hauteur_degrade,32)
StartDrawing( SpriteOutput(#degrade))
   Box(1, 1, Largeur_degrade, Hauteur_degrade, $0)
   DrawingMode(#PB_2DDrawing_Gradient)   
   BackColor($0)
   ;FrontColor($F102FC)
   ;LinearGradient(0, 0, 0, Hauteur_degrade)
   ;BoxedGradient(1, 1, Largeur_degrade, Hauteur_degrade)
   For i=0 To 255
      GradientColor(0.4, RGB(i,0,0))
      GradientColor(0.8,RGB(0,i,0))
      GradientColor(0.16,RGB(0,0,i))
      GradientColor(0.32,RGB(0,i,i))
      GradientColor(0.64,RGB(i,i,0))
   Next i
   LinearGradient(0, 0, 0, Hauteur_degrade)
   Box(1, 1, Largeur_degrade, Hauteur_degrade)
StopDrawing()
;*******************************************************************************************************
;-creationSprite_lettre
LoadFont(#Police, "Bauhaus 93", 50 ,#PB_Font_Bold)
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#False,0,0)
CreateSprite(#sprite_lettre,Largeur_sprite, Hauteur_sprite)
TransparentSpriteColor(#sprite_lettre, RGB(0,255,255)) ; couleur qui sert a la transparence
StartDrawing( SpriteOutput(#sprite_lettre))
   DrawingFont(FontID(#Police))
   DrawText(1, 1, "By Dobro", RGB(0,255,255) , $0) ; on ecrit donc en transparent sur fond noir
StopDrawing()
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#True,0,0)
;*******************************************************************************************************

;-boucle principale
Repeat
   FlipBuffers() ; affiche le resultat a l'ecran !
   ClearScreen(RGB(0, 0,0)) ; nettoie l'ecran apres affichage
   WindowEvent()
   ;- Examine le materiel
   ;*******************************************************************************************************
   ExamineKeyboard()
   ExamineMouse()
   ;*******************************************************************************************************
   
   ;- logique de deplacement
   ;*******************************************************************************************************
  degrade\y.w=degrade\y.w+degrade\sensy.l 
;  degrade\x.w=degrade\x.w+degrade\sensx.l
;* Nécessaire su on veut un dégradé changeant horizontalement en plus...
;    If degrade\x.w>largeur_screen/2 Or degrade\x.w<1
;       degrade\sensx*-1
;    EndIf
   If degrade\y.w>Hauteur_screen/2 Or degrade\y.w<1
      degrade\sensy*-1
   EndIf
   ; *************
   ;-deplacement sprite lettre
   ;*************
   sprite\y.w=sprite\y.w+sprite\sensy.l
   sprite\x.w=sprite\x.w+sprite\sensx.l
   If sprite\y.w>(hauteur_screen-hauteur_sprite-10) Or sprite\y.w<10
      sprite\sensy*-1
   EndIf   
   If sprite\x.w>(largeur_screen)
      sprite\x.w=-SpriteWidth(#sprite_lettre)
   EndIf
   ;*******************************************************************************************************
   ;-affichage des sprites
   ;*******************************************************************************************************
   ClipSprite(#degrade,degrade\x,degrade\y,SpriteWidth(#sprite_lettre),SpriteHeight(#sprite_lettre))
   DisplaySprite(#degrade,sprite\x,sprite\y)
   DisplayTransparentSprite(#sprite_lettre,sprite\x,sprite\y)
Until KeyboardPushed(#PB_Key_Escape)
End
; ********* Zone des sous-programme ******************

; **************** Zone des procedures  ******************
Procedure  msg_erreur(Chaine$)
   MessageRequester("erreur", Chaine$, #PB_MessageRequester_Ok )
EndProcedure
; *************************************************************
; Epb

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 16:42
par Backup
ha oui ClipSprite() !! j'avais oublié :oops:

n’empêche quavec GrabSprite, il y a une couille dans le potage

j'en etait la a tester plusieurs Grabsprite suivant
si le sprite entre dans l'ecran
si il est dans l'ecran
si il sort de l'ecran ...

ben que dalle ! ça foire quand meme !!!

l'entre du sprite dans l'ecran, ça passe a peut prés (sans être trop regardant, mais la sortie ç'est du grand n'imp )

Code : Tout sélectionner


;*******************************************************************************************************
;- déclarations des procedures
;*******************************************************************************************************
Declare msg_erreur(Chaine$)
;*******************************************************************************************************
;DisableDebugger

;- test du materiel
;*******************************************************************************************************
If InitSprite()=0
	msg_erreur("impossible d'initialiser les sprites"+Chr(10)+" le prg va quitter ")
	End 
EndIf
If InitMouse()=0
	msg_erreur("impossible d'initialiser la souris"+Chr(10)+" le prg va quitter ")
	End 
EndIf

If InitKeyboard()=0
	msg_erreur("impossible d'initialiser le clavier"+Chr(10)+" le prg va quitter ")
	End 
EndIf
If InitJoystick()=0
	msg_erreur("impossible d'initialiser le joystick"+Chr(10)+" on va continuer sans ")
	joystick=0
	Else
	joystick=1 ; le joystick est present !!
EndIf
;*******************************************************************************************************
;-initialisations constante structure tableaux variables
;*******************************************************************************************************
Enumeration
	#win
EndEnumeration
Enumeration
	#degrade
	#sprite_lettre
	#sprite_lettre_final
EndEnumeration
Enumeration
	#police
EndEnumeration

Largeur_screen=1024
Hauteur_screen=768




Structure degrade
	x.w
	y.w
	sensx.l
	sensy.l  
EndStructure

degrade.degrade
degrade\sensy.l=10
degrade\sensx.l=0
degrade\x.w=0
degrade\y.w=0
Largeur_degrade=Largeur_screen
Hauteur_degrade=Hauteur_screen
; ****************************************

Structure sprite
	x.w
	y.w
	sensx.l
	sensy.l  
EndStructure

sprite.sprite
sprite\sensy.l=0
sprite\sensx.l=10
sprite\x.w=-Largeur_screen
sprite\y.w=hauteur_screen/2
Largeur_sprite=500
Hauteur_sprite=100





;-ouvre ecran
;*******************************************************************************************************
Openwindow(#win,1,1,Largeur_screen,Hauteur_screen,"test",#PB_Window_SystemMenu |#PB_Window_ScreenCentered    )
OpenwindowedScreen(WindowId(#win),1,1,Largeur_degrade, Hauteur_degrade,1, 1,1,#PB_Screen_WaitSynchronization )
KeyboardMode(1)
;*******************************************************************************************************

;-creation Sprite de fond
;*******************************************************************************************************
CreateSprite(#degrade,Largeur_degrade, Hauteur_degrade,32)
StartDrawing( SpriteOutput(#degrade))
	Box(1, 1, Largeur_degrade, Hauteur_degrade, $0)
	DrawingMode(#PB_2DDrawing_Gradient)   
	BackColor($0)
	;FrontColor($F102FC)
	;LinearGradient(0, 0, 0, Hauteur_degrade)
	;BoxedGradient(1, 1, Largeur_degrade, Hauteur_degrade)
	For i=0 To 255 
		GradientColor(0.4, rgb(i,0,0))
		GradientColor(0.8,rgb(0,i,0))
		GradientColor(0.16,rgb(0,0,i))
		GradientColor(0.32,rgb(0,i,i))
		GradientColor(0.64,rgb(i,i,0))
	Next i
	LinearGradient(0, 0, 0, Hauteur_degrade)
	Box(1, 1, Largeur_degrade, Hauteur_degrade)
StopDrawing()
;*******************************************************************************************************


;-creationSprite_lettre
LoadFont(#Police, "Verdana", 50 ,#PB_Font_Bold) 
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#False,0,0)
CreateSprite(#sprite_lettre,Largeur_sprite, Hauteur_sprite)
TransparentSpriteColor(#sprite_lettre, rgb(0,255,255)) ; couleur qui sert a la transparence
StartDrawing( SpriteOutput(#sprite_lettre))
	DrawingFont(FontID(#Police))
	DrawText(1, 1, "By Dobro", rgb(0,255,255) , $0) ; on ecrit donc en transparent sur fond noir
StopDrawing()
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#True,0,0)
;*******************************************************************************************************

;-boucle principale
Repeat
	WaitWindowEvent(20)
	;- Examine le materiel
	;*******************************************************************************************************
	ExamineKeyboard()
	ExamineMouse() 
	;*******************************************************************************************************
	
	;- logique de deplacement
	;*******************************************************************************************************
	degrade\y.w=degrade\y.w+degrade\sensy.l
	degrade\x.w=degrade\x.w+degrade\sensx.l
	
	if degrade\y.w>Hauteur_screen/2
		degrade\sensy.l=-degrade\sensy.l
	Endif
	if degrade\y.w<1
		degrade\sensy.l=-degrade\sensy.l
	Endif
	
	if degrade\x.w>largeur_screen/2
		degrade\sensx.l=-degrade\sensx.l
	Endif
	if degrade\x.w<1
		degrade\sensx.l=-degrade\sensx.l
	Endif
	
	
	; *************
	;-deplacement sprite lettre
	;*************
	sprite\y.w=sprite\y.w+sprite\sensy.l
	sprite\x.w=sprite\x.w+sprite\sensx.l
	
	if sprite\y.w>(hauteur_screen-hauteur_sprite-10)
		sprite\sensy.l=-sprite\sensy.l
	Endif
	if sprite\y.w<10
		sprite\sensy.l=-sprite\sensy.l
	Endif
	
	if sprite\x.w>(largeur_screen)
		;sprite\sensx.l=-sprite\sensx.l
		sprite\x.w=0-largeur_screen
	Endif
	if sprite\x.w<1
		;sprite\sensx.l=-sprite\sensx.l
	Endif
	;*******************************************************************************************************
	
	;-affichage des sprites
	;*******************************************************************************************************
	DisplaySprite(#degrade,degrade\x.w,degrade\y.w)
	DisplaytransparentSprite(#sprite_lettre,sprite\x,sprite\y)
	
	; ******* with GrabSprite *******************
	
	If sprite\x<1 and  (sprite\x+largeur_sprite) >1
		if GrabSprite( #sprite_lettre_final,1,sprite\y,largeur_sprite,hauteur_sprite) ; ; arrive par la gauche
			goto sui
		Endif
	Endif
	if sprite\x>1  and (sprite\x+largeur_sprite) <largeur_screen 
		if GrabSprite( #sprite_lettre_final,sprite\x,sprite\y,largeur_sprite,hauteur_sprite); dans l'ecran
			goto sui
		Endif
	Endif
	IF  (sprite\x)>1  and sprite\x+largeur_sprite>=largeur_screen
		if GrabSprite( #sprite_lettre_final,sprite\x,sprite\y,largeur_screen,hauteur_sprite) ; ; sort de l'ecran a droite
			goto sui
		Endif
	endif
	
	sui:
	; *************************************************
	
	; ************ without Grabsprite ***********************
	;DisplaytransparentSprite(#sprite_lettre,sprite\x,sprite\y) 
	;*******************************************************************************************************
	ClearScreen($0) ; nettoie l'ecran apres capture
	if IsSprite(#sprite_lettre_final)
		DisplaytransparentSprite(#sprite_lettre_final,sprite\x,sprite\y)
	Endif
	FlipBuffers() ; affiche le resultat a l'ecran !
	ClearScreen(RGB(0, 0,0)) ; nettoie l'ecran apres affichage
	; ******* with GrabSprite *******************
	if IsSprite(#sprite_lettre_final)
		FreeSprite(#sprite_lettre_final)
	Endif
	; *************************************************
	
Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(2)
End




; ********* Zone des sous-programme ******************




; **************** Zone des procedures  ******************
Procedure  msg_erreur(Chaine$)
	MessageRequester("erreur", Chaine$, #PB_MessageRequester_Ok )
EndProcedure
; *************************************************************




; 

; Epb


Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 16:43
par Fig
Je crois avoir lu quelque par que grabsprite ne fonctionnait pas avec toutes les cartes graphique en dehors de l'écran (ou ne fonctionnait juste pas en dehors de l'écran, je ne sais plus...) :?:

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 16:50
par Backup
ha .... faudrait retrouver cette infos alors .. :)

ceci expliquerai cela ....
clipSprite, finalement pourrai remplacer GrabSprite ??

ça semble faire la meme chose non ?

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 16:53
par Backup
non le pire !! 8O

la doc dit
Note: Sur certaines anciennes cartes graphiques, ClipSprite() ne fonctionne pas correctement si la taille du sprite dépasse la taille de l'écran.
c'est a propos de clipSPrite() pas de GrabSprite()

alors que finalement c'est clipSprite qui fonctionne le mieux :roll:
en plus evite une creation de sprite du coup

ps: je vais passer sur AGK ça va pas trainer :lol:

Re: Alternative à grabsprite() ou autre astuce ?

Publié : lun. 10/mars/2014 16:54
par Fig
Comme tu peux le voir, ça découpe ton sprite de dégradé à la dimension de ton sprite de texte, comme ça on affiche l'un sur l'autre et on n'a plus besoin de rien d'autre.

MDR ha, au temps pour moi dans mon erreur j'avais peut être juste en fait :mrgreen: Mais c'est un bug semble t il... Et ça doit venir de DX et non de Pb à tout les coups !

C'est quoi AGK ? :?: