Drawcopy ?
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
Drawcopy ?
Bonjour à tous.
Je ne trouve pas de fonction pour copier l'écran principal ou une portion de celui ci. Je le fais au point par point.
En regardant quelques listings sur le board, j'ai cru comprendre qu'il fallait passer par les sprites 2D. Et utiliser sprite3D au passage, ce qui permettrait de zoomer la partie grabbée, ainsi que d'appliquer un filtre comme l'antialias.
Ces sprites peuvent ils servir de buffer, par exemple pour faire un effet "bob unlimited" qui consiste à ouvrir une 10 ène d'écrans buffer de la taille de l'écran principal (ou simplement un écran buffer10 fois plus grand) et en faisant du page flipping.
Je ne trouve pas de fonction pour copier l'écran principal ou une portion de celui ci. Je le fais au point par point.
En regardant quelques listings sur le board, j'ai cru comprendre qu'il fallait passer par les sprites 2D. Et utiliser sprite3D au passage, ce qui permettrait de zoomer la partie grabbée, ainsi que d'appliquer un filtre comme l'antialias.
Ces sprites peuvent ils servir de buffer, par exemple pour faire un effet "bob unlimited" qui consiste à ouvrir une 10 ène d'écrans buffer de la taille de l'écran principal (ou simplement un écran buffer10 fois plus grand) et en faisant du page flipping.
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
J'aborderais de nouveau la chenille maintenant que j'ai fighté pour écrire ce misérable bout de code. 

Code : Tout sélectionner
InitSprite()
InitKeyboard()
; Création de "l'image" qui va servir de buffer. J'utilise 2 buffers, est-ce necessaire, car il me
; semble que l'on puisse pas grabber sur la même image avec un GrabImage(0, 0,...) par exemple.
CreateImage(0, 640,400)
CreateImage(1, 320,200)
; On dessine le background pour "l'image".
StartDrawing(ImageOutput(0))
For t = 0 To 400 Step 15
DrawText (0,t,"PUREBASIC*PUREBASIC*PUREBASIC*PUREBASIC*PUREBASIC*PUREBASIC*PUREBASIC*PUREBASIC*")
Next
StopDrawing()
; On grabbe une partie de l'image 0 sur l'image 1 (une portion)
GrabImage(0, 1, 100, 100, 100, 30)
; Routine habituelle, en plein écran.
OpenScreen(640,400,32,"S")
Repeat
ClearScreen(0)
StartDrawing (ScreenOutput())
t = t + 1
; Image 0 (image en 640*400)
DrawImage(ImageID(0),32*Sin(t/30),20*Cos(t/30))
; Affiche du texte par dessus la première image.
For f = 0 To 400 Step 15
DrawText (1.5*f,f,"PUREBASIC")
Next
; image 1 (image en 320*200 qui contient une portion de l'image 0. On pouvait utiliser un createImage 1 plus petit.)
DrawImage(ImageID(1),290+50*Cos(t/15),200+50*Sin(t/15))
StopDrawing ()
FlipBuffers ()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
@Buckethead
(640x480)
Tu as utilisé une résolution incorrecte !
Sinon sympa ton code
Code : Tout sélectionner
; Routine habituelle, en plein écran.
OpenScreen(640,400,32,"S")
Tu as utilisé une résolution incorrecte !

Sinon sympa ton code

-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
Désolé pour la résolution, elle passe pas sur tous les PC's. Elle me rapelle la haute résolution en mono sur l'Atari ST =]
Je ne peux absolument pas copier l'écran principal sur l'image 0. Je comptais recopier un effet en temps réel.
Si j'ai bien compris, il faudrait tout dessiner sur l'image et paster le tout sur l'écran principal ?
Je ne peux absolument pas copier l'écran principal sur l'image 0. Je comptais recopier un effet en temps réel.
Si j'ai bien compris, il faudrait tout dessiner sur l'image et paster le tout sur l'écran principal ?
Utilise les Sprite2D et 3D c’est bien plus pratique et rapide.Buckethead a écrit :Désolé pour la résolution, elle passe pas sur tous les PC's. Elle me rapelle la haute résolution en mono sur l'Atari ST =]
Je ne peux absolument pas copier l'écran principal sur l'image 0. Je comptais recopier un effet en temps réel.
Si j'ai bien compris, il faudrait tout dessiner sur l'image et paster le tout sur l'écran principal ?

