Page 1 sur 1

La galère des réglages des couleurs de sprites

Publié : sam. 22/nov./2025 21:45
par SPH
Salut a toutes et a tous,

Depuis les quelques dernières versions de PureBasic, il y a eu des changements dans les sprites niveau alpha.
Personnellement, je n'y comprend rien du tout.

Voici un code qui affiche 5 grosses billes (qui devraient être rouges) et 5 billes plus petites (qui devraient être vertes). Hors, je ne comprend pas comment régler leurs couleurs. La seule chose qui marche, c'est que la couleur noire est transparente.

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; debut du code : le 10 novembre 2025
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

InitSprite()
InitKeyboard()

ExamineDesktops()
drx = DesktopWidth(0)
dry = DesktopHeight(0)

OpenScreen(drx,dry,32,"Sprite")

;Création du sprite
CreateSprite(1,drx,dry)
StartDrawing(SpriteOutput(1))
r=Random(55)
v=Random(55)
b=Random(55)
r2=Random(1)*2-1
v2=Random(1)*4-2
b2=Random(1)*6-3

For i=0 To dry
  LineXY(0,i,drx,i,RGB(r,v,b))
  r+r2
  If r>100 Or r<0
    r2*-1
    r+r2
  EndIf
  v+v2
  If v>100 Or v<0
    v2*-1
    v+v2
  EndIf
  b+b2
  If b>100 Or b<0
    b2*-1
    b+b2
  EndIf
Next
StopDrawing()

