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
@+
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 !
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

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()
C'est pas plutot :
De même que pour cette fonction, tu peut réutiliser ta fonction Plot2()
Mais sinon

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()
C'est pas plutot :
De même que pour cette fonction, tu peut réutiliser ta fonction Plot2()
Mais sinon

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 !!

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/