-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
J'avais besoin d'attaquer une instruction plus simple comme drawimage.
J'ai fait le test en dessinant tout dans l'image frame par frame, ca aurait pu marcher :p Effet copié mais reste statique, dommage car on dirait qu'on peut stretcher et faire de l'antialias, idéal pour les trucs interpolés.
Bilan: cette commande n'est pas faite pour ce que je veux faire, elle serait utile pour des animations prédessinnées (ou des images importées biensur.) Elle me semble rapide cette instruction.
Depuis le help j'ai vu que les sprites permettaient de copier l'écran principal, du moins il n'y avait pas de destination avec l'instruction "GrabSprite" dans le help. (mise à part le sprite)
J'ai fait le test en dessinant tout dans l'image frame par frame, ca aurait pu marcher :p Effet copié mais reste statique, dommage car on dirait qu'on peut stretcher et faire de l'antialias, idéal pour les trucs interpolés.
Bilan: cette commande n'est pas faite pour ce que je veux faire, elle serait utile pour des animations prédessinnées (ou des images importées biensur.) Elle me semble rapide cette instruction.
Depuis le help j'ai vu que les sprites permettaient de copier l'écran principal, du moins il n'y avait pas de destination avec l'instruction "GrabSprite" dans le help. (mise à part le sprite)
Code : Tout sélectionner
InitSprite()
InitKeyboard()
OpenScreen(320,200,32,"S")
CreateImage(0,320,200)
StartDrawing(ImageOutput(0))
Repeat
For y = 0 To 199
For x = 0 To 319
Plot(Random(320),Random(200),Random(255))
Next x
Next y
StopDrawing ()
StartDrawing (ScreenOutput())
DrawImage(ImageID(0),0,0)
; Efface l'image, mais l'effet reste statique avec des rnd. Ne fait que scintiller l'écran
; J'ai osé mettre le CreateImage dans la boucle avec le FreeImage, écran noir.
; FreeImage(0)
StopDrawing ()
FlipBuffers ()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
Voilà je suis arrivé à ce résultat avec les sprites, ca me surprend de mettre un CreateSprite(0,320,200) et un StartDrawing(SpriteOutput(0)) dans la boucle.
Aussi quand on a fini avec le sprite animé et généré en temps réel, et qu'on désire par exemple afficher du texte par dessus, je pensais que UseBuffer(-1) aurait fait le job, mais j'ai du utiliser StartDrawing(ScreenOutput())
Je suis certain qu'il y a une manière plus élégante de le faire, je ne parle pas de la structure ou de l'algo, je prèfère un petit code, bien linéaire. Assez petit pour qu'on puisse se passer de commentaires.
Aussi quand on a fini avec le sprite animé et généré en temps réel, et qu'on désire par exemple afficher du texte par dessus, je pensais que UseBuffer(-1) aurait fait le job, mais j'ai du utiliser StartDrawing(ScreenOutput())

Je suis certain qu'il y a une manière plus élégante de le faire, je ne parle pas de la structure ou de l'algo, je prèfère un petit code, bien linéaire. Assez petit pour qu'on puisse se passer de commentaires.
Code : Tout sélectionner
InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"a")
Repeat
CreateSprite(0,320,200)
StartDrawing(SpriteOutput(0))
For y = 0 To 199
For x = 0 To 319
Plot(x,y,Sin((x+2*t)/Cos(y+4*t)/8))
Next x
Next y
StopDrawing()
ClearScreen(0)
t = t + 1
DisplaySprite(0,150+100*Sin(t/32),130+100*Cos(t/64))
; UseBuffer(-1) Est ce un moyen d'éviter un nouveau StartDrawing pour dessiner autre chose ?
; Je n'ai que des écran noirs avec.
StartDrawing(ScreenOutput())
DrawText(150,240,"PUREBASIC")
StopDrawing()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
j'aurai eu un truc comme ça a faire, j'aurai utilisé que des Sprites !! 
pour le usebuffer() , il semble que cela ne concerne pas les fonctions 2dDrawing, mais les fonctions de rendus !!! (Displaysprite(ect ...))
ben oui , on peut dessiner des Sprites dans un Sprite"Ecran"
ou bien directement sur l'ecran !!
d'ailleur utiliser un Sprite en lieu et place de l'ecran permet de Scroller facillement, puisqu'un sprite est fait pour ça !!

Code : Tout sélectionner
; UseBuffer(#PB_Default); Est ce un moyen d'éviter un nouveau StartDrawing pour dessiner autre chose ?
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"a")
CreateSprite(0,320,200)
CreateSprite(1,78,15)
StartDrawing(SpriteOutput(1))
DrawText(0,0,"PUREBASIC",RGB(255,10,150))
StopDrawing()
Repeat
StartDrawing(SpriteOutput(0))
For Y = 0 To 199
For x = 0 To 319
Plot(x,Y,Sin((x+2*t)/Cos(Y+4*t)/8))
Next x
Next Y
StopDrawing()
t = t + 1
DisplaySprite(1,150,240) ; affiché en premier , donc sera derriere !!
DisplaySprite(0,150+100*Sin(t/32),130+100*Cos(t/64))
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
pour le usebuffer() , il semble que cela ne concerne pas les fonctions 2dDrawing, mais les fonctions de rendus !!! (Displaysprite(ect ...))
ben oui , on peut dessiner des Sprites dans un Sprite"Ecran"
ou bien directement sur l'ecran !!

d'ailleur utiliser un Sprite en lieu et place de l'ecran permet de Scroller facillement, puisqu'un sprite est fait pour ça !!
