Alternative à grabsprite() ou autre astuce ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Alternative à grabsprite() ou autre astuce ?

Message par Fig »

Dobro a écrit :@Fig , je prefere comme ça :mrgreen:
J'aime beaucoup les molécules, genre transition dans the Big Bang theory :mrgreen:

Falsam> Oui, ton code c'est exactement ce qu'on fait... sauf que je n'ai pas mis le startdrawing dans une procedure, mais bon, ça ne change rien.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Alternative à grabsprite() ou autre astuce ?

Message par Backup »

UseBuffer()

Syntaxe

UseBuffer(#Sprite)
Description

Change la surface de rendu par défaut (l'ecran) par le #Sprite. Ainsi, toutes les commandes du type DisplaySprite(), DisplayTransparentSprite() etc.. seront appliquées sur le #Sprite.

Pour revenir en mode normal (surface écran), il suffit de remplacer #Sprite par #PB_Default.
OS Supportés

Windows (DirectX), Linux (SDL)

c'est ça qu'on ne peut plus faire

dessiner avec un sprite, dans un sprite
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Alternative à grabsprite() ou autre astuce ?

Message par Fig »

Pour finir, sans le clipsprite() ...

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
   #boule
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 boule
   x.w
   y.w
   sensx.f
   sensy.f
EndStructure
Global Dim boule.boule(500)
For i=0 To 499
   boule(i)\x.w=Random(largeur_screen)
   boule(i)\y.w=Random(hauteur_screen)
Next i
; ****************************************
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)
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#False,0,0)
;*******************************************************************************************************
LoadFont(#Police, "Bauhaus 93", 50 ,#PB_Font_Bold)
;**************************************************************************************************
texte$="By Dobro and Fig ..."
;Affiche un fond
CreateSprite(#boule,32,32)
StartDrawing(SpriteOutput(#boule))
      DrawingFont(FontID(#Police))
      Largeur_sprite=TextWidth(texte$)
      Hauteur_sprite=TextHeight(texte$)
   DrawingMode(#PB_2DDrawing_Gradient)   
   BackColor($E65352)
   FrontColor($0)
   CircularGradient(16,16, 16)
   Circle(16,16,16)
StopDrawing()
;*******************************************************************************************************
;-creation Sprite de fond
;*******************************************************************************************************
CreateSprite(#degrade,Largeur_sprite, Hauteur_sprite,32)
TransparentSpriteColor(#degrade, RGB(0,255,255))
;-boucle principale
Repeat
   
   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 si 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_sprite<<2 Or degrade\y.w<0
      degrade\sensy*-1
   EndIf
   ; *************
   ;-deplacement
   ;*************
   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_Sprite
      sprite\x.w=Largeur_Screen+Largeur_Sprite
   EndIf
   ;*******************************************************************************************************
   ;-changement du texte si besoin
   ;*******************************************************************************************************
   texte$="By Dobro and Fig ..."
   ;*******************************************************************************************************
   ;-affichage des sprites
   ;*******************************************************************************************************
   ;Affiche un fond
   For i=1 To 500
      boule(i)\sensx.f=Random(2)+ -1
      boule(i)\x=boule(i)\x+boule(i)\sensx.f
      boule(i)\sensy.f=Random(2)+ -1
      boule(i)\y=boule(i)\y+boule(i)\sensy.f
      DisplayTransparentSprite(#boule,boule(i)\x,boule(i)\y)
   Next i
   ;recréé le dégradé dans le sprite
   StartDrawing(SpriteOutput(#degrade))
      DrawingMode(#PB_2DDrawing_Gradient)   
      BackColor(#Black)
      FrontColor(#Yellow)
      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,-hauteur_sprite<<2+degrade\y,0,Hauteur_sprite+degrade\y)
      DrawingFont(FontID(#Police))
      DrawText(0,0,texte$,#Black,RGB(0,255,255))
   StopDrawing()
   ;affiche le scroll
   DisplayTransparentSprite(#degrade,sprite\x,sprite\y)
   FlipBuffers() ; affiche le resultat a l'ecran !
   ClearScreen(#Black) ; nettoie l'ecran apres affichage
Until KeyboardPushed(#PB_Key_Escape)
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#True,0,0)
End
; ********* Zone des sous-programme ******************

; **************** Zone des procedures  ******************
Procedure  msg_erreur(Chaine$)
   MessageRequester("erreur", Chaine$, #PB_MessageRequester_Ok )
EndProcedure
; *************************************************************
; Epb
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Alternative à grabsprite() ou autre astuce ?

Message par Backup »

non ... pas fini :)

j'ai remis au gout du jour une procedure que j'avais dans mes bagages :D

cette procedure permet d'afficher a volonté un text en Sinus-Scroll
elle genere toute seule un sprite "ecran" et c'est dans ce sprite qu'a lieu le Scroll :D

explication :

Code : Tout sélectionner

Ondulation(spr,x,y,taille_x,xt,Texte$,couleur.l)
;spr = numero d'un sprite .. il sera cree et detruit par cette procedure )
; ce sprite contiendra le texte$ , c'est le texte$ qui bouge... pas le sprite il me sert d'ecran !
; X;Y = la coodonée d'affichage du sprite "ecran" qui contient donc le text
; taille_x = la taille en X du Sprite "Ecran" .. en principe la taille_y est calculé automatiquement ... (en principe )
; xt = c'est le deplacement horizontal du text dans le sprite "ecran" , si on veux que ça scroll => xt=xt-2
; Texte$ = le text a afficher
; Couleur.l = si egale a 0 ce sera un degradé mouvant dans la fonte !!! ..... sinon , ce sera la couleur choisie

les autres parametres (hauteur du scroll, longeur, etc ... ) sont interne a la procedure ... je ne voulais pas faire une procedure avec 20 parametres ;)




Exemple

Code : Tout sélectionner

;*******************************************************************************************************
;- déclarations des procedures
;*******************************************************************************************************
Declare  Ondulation(spr,x,y,taille_x,xt,Texte$,couleur.l)
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
	#boule
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 boule
	x.w
	y.w
	sensx.f
	sensy.f
EndStructure
Global Dim boule.boule(500)
For i=0 To 499
	boule(i)\x.w=Random(largeur_screen)
	boule(i)\y.w=Random(hauteur_screen)
Next i
; ****************************************
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)
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#False,0,0)
;*******************************************************************************************************
LoadFont(#Police, "Bauhaus 93", 50 ,#PB_Font_Bold)
;**************************************************************************************************
texte$="By Dobro and Fig ..."
;Affiche un fond
CreateSprite(#boule,32,32)
StartDrawing(SpriteOutput(#boule))
	DrawingFont(FontID(#Police))
	Largeur_sprite=TextWidth(texte$)
	Hauteur_sprite=TextHeight(texte$)
	DrawingMode(#PB_2DDrawing_Gradient)   
	BackColor($E65352)
	FrontColor($0)
	CircularGradient(16,16, 16)
	Circle(16,16,16)
StopDrawing()
;
;-boucle principale
Repeat
	
	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 si 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_sprite<<2 Or degrade\y.w<0
		degrade\sensy*-1
	EndIf
	; *************
	;-deplacement
	;*************
	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_Sprite
		sprite\x.w=Largeur_Screen+Largeur_Sprite
	EndIf
	;*******************************************************************************************************
	;-changement du texte si besoin
	;*******************************************************************************************************
	texte$="By Dobro and Fig ..."
	;*******************************************************************************************************
	;-affichage des sprites
	
	
	
	
	
	;*******************************************************************************************************
	;Affiche un fond
	For i=1 To 500
		boule(i)\sensx.f=Random(2)+ -1
		boule(i)\x=boule(i)\x+boule(i)\sensx.f
		boule(i)\sensy.f=Random(2)+ -1
		boule(i)\y=boule(i)\y+boule(i)\sensy.f
		DisplayTransparentSprite(#boule,boule(i)\x,boule(i)\y)
	Next i
	
	;affiche le scroll
	taille_x=largeur_screen
	
	xt=xt-3; on deplace le text dans le sprite
	
	if xt<=-largeur_screen
		xt=largeur_screen
	Endif
	y=hauteur_screen/2
	x=1
	couleur.l= $0  ; rgb(255,0,255) 
	Ondulation(#degrade,x,y,taille_x,xt,Texte$,couleur.l)
	
	FlipBuffers() ; affiche le resultat a l'ecran !
	ClearScreen(#Black) ; nettoie l'ecran apres affichage
Until KeyboardPushed(#PB_Key_Escape)
SystemParametersInfo_(#SPI_SETFONTSMOOTHING,#True,0,0)
End
; ********* Zone des sous-programme ******************

; **************** Zone des procedures  ******************
Procedure Ondulation(spr,x,y,taille_x,xt,Texte$,couleur.l)
	; procedure realisé par OLIV l'ondulation
	; et DOBRO pour la mise en couleur... et la sortie sur Sprite
	
	; ******* explication des parametres ***************
	;spr = numero d'un sprite .. il sera cree et detruit par cette procedure )
	; ce sprite contiendra le texte$ , c'est le texte$ qui bouge... pas le sprite il me sert d'ecran !
	; X;Y = la coodonée d'affichage du sprite "ecran" qui contient donc le text
	; taille_x  = la taille en X du Sprite "Ecran" .. en principe la taille_y est calculé automatiquement ...
	; xt = c'est le deplacement horizontal du text dans le sprite "ecran" , si on veux que ça scroll => x=x-2
	; Texte$ = le text a afficher
	; Couleur.l  =   si egale a  0 ce sera un degradé mouvant dans la fonte !!!  ..... sinon , ce sera la couleur choisie
	
	memposy=taille_y
	static  angleo.f ; ceci anime les lettres
	#VitesseAngle = 1 * #PI / 50 ; vitesse de modification de l'angle de départ du texte
	#HauteurSin = 50 ; Coef qui joue sur la hauteur de la sinusoide
	#LargeurSin = 50 ; Coef qui joue sur la largeur de la sinusoide
	
	taille_y=#HauteurSin*4
	yt=#HauteurSin*2
	
	
	If createsprite(spr,taille_x,taille_y)
		StartDrawing(SpriteOutput(img))
			DrawingFont ( FontID (0)) ; On change la police
			angleo + #VitesseAngle ; Angle de départ de la sinusoide en radian
			If angleo >= 2 * #PI
				angleo = 0
			EndIf
			; On affiche toute les lettres
			PosX = 10 ; Position du caractère
			
			For n = 1 To Len (Texte$) ; Pour chaque lettre du texte
				Lettre.s = Mid (Texte$, n, 1) ; on récupère la lettre à la position n
				PosY =  #HauteurSin * Sin (angleo + PosX / #LargeurSin )-taille_y/4 ; on calcul la position en Y de la lettre
				
				if couleur.l=$0
					DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_Transparent)   
					BackColor($0)
					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, taille_x,taille_y)
					else
					FrontColor ( couleur.l ) ; On change la couleur.
				Endif
				;Box(0, 0, 1024, 768)
				DrawText (xt+PosX, yt+PosY,Lettre)
				PosX + TextWidth (Lettre)
			Next
			
		StopDrawing () ; On signife que l'on arrête les fonctions dessin 2D.
		DisplaytransparentSprite( spr,x,y)
		FreeSprite(spr)
		
	Endif
EndProcedure

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

Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Alternative à grabsprite() ou autre astuce ?

Message par Fig »

Image
Très sympa comme effet.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Alternative à grabsprite() ou autre astuce ?

Message par Backup »

:)
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Alternative à grabsprite() ou autre astuce ?

Message par majikeyric »

Oui, la solution avec le dégradé dans le drawtext conviendrait à merveille! Merci ! :D
ça oblige à ne pas avoir une fonte graphique custom par contre.

Je ne maitrise pas bien les gradientcolor, lineargradient...
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Alternative à grabsprite() ou autre astuce ?

Message par majikeyric »

Oui, le sinus scroll est très chouette aussi!
Répondre