Buffer !! Besoin d’éclaircissement [Résolu]

Programmation avancée de jeux en PureBasic
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Buffer !! Besoin d’éclaircissement [Résolu]

Message par Mytic »

Bon… comme les commandes internes de dessin son pas aussi rapide que l’ont souhaite, je n’ai trouvé autre solution que d’utiliser le dessin directe sur buffer ! :?
Mais franchement je n’y connais rien dessus
Alors si quelqu’un voudrait bien m’expliquer son fonctionnement et me donner des exemples simplifiés de son utilisation, ça serait vraiment sympa de sa part.
Car dans l’exemple qu’on a avec l’aide de PureBasic , c’est très sombre surtout les *Line.Pixel ,(y’a pas de déclarations ?!!!!) :cry:
:!:
Dernière modification par Mytic le jeu. 02/août/2007 0:08, modifié 2 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

code
Anonyme

Message par Anonyme »

Ollivier a écrit :code
:?:
Bon… comme les commandes internes de dessin son pas aussi rapide que l’ont souhaite, je n’ai trouvé autre solution que d’utiliser le dessin directe sur buffer ! Mais franchement je n’y connais rien dessus
Alors si quelqu’un voudrait bien m’expliquer son fonctionnement et me donner des exemples simplifiés de son utilisation, ça serait vraiment sympa de sa part.
Car dans l’exemple qu’on a avec l’aide de PureBasic , c’est très sombre surtout les *Line.Pixel ,(y’a pas de déclarations ?!!!!)
est ce que tu sais utilisé les pointeurs ? si c'est le cas, regarde l'exemple fourni avec pb (plasma.pb) sinon cherche le post pixel effect qui doit être en post it.
sinon, je peut essayé de t'expliqué demain :D
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Merci <Cpl.Bator> ça serait vraiment aimable de ta part
Anonyme

Message par Anonyme »

ok, pour faire simple , après chaque appel de Startdrawing(screenoutput())
il faut récupérer l'adresse de l'écran avec DrawingBuffer()

ex:

Code : Tout sélectionner

StartDrawing(ScreenOutput())
  DB  = DrawingBuffer()
  DBP = DrawingBufferPixelFormat() 
DrawingBufferPixelFormat() te renvois le format de codage, c'est important si ton écran est en 32,16,24,8 bits... , la mémoire ne sera pas de la même taille.

Code : Tout sélectionner

  Select DBP
    Case #PB_PixelFormat_8Bits         : PF=1
    Case #PB_PixelFormat_15Bits        : PF=2
    Case #PB_PixelFormat_16Bits        : PF=2
    Case #PB_PixelFormat_24Bits_RGB    : PF=3
    Case #PB_PixelFormat_24Bits_BGR    : PF=3
    Case #PB_PixelFormat_32Bits_RGB    : PF=4
    Case #PB_PixelFormat_32Bits_BGR    : PF=4
  EndSelect 
Pour un écran en 32 bits , un pixel prend 4 octets , en 8 bits un octet ( ou un byte )
Ensuite comme nous disposont de l'adresse, du format, nous pouvons écrire sur l'écran via l'adresse avec pokel() :

PokeL(DB + (X * PF) + TAILLE_ECRAN_EN_X * ( Y * PF ) , Color )
ou
PokeL(DB + (x * PF) +DrawingBufferPitch()* ( Y ) , color )

X & Y represente les coordonées du pixel à afficher.
PF , c'est le format du pixel
TailleEcranenX , ben la variable parle d'elle même :D
color, remplace par rgb(r,g,b)

avec ca , tu devrais t'en sortir. :wink:
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message par Polux »

bien joué CPl :wink: pas mieux :wink:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je remplacerais TAILLE_ECRAN_EN_X par DrawingBufferPitch().
Selon la configuration de l'écran tu peux avoir TAILLE_ECRAN_EN_X différent de DrawingBufferPitch().
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Cpl.Bator a écrit : PokeL(DB + (X * PF) + TAILLE_ECRAN_EN_X * ( Y * PF ) , Color )

