Drawcopy ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Drawcopy ?

Message par Buckethead »

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.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Utilise GrabSprite ! :wink:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Oui les sprites peuvent servir de Buffer avec la commande UseBuffer(#Sprite)

UseBuffer(-1) Pour rendre le main au buffer écran. :D
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Je vais essayer de me faire une simple routine. Juste un drawtext sur l'écran principal et le dédoubler ;) Pour le moment je mélange tout avec StartDrawing ;(
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Buckethead a écrit :Je vais essayer de me faire une simple routine. Juste un drawtext sur l'écran principal et le dédoubler ;) Pour le moment je mélange tout avec StartDrawing ;(
je te conseil une recherche sur le forum avec le mot "chenille"
:D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Buckethead a écrit :Je vais essayer de me faire une simple routine. Juste un drawtext sur l'écran principal et le dédoubler ;) Pour le moment je mélange tout avec StartDrawing ;(
je te conseil une recherche sur le forum avec le mot "chenille"
ou mieux "Une chenille sur votre écran"
:D
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

J'aborderais de nouveau la chenille maintenant que j'ai fighté pour écrire ce misérable bout de code. :D

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)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

@Buckethead

Code : Tout sélectionner

; Routine habituelle, en plein écran.
OpenScreen(640,400,32,"S")
(640x480)
Tu as utilisé une résolution incorrecte ! :!:

Sinon sympa ton code :D
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

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 ?
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

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 ?
Utilise les Sprite2D et 3D c’est bien plus pratique et rapide. :wink:
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

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)

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)
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

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.

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)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

T’es un fan des formes sinusoïdales :)
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

C'est pour être le plus simple et le plus lisible possible avec les instructions qui m'interresse. (pas l'algo)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

j'aurai eu un truc comme ça a faire, j'aurai utilisé que des Sprites !! :)


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

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