Page 1 sur 1

Buffer supplémentaire

Publié : mar. 30/août/2005 10:08
par bombseb
Bonjour,

J'aimerais avoir un buffer supplémentaire pour y mettre un logo afin d'utiliser le buffer invisible de l'écran pour afficher le logo déformé et pour pouvoir faire un flipbuffers apres... est-ce que vous savez comment faire svp ?

Publié : mar. 30/août/2005 11:16
par bombseb
c'est bon j'ai trouvé comment faire... je passe par un tableau de variables

Publié : mar. 30/août/2005 12:23
par bombseb
mais je ne sais pas si c'est mieux de passer par une zone mémoire / pointeur
quelqu'un peut me dire ?

Publié : mar. 30/août/2005 20:40
par fweil
Si tu passes par un tableau, l'indiçage x, y est facile, c'est le compilateur qui se débrouille pour calculer l'adresse.

Si tu utilises un buffer, il faut que tu calcules toi même les pointeurs pour associer un mot de 32 bits, par exemple, à une coordonnée x, y de l'image.

En général quand on cherche à optimiser les performances, l'utilisation d'un buffer est plus rapide, on peut gagner une ou deux instructions machine par itération lors du remplissage du buffer par rapport à un tableau. Mais cela peut aussi poser des problèmes inattendus.

Disons que l'utilisation d'un tableau est plus directement applicable pour transformer ou intervenir sur copie d'une image.

Publié : mar. 30/août/2005 22:46
par Backup
une solution consiste a utiliser les sprites !

tu dessine sur un sprite de la taille de l'ecran pendant que tu en montre un autre !
en purebasic c'est la solution la plus evidente , puisque l'on peut utiliser les sprites a la place de l'ecran !! et en plus c'est tres rapide ! ... :)

ou bien une image :

Code : Tout sélectionner

 LoadFont(1, "arial", 50 )
LoadFont(2, "arial", 50 )
UseFont(1)
Resultat = InitSprite()
Global Angle,amplitude
amplitude=10
Texte.s="Le Lac d'annecy !"





WindowID = OpenWindow(1, 50, 50, 640, 200,  #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  , "hello")
WindowID = WindowID(1)
OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)

CreateImage(100, 640, 100)
StartDrawing( ImageOutput())
FrontColor($0,$FF,$FF)
BackColor(0, 0, 0)

UseFont(1)
DrawingFont(FontID())
DrawingMode(1)
Locate(0, 0)
DrawText(Texte.s)
StopDrawing()

For t=0 To 100
    GrabImage(100, t, 0, t, 640,1)
Next t
   
Repeat
    
    For y= 0 To 100 
        
        StartDrawing( ScreenOutput())
        UseFont(2)
        DrawingFont(FontID())
        DrawingMode(1)
        
        FrontColor($95,$25,$BA)
        BackColor(0, 0, 0)
        Locate(40, 0)
        DrawText(Texte.s)
        
        
        
        
        angle+1 :If angle=360*10: angle=0 :EndIf
        x=1+(Sin(angle*2*3.1415926/50)* amplitude)
        DrawImage( UseImage(y), x+40, y+20*x/25+50,640,1)
        StopDrawing()
        dep+1 :If dep>640 :dep=-100:EndIf
        
    Next y
    
    
    FlipBuffers(50)
    
    ClearScreen(0, 0, 0)
    Event=WindowEvent()
    Delay(1)
    
    
Until Event=#PB_Event_CloseWindow



Publié : mer. 31/août/2005 7:42
par bombseb
hum interressant tout ca...

les sprites j'ai pas encore trop testé...mais c'est pas bête faut que je teste ca...

Publié : lun. 12/sept./2005 13:45
par bombseb
Dobro, ta technique est vraiment bien seulement on ne peut pas utiliser de grabsprite sur un sprite...
comment tu ferais toi pour avoir un 2eme buffer graphique invisible sur lequel toutes les fonctions (2D, fonctions de sprites) seraient disponibles ??

Publié : lun. 12/sept./2005 13:48
par Dr. Dri
avec UseBuffer(#Sprite) tu peux pas faire un grab sur le sprite #Sprite ? (j'ai pas testé)

Dri

Publié : lun. 12/sept./2005 13:57
par bombseb
ah bon ??
alors je vais tester ca tout de suite car je suis vraiment bloqué là....

Publié : lun. 12/sept./2005 15:08
par bombseb
je viens de tester ceci avec ta technique du usebuffer(#sprite) et la réaction est vraiment bizarre...

Code : Tout sélectionner

If InitSprite () = 0 
  MessageRequester ("Erreur", "Impossible d'initialiser directx", #PB_MessageRequester_Ok) 
  End 
EndIf 

; ---------- Mode fenetré ---------- 

; -------- Fenêtre principale -------- 
#WindowWidth    = 400 
#WindowHeight   = 300 
hWnd = OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "YEAH !") 
If hWnd = 0 
  MessageRequester ("Erreur", "Impossible d'ouvrir l'écran", #PB_MessageRequester_Ok) 
  End 
EndIf 

If OpenWindowedScreen(hWnd, 0, 0, #WindowWidth, #WindowHeight, 1, 0, 0) = 0 
  MessageRequester ("Erreur", "Impossible d'ouvrir l'écran", #PB_MessageRequester_Ok) 
  End 
EndIf 
; ------------------------------------ 

UsePNGImageDecoder()


ClearScreen(0,0,0) 

If LoadSprite (1, "purebasiclogonew.png") = 0 
  MessageRequester ("Erreur", "Le sprite n'a pas pu etre chargé !") 
  End 
EndIf 

UseBuffer(1) 
GrabSprite (2, 0, 0,100,100) 
UseBuffer(-1) 

DisplaySprite(2,1,1) 
FlipBuffers() 


Repeat 
  ExamineKeyboard () 
Until KeyboardPushed (#PB_Key_Escape) Or WindowEvent() = #PB_Event_CloseWindow 

End 


en gros je load un sprite, j'en capture une petite partie avec un grabsprite puis j'affiche cette partie dans le buffer, puis flipbuffers()

c'est normal cette réaction ????!! j'ai oublié quelque chose ??

EDIT : correction du code

Publié : lun. 12/sept./2005 15:11
par Dr. Dri
startdrawing sans stopdrawing, utilisation de sprites pendant un drawing, un code comme ca espère même pas ke je le teste...

Dri

Publié : lun. 12/sept./2005 16:37
par bombseb
8O

oh merde

j'ai fait ca vite fait au boulot car c'était bientôt l'heure de partir.... je vais corriger ca...

Publié : lun. 12/sept./2005 16:44
par bombseb
c'est bon j'ai corrigé mon code et là ca marche !!!

cooool enfin

Publié : lun. 12/sept./2005 17:21
par Dr. Dri
bah voila...
suffisait de potasser la doc

Dri

Publié : lun. 12/sept./2005 18:06
par bombseb
non c'est juste que j'avais fais ca en speed au boulot...donc j'ai pas trop pris le temps de réfléchir :oops:

voilà maintenant je vais pouvoir faire mon starwars scroller demain au boulot :D