X & Y represente les coordonées du pixel à afficher.
PF , c'est le format du pixel
TailleEcranenX , ben la variable parle d'elle même :D
color, remplace par rgb(r,g,b)

avec ca , tu devrais t'en sortir. :wink:
j'utilisais ça moi c'est pas bon ?

Code : Tout sélectionner

adresse pixel= Drawingbuffer()+drawingbufferpitch()*y+x*codagepixel
??
8O

en tout cas Merci pour la demonstration tres formatrice :D
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Merci < Cpl.Bator> c’est vraiment sympa de ta part :D , enfin !!!!! je vais goûter à la vraie vitesse :wink:
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

Mes questions idiotes :

- Ca marche aussi avec un spriteOutput() à la place du screenOutput() ?
- Même si le sprite en question est en mode texture ?

(C'est pas que j'ai la flemme d'essayer, mais j'ai pas PB ici)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Une autre petite question, pourquoi j’ai un saut qui dépasse le pixel en Y ?

Code : Tout sélectionner

InitSprite()
OpenScreen(640,480,32,"")

StartDrawing(ScreenOutput())
  DB  = DrawingBuffer()
  DBP = DrawingBufferPixelFormat()
Color = RGB(0,255,0)

  Select DBP
    Case #PB_PixelFormat_8Bits         : PF=1
    Case #PB_PixelFormat_15Bits        : PF=2
    Case #PB_PixelFormat_16Bits        : PF=2
    Case #PB_PixelFormat_24Bits_RGB    : PF=3
    Case #PB_PixelFormat_24Bits_BGR    : PF=3
    Case #PB_PixelFormat_32Bits_RGB    : PF=4
    Case #PB_PixelFormat_32Bits_BGR    : PF=4
  EndSelect
  
  
For y = 0 To 100
For x = 0 To 100
;PokeL(DB + (X * PF) + TAILLE_ECRAN_EN_X * ( Y * PF ) , Color )
PokeL(DB + (X * PF) +DrawingBufferPitch() * ( Y * PF ) , Color ) 
Next x
Next y
StopDrawing()
FlipBuffers()
Delay(1000)
End
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Voilà j'ai trouvé la solution , il faut tout simplement enlever le PF dans ( Y * PF )

Code : Tout sélectionner

InitSprite()
OpenScreen(640,480,32,"")

StartDrawing(ScreenOutput())
  DB  = DrawingBuffer()
  DBP = DrawingBufferPixelFormat()
Color = RGB(0,255,0)

  Select DBP
    Case #PB_PixelFormat_8Bits         : PF=1
    Case #PB_PixelFormat_15Bits        : PF=2
    Case #PB_PixelFormat_16Bits        : PF=2
    Case #PB_PixelFormat_24Bits_RGB    : PF=3
    Case #PB_PixelFormat_24Bits_BGR    : PF=3
    Case #PB_PixelFormat_32Bits_RGB    : PF=4
    Case #PB_PixelFormat_32Bits_BGR    : PF=4
  EndSelect
 
 For y = 0 To 100
For x = 0 To 100
;PokeL(DB + (X * PF) + TAILLE_ECRAN_EN_X * ( Y * PF ) , Color )
PokeL(DB + (X * PF) +DrawingBufferPitch()* ( Y ) , Color )
Next x
Next y
StopDrawing()
FlipBuffers()
Delay(1000)
End 
Anonyme

Message par Anonyme »

PokeL(DB + (X * PF) +DrawingBufferPitch() * ( Y * PF ) , Color )
c'est pas bon, ca fait une ligne sur deux a cause du DrawingBufferPitch()
il faut faire pour ton exemple :
PokeL(DB + (X * PF) + 640 * ( Y * PF ) , Color )

Code : Tout sélectionner

- Ca marche aussi avec un spriteOutput() à la place du screenOutput() ?
- Même si le sprite en question est en mode texture ? 
- oui
- je pense que oui :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

.........
Répondre