;;;;;;;;;;;
CreateSprite(0,drx,dry,#PB_Sprite_AlphaBlending | #PB_Sprite_Transparent )
StartDrawing(SpriteOutput(0))
DrawingMode( #PB_2DDrawing_AlphaBlend )      
For i=1 To 100
  a=Random(drx)
  b=400+Random(dry)
  c=Random(drx)
  d=400+Random(dry)  
  LineXY(a,b,c,d,RGBA(1+Random(254),Random(255),Random(255),255))  
  LineXY(a,b+1,c,d+1,RGBA(1+Random(254),Random(255),Random(255),255))  
Next
LineXY(0,0,60,dry,RGBA(255,255,255,255))
LineXY(drx,0,drx-60,dry,RGBA(255,255,255,255))

LineXY(10,200,500,230,RGBA(255,255,255,255))
LineXY(512,230,800,180,RGBA(255,255,255,255))
LineXY(0,dry-30,drx,dry-30,RGBA(255,255,255,255))

StopDrawing()

;;;;;;;;;;;
CreateSprite(2,11,11,#PB_Sprite_AlphaBlending | #PB_Sprite_Transparent )
StartDrawing(SpriteOutput(2))
DrawingMode(#PB_2DDrawing_Gradient | #PB_2DDrawing_AlphaBlend )      
Circle(5,5,5,RGBA(255,0,0,255))
StopDrawing()

;;;;;;;;;;;

StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Gradient | #PB_2DDrawing_AlphaBlend )      
Circle(5,7,3,RGBA(0,255,0,255))
StopDrawing()
GrabSprite(3,0,0,11,11, #PB_Sprite_AlphaBlending)

;Affichage du sprite

;DisplayTransparentSprite(0, 0, 0)

;FlipBuffers()
;Delay(2400)



;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;
;ClearScreen(0)
;DisplayTransparentSprite(0, 0, 0)

Dim p.b(drx,dry)

StartDrawing(SpriteOutput(0))
For i=0 To drx-1
  For u=0 To dry-1
    If Point(i,u)<>0
      p(i,u)=1
    EndIf
    
  Next
Next
StopDrawing()

TempsDepart.q = ElapsedMilliseconds()  ; Récupère la valeur actuelle


; StartDrawing(ScreenOutput())
; For i=0 To 1919
;   For u=0 To 1079
;     If P(i,u)<>0
;       Plot(i,u,RGB(255,255,255))
;     EndIf
;     
;   Next
; Next
; StopDrawing()


DisplayTransparentSprite(0, 0, 0)


TempsEcoule.q = ElapsedMilliseconds()-TempsDepart  ; La valeur 'TempsEcoule' devrait être d'environ 1000 millisecondes 
                                                   ;  Debug "Temps écoulé : "+Str(TempsEcoule)+" millisecondes" 

;FlipBuffers()
;Delay(1000)



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; D E B U T ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmb_de_bestioles=10
Dim lax(cmb_de_bestioles)
Dim lay(cmb_de_bestioles)
Dim sens(cmb_de_bestioles)
For i=1 To cmb_de_bestioles
  lax(i)=Random(500)+400
  lay(i)=Random(100)+10
  sens(i)=Random(1)*2-1
Next

;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;               G   O
;;;

Repeat
  DisplaySprite(1,0,0)
  DisplayTransparentSprite(0, 0, 0)
  
  For u=1 To cmb_de_bestioles
    laz.b=0
    For i=1 To 3
      
      flag.b=0
      For o=-5 To 5
        If p(lax(u)+o,lay(u)+1)=0
          flag+1
        EndIf
        
      Next
      If flag=11
        lay(u)+1
      Else
        laz=1:Goto la1
      EndIf
    Next
    ;;;
    
    la1:
    If laz=1 ; si on est sur du sol
      flag2.b=0
      escalier.b=0
      For o=0 To 10
        If p(lax(u)+5*sens(u),lay(u)-o)=0
          flag2+1
        Else
          escalier=o
        EndIf
      Next
      
      If flag2=11 ; si on peux avancer
        lax(u)+sens(u)
      Else
        If escalier<=1
          lax(u)+sens(u)
          lay(u)-escalier
        Else
          sens(u)*-1
        EndIf
      EndIf
    EndIf
    
    If u<6
    DisplayTransparentSprite(2, lax(u)-5,lay(u)-10)
  Else
    DisplayTransparentSprite(3, lax(u)-5,lay(u)-10)
  EndIf
  
  Next u
  
  FlipBuffers()
  ;Delay(1)
  
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)


Re: La galère des réglages des couleurs de sprites

Publié : dim. 23/nov./2025 1:10
par MetalOS
Le problème vient du DrawingMode en mode dégradé (#PB_2DDrawing_Gradient) qui ignore la couleur passée à Circle() tant qu’on ne définit pas de vrai gradient.

J'ai fait simple : pas de gradient, juste de l’alpha.

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; debut du code : le 10 novembre 2025
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

InitSprite()
InitKeyboard()

ExamineDesktops()
drx = DesktopWidth(0)
dry = DesktopHeight(0)

OpenScreen(drx,dry,32,"Sprite")

;Création du sprite de fond
CreateSprite(1,drx,dry)
StartDrawing(SpriteOutput(1))
r=Random(55)
v=Random(55)
b=Random(55)
r2=Random(1)*2-1
v2=Random(1)*4-2
b2=Random(1)*6-3

For i=0 To dry
  LineXY(0,i,drx,i,RGB(r,v,b))
  r+r2
  If r>100 Or r<0
    r2*-1
    r+r2
  EndIf
  v+v2
  If v>100 Or v<0
    v2*-1
    v+v2
  EndIf
  b+b2
  If b>100 Or b<0
    b2*-1
    b+b2
  EndIf
Next
StopDrawing()

;;;;;;;;;;;
; Sprite "relief" (traits)
CreateSprite(0,drx,dry,#PB_Sprite_AlphaBlending | #PB_Sprite_Transparent )
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
For i=1 To 100
  a=Random(drx)
  b=400+Random(dry)
  c=Random(drx)
  d=400+Random(dry)  
  LineXY(a,b,c,d,RGBA(1+Random(254),Random(255),Random(255),255))  
  LineXY(a,b+1,c,d+1,RGBA(1+Random(254),Random(255),Random(255),255))  
Next
LineXY(0,0,60,dry,RGBA(255,255,255,255))
LineXY(drx,0,drx-60,dry,RGBA(255,255,255,255))

LineXY(10,200,500,230,RGBA(255,255,255,255))
LineXY(512,230,800,180,RGBA(255,255,255,255))
LineXY(0,dry-30,drx,dry-30,RGBA(255,255,255,255))

StopDrawing()

;;;;;;;;;;;
; *** GROSSE BILLE ROUGE (sprite 2) ***
CreateSprite(2,11,11,#PB_Sprite_AlphaBlending | #PB_Sprite_Transparent )
StartDrawing(SpriteOutput(2))
; On efface le sprite en transparent
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,11,11,RGBA(0,0,0,0))
; On dessine la bille en rouge (opaque)
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(5,5,5,RGBA(255,0,0,255))   ; 🔴 grosse rouge
StopDrawing()

;;;;;;;;;;;
; *** PETITE BILLE VERTE (sprite 3) ***
CreateSprite(3,11,11,#PB_Sprite_AlphaBlending | #PB_Sprite_Transparent )
StartDrawing(SpriteOutput(3))
; On efface le sprite en transparent
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,11,11,RGBA(0,0,0,0))
; On dessine la bille en vert (plus petite)
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(5,5,3,RGBA(0,255,0,255))   ; 🟢 petite verte
StopDrawing()

;--- Calcul du "sol" dans p() -------------------------------------------

Dim p.b(drx,dry)

StartDrawing(SpriteOutput(0))
For i=0 To drx-1
  For u=0 To dry-1
    If Point(i,u)<>0
      p(i,u)=1
    EndIf
  Next
Next
StopDrawing()

DisplayTransparentSprite(0, 0, 0)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                       D E B U T   L O G I Q U E
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmb_de_bestioles=10
Dim lax(cmb_de_bestioles)
Dim lay(cmb_de_bestioles)
Dim sens(cmb_de_bestioles)

For i=1 To cmb_de_bestioles
  lax(i)=Random(500)+400
  lay(i)=Random(100)+10
  sens(i)=Random(1)*2-1
Next

;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;               G   O
;;;

Repeat
  DisplaySprite(1,0,0)
  DisplayTransparentSprite(0, 0, 0)
  
  For u=1 To cmb_de_bestioles
    laz.b=0
    For i=1 To 3
      
      flag.b=0
      For o=-5 To 5
        If p(lax(u)+o,lay(u)+1)=0
          flag+1
        EndIf
      Next
      
      If flag=11
        lay(u)+1
      Else
        laz=1:Goto la1
      EndIf
    Next
    
    la1:
    If laz=1 ; si on est sur du sol
      flag2.b=0
      escalier.b=0
      For o=0 To 10
        If p(lax(u)+5*sens(u),lay(u)-o)=0
          flag2+1
        Else
          escalier=o
        EndIf
      Next
      
      If flag2=11 ; si on peut avancer
        lax(u)+sens(u)
      Else
        If escalier<=1
          lax(u)+sens(u)
          lay(u)-escalier
        Else
          sens(u)*-1
        EndIf
      EndIf
    EndIf
    
    ; AFFICHAGE :
    If u<6
      DisplayTransparentSprite(2, lax(u)-5,lay(u)-10) ; 🔴 grosses rouges
    Else
      DisplayTransparentSprite(3, lax(u)-5,lay(u)-10) ; 🟢 petites vertes
    EndIf
  
  Next u
  
  FlipBuffers()
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

Re: La galère des réglages des couleurs de sprites

Publié : dim. 23/nov./2025 10:24
par SPH
Grand merci MetalOS.

En plus, tu as commenté toutes les parties de mon code pour le comprendre. C'est moi qui aurait dut le faire.

Tout fonctionne et je vais essayer d'apprendre par coeur le cheminement qui fait que ca marche.


Une chose importante : j'avais codé la creation de la petite bille verte avec un grabsprite....

Code : Tout sélectionner

StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Gradient | #PB_2DDrawing_AlphaBlend )      
Circle(5,7,3,RGBA(0,255,0,255))
StopDrawing()
GrabSprite(3,0,0,11,11, #PB_Sprite_AlphaBlending)
Je l'avais fait exprès car mon projet prend les sprites d'une feuille de sprites. Donc, il "grab" les sprites et donc, j'aurais voulu savoir comment régler les couleurs dans ce cas précis.

Je vais essayer d'utiliser la technique de la grosse bille rouge sur le grab de la petite bille verte.

Grand merci :idea:

Re: La galère des réglages des couleurs de sprites

Publié : dim. 23/nov./2025 12:10
par MetalOS
De rien :D

Re: La galère des réglages des couleurs de sprites

Publié : dim. 23/nov./2025 17:41
par SPH
MetalOS a écrit : dim. 23/nov./2025 12:10De rien :D
Si : d'un code :wink: