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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 5002
Inscription : mer. 09/nov./2005 9:53

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

Message 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)


!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
MetalOS
Messages : 1518
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

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

Message 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)
Avatar de l’utilisateur
SPH
Messages : 5002
Inscription : mer. 09/nov./2005 9:53

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

Message 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:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
MetalOS
Messages : 1518
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

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

Message par MetalOS »

De rien :D
Avatar de l’utilisateur
SPH
Messages : 5002
Inscription : mer. 09/nov./2005 9:53

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

Message par SPH »

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre