...............

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

...............

Message par Backup »

...............
Dernière modification par Backup le ven. 07/oct./2011 12:30, modifié 2 fois.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

ca me plait pas de faire ca moi :s
je sais pas comment connaitre la hauteur de l'output avec la lib 2D Drawing

avec le pitch et le pixelformat on récupère facilement la largeur de la surface et aussi l'adresse mémoire de ces pixels... mais un clipping complet n'est pas possible et si on dépasse le y max de la surface on écrit dans de la mémoire qui n'est pas celle de l'output... Et ca c'est risqué...

Dri

PS. pas sûr d'avoir été clair là
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

l'autre topic a été viré, celui qui contenait la procedure... voila ce que j'avai à y dire :

sans même tester je suis sûr de deux choses

ta procédure est dangereuse
ta procédure n'est pas plus rapide

premierement tu ne teste pas si le startdrawing aboutit

Code : Tout sélectionner

If StartDrawing(output) ;y'a pas que l'écran où on plot
  dessiner
  StopDrawing()
Endif
deuxiemement pour chaque plot tu vas lancer un startdrawing et ca tu peux etre spûr que ca va ralentir si tu utilise plus d'un plot...

Code : Tout sélectionner

Procedure Plot(x, y, c)
  *buffer = DrawingBuffer()
  If *buffer
    ;récupérer les informations sur la surface
    ;convertir - si besoin est - la couleur
    ;*pointer vers l'adresse pour écrire la couleur
  EndIf
EndProcedure
Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

le forum m'avais cree un autre topic avec le mem sujet qui etait plus a jour
dans lequel j'utilisait la resolution de l'ecran exact
(je comprend pas se qui c'est passé !!)
j'ai effacé l'autre topic

bon voici ma conclusion apres moult essai !!

c'est pas la peine de se prendre la tete les pokel sont pas plus rapide que le plot !! :lol: :lol:


donc on oublie !!! :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui Dr DRI tu as raison sur toute la ligne
les startdrawings a chaque boucle c'est parceque j'ai pas reflechi , quand je recherche je suis tres brouillon !! :D
je programme avec mes doigts pas ma tete ! :lol:

bon je clos ce topic !! c'etait une reflexion , je pensais avoir trouvé un truc interressant , mais en faite non !! Merci pour ton aide
:)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

moi tout ce qu'il me faudrait c'est deux fonctions suplémentaires...

DrawingOutput()
DrawingBufferSize()

Avec ca y'aurai plus de probleme ^^

Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Resultat = StartDrawing(OutputID)
c'est pas pareil ?

comprend pas tes commandes souhaitée :)
Paneric
Messages : 66
Inscription : dim. 25/janv./2004 19:03
Contact :

Message par Paneric »

et avec des pointeurs, ce ne serait pas plus rapide ?
Les instructions peek et poke sont très lente.

Paneric
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

nan moi je voudrais connaitre l'output de la surface de dessin en cours^^
comme je me suis pas documenté là dessus... je le remet juste à plus tard ^^

Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

si tu fait

Code : Tout sélectionner

  AdresseMemoire = DrawingBuffer(); recup l'adresse video  
apres un

Code : Tout sélectionner

StartDrawing( ScreenOutput())  
tu a l'adresse de debut de ta memoire ecran en cours .. :)

je te reposte ce que j'avais fait apres !!

Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
Declare plo(x,y,coul)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello") 
Global EcranX,EcranY 
WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)



Resultat = InitMouse()  
Repeat
   ExamineMouse() 
event=WindowEvent() 

couleur=$FFFF00

; ;avec ma fonction
StartDrawing( ScreenOutput())  
For y=0 To EcranY 
    For x=0 To EcranX 
         plo(x,y,couleur) ; appel de la procedure
    Next x 
     FlipBuffers(60):; affiche l'ecran
Next y
StopDrawing()
 
; ; avec plot
; StartDrawing( ScreenOutput())  
; For y=0 To EcranY 
;     For x=0 To EcranX 
;         event=WindowEvent() 
;         Plot(x,y,couleur) ; appel de la procedure
;     Next x 
;     FlipBuffers(85):; affiche l'ecran
; Next y
; StopDrawing() 

FlipBuffers():; affiche l'ecran
ClearScreen(0, 0, 0) :;efface l'ecran

Until event=#PB_Event_CloseWindow 



Procedure plo(x,y,coul)
    event=WindowEvent() 
    AdresseMemoire = DrawingBuffer(); recup l'adresse video  
    PokeL(AdresseMemoire+(x*4)+EcranX*(y*4),coul)
    ; on multiplie par 4 car nous somme en 32 bit 
    ;Box(105, 105,2, 2 ,RGB(255,255,255)) ; box de veriffication decalé expres de 1 pixel 
    
      
EndProcedure
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Le type à la guitarre a écrit :si tu fait

Code : Tout sélectionner

  AdresseMemoire = DrawingBuffer(); recup l'adresse video  
apres un

Code : Tout sélectionner

StartDrawing( ScreenOutput())  
tu a l'adresse de debut de ta memoire ecran en cours .. :)
t'inquiete pas pour moi ^^
ca fait partie des trucs ke je connais

j'en ai même eu besoin pour me faire une fonction point en assembleur
sans gestion des erreurs (la gestion se fait dans le reste du programme)

Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Dr. Dri a écrit : t'inquiete pas pour moi ^^
ca fait partie des trucs ke je connais
Dri

je ne m'inquiete pas pour le contenu de ton immense culture ,vu que j'ignore ce que tu connais, ou pas ; je te passe par defaut l'info donc je dispose , et que j'ai decouvert tres recement !! et donc je ne doutais pas un instant que tu puisse en faire bonne usage :D

vu que plus haut tu as ecrit
nan moi je voudrais connaitre l'output de la surface de dessin en cours^^
je pensai sans doute a tort que c'est l'info que tu recherchais , donc , il semble que ce ne soit pas le cas ! , par ce fait , j'aimerai bien savoir en des termes simples (pour mon cerveau) , ce que tu a sous-entendu par tes propos sus-cité ???
:D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah en fait le drawingbuffer c là où on dessine
j'ai jamais fait de test mais il me semble que ce n'est pas la meme valeur que l'output

par exemple si on veut dessiner une image soit meme à l'écran
on se met à dessiner à l'écran (startdrawing())
on récupere les pixels de l'image (startdrawing aussi)

là y'a conflit...

donc si je connaissai l'output voila ce que je pourrais faire...

Code : Tout sélectionner

procedure my_draw_image()

  ;si on est pas entrain de dessiner
  if drawingbuffer()=0
    procedurereturn
  endif

  ;je récupere l'output de là où l'utilisateur dessine
  output = drawingoutput()
  ;mais la fonction existe pas ^^

  ;j'arrete temporairement de dessiner
  stopdrawing()

  ;je récupere l'adresse de la mémoire vidéo de l'image
  startdrawing(imageoutput())
  image_buffer = drawingbuffer()
  stopdrawing()

  ;je me remet à dessiner grace à l'ouput ke j'ai récupérée
  startdrawing(output)

  ;boucle d'affichage de l'image
  ;sauf ke j'ai pas la hauteur de la surface de dessin pour
  ;pas sortir de la zone mémoire

endprocedure
voila en gros pourquoi j'aimerai ce genre de fonction...

Dri ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

si j'ai bien compris

la doc dit !!
AdresseMemoire = DrawingBuffer()
Description

Retourne l'adresse mémoire du buffer de dessin. Cela peut correspondre directement à la mémoire vidéo si la sortie est ScreenOutput() ou SpriteOutput()
donc dans le cas d'un precedent "ScreenOutput()" tu as bien l'adresse de base de la RAM Video ! ? :?

c'est un peut la difference qu'il y avait entre la memoire "graphique" et la memoire de l'ecran sur atari

ici il semble que ce soit pareil non ?
suivant le type de outpout (ScreenOutput() ou SpriteOutput())
la fonction "DrawingBuffer() " te renvoi soit une adresse de buffer graphique (SpriteOutput())) soit l'adresse de la VRAM (ScreenOutput())
(qui sur pc doit surement etre un buffer aussi a cause du multitache)
par contre existe t'il une adress base de "l'ecran'"<-- la VRAI ram video physique ??

dans le temps 'ere primaire' en stos on parlais de memoire physic (l'adresse de la ram video)
et de memoire logic (l'adresse d'un buffer)
cela avait le merite d'etre tres clair !!
la je sais pas , et je m'interroge , mais je suis pas sur de me repondre :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

oué maios j'ai bô récupérer l'adresse où je dois dessiner
il faut aussi ke je lance un startdrawing dans mon image
pour récuperer SON drawingbuffer, et là y'a conflit avec le startdrawing de l'écran

c'est là tout le prob ^^

Dri
Répondre