Quelle alternative pour la fonction Usebuffer() ?[Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Quelle alternative pour la fonction Usebuffer() ?[Résolu]

Message par Huitbit »

Hello,
Je reformule une question posée précedemment :
http://www.purebasic.fr/french/viewtopi ... =1&t=10287

J'ai vu, chez les voisins, que cette question commence à fatiguer :lol:
http://www.purebasic.fr/english/viewtop ... it=sokoban

Ca ne me pose aucun problème de mettre "directx7" dans les options du compilateur.
Je trouve la fonction Usebuffer() très pratique (création d'un sprite à partir d'autres, modification d'un sprite dans la boucle principale).

Si un jour on doit faire sans, y a-t-il aussi efficace ou mieux comme fonction ?

Il y a un exemple dans le premier lien, au lieu d'afficher des milliers de sprites, je change le décor uniquement où il se passe quelque chose (le CPU apprécie beaucoup :P ).

Exemple de petit code où j'utilise des sprites pour créer le décor (Ne pas oublier de mettre directx7 dans les options du compilateur!):
Comment faire sans Usebuffer()?
Une fois le programme lancé, comment modifier le sprite "décor" en direct ?
(N.B Je ne souhaite pas passer par la bibliothèque "Image" :mrgreen: )

Code : Tout sélectionner

;tuiles
;pb v4.41
;*********************************
#largeur_ecran=800
#hauteur_ecran=600
#spr_herbe=0
#spr_mur=1
#spr_decor=2

Dim carte.b(7,5)

Restore carte
For y=0 To 5
  For x=0 To 7
    Read.b type_tuile
    carte(x,y)=type_tuile
  Next x
Next y

InitSprite()
InitKeyboard()

OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"tuiles",#PB_Window_ScreenCentered|#PB_Window_SystemMenu  )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)

CreateSprite(#spr_herbe,100,100)
StartDrawing(SpriteOutput(#spr_herbe))
Box(2,2,96,96,RGB(0,255,0))
StopDrawing()

CreateSprite(#spr_mur,100,100)
StartDrawing(SpriteOutput(#spr_mur))
Box(2,2,96,96,RGB(0,128,128))
StopDrawing()

CreateSprite(#spr_decor,#largeur_ecran,#hauteur_ecran)
;-utilisation de Usebuffer() 
;-sans oublier 
;-de choisir directx7
;-dans les options du compilateur
UseBuffer(#spr_decor)
For y=0 To 5
  For x=0 To 7
    DisplaySprite(carte(x,y),x*100,y*100)
  Next x
Next y
UseBuffer(#PB_Default)

Repeat
  FlipBuffers() 
  DisplaySprite(#spr_decor,0,0)
  Delay(10)
Until WindowEvent() = #PB_Event_CloseWindow  

DataSection
carte:
Data.b 1,1,1,1,1,1,1,1
Data.b 1,0,0,0,0,0,0,1
Data.b 1,0,1,0,0,0,0,1
Data.b 1,0,0,0,0,1,0,1
Data.b 1,0,0,0,0,0,0,1
Data.b 1,1,1,1,1,1,1,1
EndDataSection
Merci d'avance

Hasta la vista !
Dernière modification par Huitbit le dim. 14/mars/2010 20:32, modifié 1 fois.
Elevé au MSX !
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Quelle alternative pour la fonction Usebuffer() ?

Message par G-Rom »

Bonjour HuitBit ,

j'efface l'écran (clearscreen())
je dessine
je "grabe" (grabsprite())

très efficace.

Code : Tout sélectionner

;tuiles
;pb v4.41
;*********************************
#largeur_ecran=800
#hauteur_ecran=600
#spr_herbe=0
#spr_mur=1
#spr_decor=2

Dim carte.b(7,5)

Restore carte
For y=0 To 5
  For x=0 To 7
    Read.b type_tuile
    carte(x,y)=type_tuile
  Next x
Next y

InitSprite()
InitKeyboard()

OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"tuiles",#PB_Window_ScreenCentered|#PB_Window_SystemMenu  )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)

CreateSprite(#spr_herbe,100,100)
StartDrawing(SpriteOutput(#spr_herbe))
Box(2,2,96,96,RGB(0,255,0))
StopDrawing()

CreateSprite(#spr_mur,100,100)
StartDrawing(SpriteOutput(#spr_mur))
Box(2,2,96,96,RGB(0,128,128))
StopDrawing()

; CreateSprite(#spr_decor,#largeur_ecran,#hauteur_ecran)
;-utilisation de Usebuffer()
;-sans oublier
;-de choisir directx7
;-dans les options du compilateur
; UseBuffer(#spr_decor)
ClearScreen(0)
For y=0 To 5
  For x=0 To 7
    DisplaySprite(carte(x,y),x*100,y*100)
  Next x
Next y
GrabSprite(#spr_decor,0,0,#largeur_ecran,#hauteur_ecran)

; UseBuffer(#PB_Default)

Repeat
  FlipBuffers()
  DisplaySprite(#spr_decor,0,0)
  Delay(10)
Until WindowEvent() = #PB_Event_CloseWindow 

DataSection
carte:
Data.b 1,1,1,1,1,1,1,1
Data.b 1,0,0,0,0,0,0,1
Data.b 1,0,1,0,0,0,0,1
Data.b 1,0,0,0,0,1,0,1
Data.b 1,0,0,0,0,0,0,1
Data.b 1,1,1,1,1,1,1,1
EndDataSection
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Quelle alternative pour la fonction Usebuffer() ?

Message par Huitbit »

Un grand merci !
(et bienvenu chez toi :wink: )

J'avais oublié grabsprite().

Je vais pouvoir me débarrasser de cette phrase en rouge "n'oubliez pas .....directx7....options du compilateur !"
En plus, grabsprite() donne accès à des options supplémentaires :P
0 : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
#PB_Sprite_Memory : Le sprite est chargé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
#PB_Sprite_Alpha : Le sprite est au format 8 bits (256 couleurs) en niveau de gris utilisé par DisplayAlphaSprite(), DisplayShadowSprite() ou DisplaySolidSprite()
#PB_Sprite_Texture : Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la bibliothèque Sprite3D.
Je mettrai ça en application dans la prochaine mise à jour de mon mini moteur de boulderdash(pour les gros éboulements ce n'est pas encore au point !).

Hasta la vista !
Elevé au MSX !
Répondre