Appliquer rapidement un filtre de couleur sur un sprite

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Appliquer rapidement un filtre de couleur sur un sprite

Message par DjPoke »

Bonsoir tout le monde

J'aurais besoin de votre aide pour savoir comment je peux m'y prendre pour rendre ce code beaucoup plus rapide.
Le principe est de filtrer les couleurs de quelques sprites une fois de temps à autre par rapport à un sprite de base que je clone.
Il y a aussi un assez gros sprite qui me sert de Tileset, ce qui ralentis l'ensemble des traitements que je fais à presque 1 seconde.

Voici le source de mes fonctions, pour l'instant :

Code : Tout sélectionner

; * retourne la valeur la plus petite des deux *
Procedure.l min(a.l ,b.l)
  If a <= b
    ProcedureReturn a
  EndIf
  ProcedureReturn b
EndProcedure

; * Appliquer un effet nuit bleutée à un sprite *
Procedure ApplyNight(spr.l)
  
  StartDrawing(SpriteOutput(spr))
  DrawingMode(#PB_2DDrawing_AllChannels)
  For y.l = 0 To SpriteHeight(spr) - 1
    For x.l = 0 To SpriteWidth(spr) - 1
      col.l = Point(x, y)
      moy.f = Int((Red(col) + Green(col) + Blue(col)) / 3)
      Plot(x, y, RGBA(moy * 0.35, moy * 0.5, moy, Alpha(col)))
    Next
  Next
  StopDrawing()
  
EndProcedure


; * Appliquer une ombre à une sprite *
Procedure ApplyCloudColor(spr.l)
  
  StartDrawing(SpriteOutput(spr))
  DrawingMode(#PB_2DDrawing_AllChannels)
  For y.l = 0 To SpriteHeight(spr) - 1
    For x.l = 0 To SpriteWidth(spr) - 1
      col.l = Point(x, y)
      r.l = min((Red(col) * 0.9 * 1.3), 255)
      g.l = min((Green(col) * 0.7 * 1.3), 255)
      b.l = min((Blue(col) * 0.8 * 1.3), 255)
      Plot(x, y, RGBA(r, g, b, Alpha(col)))
    Next
  Next
  StopDrawing()
  
EndProcedure

; * Redefinir la couleur d'un sprite *
Procedure ApplyColor(spr.l, r.l, g.l, b.l)
  
  StartDrawing(SpriteOutput(spr))
  DrawingMode(#PB_2DDrawing_AllChannels)
  For y.l = 0 To SpriteHeight(spr) - 1
    For x.l = 0 To SpriteWidth(spr) - 1
      col.l = Point(x, y)
      Plot(x, y, RGBA(r, g, b, Alpha(col)))
    Next
  Next
  StopDrawing()
  
EndProcedure
Merci d'avance de votre aide, j'ai vraiment besoin de vous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Appliquer rapidement un filtre de couleur sur un sprite

Message par djes »

C'est très simple, tu le fais avant ta boucle principale, en début de programme, en créant un nouveau sprite. Sinon tu peux aussi créer un sprite transparent à superposer sur les autres et qui fera le même effet, mais en temps réel.
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Re: Appliquer rapidement un filtre de couleur sur un sprite

Message par DjPoke »

Merci djes, mais je suis absolument contraint de bosser dans la boucle principale. De plus, je ne peux pas superposer une image dessus en temps réel car je dois pouvoir faire toute une transition entre des couleurs de jour et des couleurs de nuit.
A moins que je fasse un tas d'images déjà pré-calculées, mais je préfère éviter cette solution pour l'instant.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Appliquer rapidement un filtre de couleur sur un sprite

Message par djes »

En superposant trois sprites colorés, un pour le rouge, un pour le vert, un pour le bleu, et en faisant varier leur alpha, tu obtiendras l'effet voulu en temps réel sur l'ensemble de l'image.
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Re: Appliquer rapidement un filtre de couleur sur un sprite

Message par DjPoke »

Ok, demain j'essaierai. ^^

EDIT: Merci beaucoup, ça marche impeccable. :-)
Répondre