Page 1 sur 2

Flipbuffers

Publié : jeu. 25/août/2005 23:04
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

Publié : jeu. 25/août/2005 23:11
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

Publié : jeu. 25/août/2005 23:17
par bombseb
ah ok merci

peut etre avec un pointeur je pense...

Publié : jeu. 25/août/2005 23:25
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é...

Publié : jeu. 25/août/2005 23:27
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....

Publié : ven. 26/août/2005 18:33
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)

Publié : ven. 26/août/2005 22:41
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) 

Publié : sam. 27/août/2005 0:20
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

Publié : sam. 27/août/2005 11:19
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

Publié : sam. 27/août/2005 12:15
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 :)

Publié : sam. 27/août/2005 14:42
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

Publié : sam. 27/août/2005 15:37
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 ^^)

Publié : sam. 27/août/2005 15:46
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.

Publié : sam. 27/août/2005 19:32
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

Publié : sam. 27/août/2005 19:37
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/