Flipbuffers

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Flipbuffers

Message par bombseb »

Bonjour,

je suis en train d'essayer la version de démo de purebasic, et je remercie les programmeurs pour avoir fait un langage simple avec lequel on peut faire du directx...je trouve ce langage vraiment cool

bon j'ai quand même 2 questions :
- comment faire pour ne pas utiliser le double buffering ?
j'aimerai directement dessiner sur l'écran et pas dans le buffer

- comment faire pour attendre le vertical blank (sans utiliser la fonction flipbuffers)

merci d'avance
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

snif snif
ca sent le demomaker ou jme trompe ???

pour ce que tu demandes je peux pas t'aider mais fait des recherches sur le forum... je crois que Marcus a déjà évoqué le sujet (entre autres) mais je ne te garanti rien...

Dri
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

ah ok merci

peut etre avec un pointeur je pense...
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Si tu veux pointer vers l'écran, fais un startdrawing dans le screenoutput et récupère l'adresse avec la fonction drawingbuffer...
mais va savoir si y'aura un rafraichissement sans flipbuffers...

Dri

PS. cherche dans l'aide tous ces mots clé...
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

merci beaucoup

mais je ne sais pas du tout comment on fait pour l'instant...
bon il faut que j'aille me coucher, demain je vais etre une lock :D

@+

PS : si qqun c'est comment faire....
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

voila un exemple

Code : Tout sélectionner

InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"Transparence")


;Récupère l'adresse du buffer invisible
StartDrawing(ScreenOutput())
*AdresseEcran=DrawingBuffer()
Pitch=DrawingBufferPitch()/SizeOf(long)
StopDrawing()

;Affiche le buffer invisible
FlipBuffers()

;Maintenant on peut dessiner directement à l'écran sans FlipBuffers()

Repeat
coul=Random($FFFFFF)
MinX=Random(400)
MinY=Random(300)
MaxX=Random(800-MinX)+MinX-1
MaxY=Random(600-MinY)+MinY-1

   For y=MinY To MaxY
      For x = MinX To MaxX
         ;Ecran En 32 bits
         *Ptr.long=*AdresseEcran + (x+y*Pitch) * SizeOf(Long)
         *Ptr\l=coul
      Next x
   Next y

ExamineKeyboard()

Until KeyboardPushed(#PB_Key_Escape)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je me spécialise dans le recyclage de code :)
autre exemple , on trace des cercles cette fois ci.

Code : Tout sélectionner

InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"Transparence")
Global *AdresseEcran,Pitch

;Récupère l'adresse du buffer invisible
StartDrawing(ScreenOutput())
*AdresseEcran=DrawingBuffer()
Pitch=DrawingBufferPitch()/SizeOf(long)
StopDrawing()

;Affiche le buffer invisible
FlipBuffers()

;Maintenant on peut dessiner directement à l'écran sans FlipBuffers()

Procedure Plot2(x,y,c)
If x>=0 And x<800 And y>=0 And y<600
	*Ptr.long=*AdresseEcran + (x+y*Pitch) * SizeOf(Long)
    *Ptr\l=c
EndIf
EndProcedure
Procedure cercle(x,y,R,c)
  xx = 0
  yy = R
  d = 1 - R
  Plot2(x+xx,y+yy,c)
  Plot2(x-xx,y+yy,c)
  Plot2(x+xx,y-yy,c)
  Plot2(x-xx,y-yy,c)
  Plot2(x+yy,y+xx,c)
  Plot2(x-yy,y+xx,c)
  Plot2(x+yy,y-xx,c)
  Plot2(x-yy,y-xx,c)
  While  yy > xx
    If  d < 0
      d + (2 * xx + 3)
    Else
      d + (2 * (xx - yy) + 5)
      yy - 1
    EndIf 
      xx + 1
    Plot2(x+yy,y+xx,c)
    Plot2(x-yy,y+xx,c)
    Plot2(x+yy,y-xx,c)
    Plot2(x-yy,y-xx,c)
    Plot2(x+xx,y+yy,c)
    Plot2(x+xx,y-yy,c)
    Plot2(x-xx,y+yy,c)
    Plot2(x-xx,y-yy,c)
 Wend   
EndProcedure

Procedure Boite(x,y,largeur,hauteur,couleur)
	If x<0 Or y<0 Or x>799 Or y>599 Or largeur<0 Or hauteur<0 Or largeur>800 Or hauteur>600
		ProcedureReturn 
	EndIf
	For b=y To y+hauteur-1
		For a=x To x+largeur-1
			*Ptr.long=*AdresseEcran + (a+b*Pitch) * SizeOf(Long)
    		*Ptr\l=couleur
		Next a
	Next b
EndProcedure    

Repeat

cercle(Random(800),Random(600),Random(600),RGB(Random(255),Random(255),Random(255)))

ExamineKeyboard()

If KeyboardPushed(#PB_Key_Space)
	Boite(0,0,800,600,Random($FFFFFF))
EndIf

Until KeyboardPushed(#PB_Key_Escape) 
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

oh génial ! 8O

merci beaucoup !!!!!

je vais essayer de faire un plasma !!

et puis un défilement d'étoiles

et puis un bump

et puis heu...

bon je vais d'abord tester ca :P
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Comtois, pourkoi tu n'utilise pas des constantes pour les tailles de l'écran ou mm directement ScreenWidth() ?

Par contre ya des erreurs pour la fonction : Boite()

Code : Tout sélectionner

If ... Or largeur>800 Or hauteur>600
C'est pas plutot :

Code : Tout sélectionner

x+largeur >= 800 or y+hauteur>=600
De même que pour cette fonction, tu peut réutiliser ta fonction Plot2() :wink:

Mais sinon :10: #yes
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

lionel_om a écrit :Comtois, pourkoi tu n'utilise pas des constantes pour les tailles de l'écran ou mm directement ScreenWidth() ?

Par contre ya des erreurs pour la fonction : Boite()

Code : Tout sélectionner

If ... Or largeur>800 Or hauteur>600
C'est pas plutot :

Code : Tout sélectionner

x+largeur >= 800 or y+hauteur>=600
De même que pour cette fonction, tu peut réutiliser ta fonction Plot2() :wink:

Mais sinon :10: #yes
Je n'utilise pas de constantes parce que c'est un exemple à adapter :)

Pour le contrôle effectivement , bien vu.
Au départ Je n'avais pas mis de tests , toujours pour la même raison , parce que c'est un exemple .
Et puis au dernier moment , j'ai ajouté quelques tests quand même :)

Et pour la fonction Plot2() , oui je l'ai vu après coup .
ça fait plaisir , ça montre que quelqu'un a jeté un oeil au code :)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

C'est pas un code de 3 km et puis c'est intéressant, donc j'observe et je pique pour ma collect perso !! :P
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Pierre
Messages : 244
Inscription : ven. 23/janv./2004 20:29
Localisation : 77 (Région parisienne)

Message par Pierre »

'scusez pour la question con mais ça sers a quoi de dessiner direct sur l'écran? ça fais quoi de + qu'utiliser le double buffering? (me suis jamais posé la question ^^)
Image
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Ben c'était pour répondre à la question de bombseb :)
Sinon je préfère moi aussi le double buffering.

Peut-être que bombseb va nous expliquer l'avantage.
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

ben en fait quand tu veut par exemple faire un starfield, tu ne veut pas utiliser de double buffering, ca ralentirais le truc alors qu'on n'en à pas besoin dans ce cas...enfin c'est un exemple
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu dois confondre PureBasic avec le basic de l'amstrad 6128 :)

tu verras que c'est très rapide avec le double buffering , et tu peux difficilement faire sans , sauf pour de petites démos comme ci dessus.
Cherche sur code archiv il y a des exemples de starfield , peut-être même sur ce forum , et tu verras que le résultat est très bon.Polux a fait quelques démos aussi assez chargées pour tester les capacités de PureBasic, tu les trouveras ici

http://www.bgames.org/
Répondre