Flipbuffers
Flipbuffers
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
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
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)
Je me spécialise dans le recyclage de code 
autre exemple , on trace des cercles cette fois ci.

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)
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
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

Par contre ya des erreurs pour la fonction : Boite()
Code : Tout sélectionner
If ... Or largeur>800 Or hauteur>600
Code : Tout sélectionner
x+largeur >= 800 or y+hauteur>=600

Mais sinon


Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
Je n'utilise pas de constantes parce que c'est un exemple à adapterlionel_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 :Code : Tout sélectionner
If ... Or largeur>800 Or hauteur>600
De même que pour cette fonction, tu peut réutiliser ta fonction Plot2()Code : Tout sélectionner
x+largeur >= 800 or y+hauteur>=600
![]()
Mais sinon![]()

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

-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
C'est pas un code de 3 km et puis c'est intéressant, donc j'observe et je pique pour ma collect perso !! 

Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
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/

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/