Page 1 sur 1

Display Sprite avec Ombre (1er resultat)

Publié : dim. 12/sept./2004 6:48
par Thyphoon
voici une procedure qui permet de faire des sprites qui inclu une transparence ainsi qu'une ombre avec dégradé voilà un exemple de sprite
Image

le pb dans mon truc c'est comment faire un truc du genre
"if couleur est de tendance violet" je suis sur qu'il y a une solution qui eviterait ce if avec plein de Or. Si quelqu'un a une idée ... qu'il n'hesite pas !
Mais en attendant voilà le code

A savoir : Soit un sprite 0 qui est le fond et le sprite 600 un sprite temporaire.
No: numero du sprite
X: coordonée X
Y: Coordonée Y
Bon le code est brut il peu surment être optimisé

Code : Tout sélectionner

Procedure Special(No.l,X,Y)
  z=CopySprite(No,600,0)
  For v = 0 To SpriteHeight(600)-1 
    For u = 0 To (SpriteWidth(600) - 1 )
      StartDrawing(SpriteOutput(0))
        Coul1 = Point(u+X, v+Y) 
        StopDrawing()
      StartDrawing(SpriteOutput(600))
        Coul2 = Point(u, v)
        r1=Red(Coul1):v1=Green(Coul1):b1=Blue(Coul1)
        r2=Red(Coul2):v2=Green(Coul2):b2=Blue(Coul2) 
        If r2=255 And v2=0 And b2=255 ; si couleur transparente
        r3=r2:v3=v2:b3=b2
      ElseIf  Coul2=RGB(255,255,255) Or Coul2=RGB(255,239,255) Or Coul2=RGB(255,222,247) Or Coul2=RGB(255,206,247) Or Coul2=RGB(255,189,239) Or Coul2=RGB(255,173,239) Or Coul2=RGB(255,156,231) Or Coul2=RGB(255,140,231) Or Coul2=RGB(255,123,222) Or Coul2=RGB(255,107,222) Or Coul2=RGB(255,90,214) Or Coul2=RGB(255,74,214) Or Coul2=RGB(255,57,206) Or Coul2=RGB(255,41,206) Or Coul2=RGB(255,24,198) Or Coul2=RGB(255,8,198) Or Coul2=RGB(198,0,148) Or Coul2=RGB(181,0,132) Or Coul2=RGB(214,0,156) Or Coul2=RGB(165,0,123) Or Coul2=RGB(148,0,107) Or Coul2=RGB(115,0,82) Or Coul2=RGB(99,0,74) Or Coul2=RGB(82,0,57) Or Coul2=RGB(49,0,33) Or Coul2=RGB(66,0,49) ; bon là faut simplifier en gros dégradé de couleur violet
      fondu=Int((r2+v2+b2)/3)
      fondu=255-fondu-50
      If fondu<0:fondu=0:EndIf
        r3=Int((r1-fondu))
        v3=Int((v1-fondu))
        b3=Int((b1-fondu))
      Else
        r3=r2:v3=v2:b3=b2
      EndIf 
      Plot(u,v,RGB(r3,v3,b3)) 
    StopDrawing()  
    Next
  Next
  DisplaySprite(600,X,Y)
EndProcedure

Publié : dim. 12/sept./2004 13:00
par Le Soldat Inconnu
il suffit de calculer la composante la plus claire possible

toutes les couleurs de ton dégradé doivent avoir la même composante de base

exemple :
- on prend la couleur RGB(125, 200, 50)
- on cherche la composante la plus claire de ta couleur, ici 200 (le vert)
- on fait le rapport par rapport à 255 : Rapport = 255 / 200
- on multiplie les autres composante par ce rapport
125 * Rapport et 50 * Rapport
- et voilà, on a la composante la plus claire du dégradé

Publié : lun. 13/sept./2004 20:36
par Thyphoon
Merci soldat inconnu !! :o)
Je me suis inspirré de ton truc pour refaire une nouvelle procedure
Bon je m'explique
cette fonction permet d'afficher un sprite avec transparence mais aussi avec différent degré de transparence !
la couleur de transparence est
R=255
V=degré de transparance ! (0 a 255)
B=255
-------------------------------------------
No le numero du sprite qu'on veut afficher
X: coordonnée X
Y: coordonnée Y
fond= n° du sprite qui fait le fond sur quel on veut afficher le sprite
Voilà dite moi ce que vous en pensez ? et si vous avez des idées d'optimisation ou d'amélioration n'hesitez pas a sous mettre

Code : Tout sélectionner

Procedure Special(No.l,X,Y,fond.l)
  fond=fond-1
  CopySprite(No,600,0)
  For v = 0 To SpriteHeight(600)-1 
    For u = 0 To (SpriteWidth(600) - 1 )
      StartDrawing(SpriteOutput(Spritecalque(fond)))

      Coul1 = Point(u+X, v+Y) 
      StopDrawing()
      StartDrawing(SpriteOutput(600))
      Coul2 = Point(u, v)
      r1=Red(Coul1):v1=Green(Coul1):b1=Blue(Coul1)
      r2=Red(Coul2):v2=Green(Coul2):b2=Blue(Coul2) 
      If r2=255 And b2=255
      fondu=255-v2
      If fondu<0:fondu=0:EndIf

      If r1=255 And v1=0 And b1=255
        r3=255:v3=0:b3=255
      Else

        r3=Int((r1-fondu))
        v3=Int((v1-fondu))
        b3=Int((b1-fondu))
        If r3<0 :r3=0:EndIf
        If v3<0 :v3=0:EndIf
        If b3<0 :b3=0:EndIf
      EndIf
      Else
       r3=r2:v3=v2:b3=b2
      EndIf 
      
      Plot(u,v,RGB(r3,v3,b3)) 
      
      StopDrawing() 
      
    Next
  Next
  Debug(coucou)
   DisplayTransparentSprite(600,X,Y)
 EndProcedure

Publié : lun. 13/sept./2004 21:18
par Le Soldat Inconnu

Code : Tout sélectionner

Procedure Special(No.l,X,Y,fond.l) 
  fond=fond-1 
  CopySprite(No,600,0) 
  For v = 0 To SpriteHeight(600)-1 
    For u = 0 To (SpriteWidth(600) - 1 ) 
      StartDrawing(SpriteOutput(Spritecalque(fond))) 

      Coul1 = Point(u+X, v+Y) 
      StopDrawing() 
      StartDrawing(SpriteOutput(600)) 
      Coul2 = Point(u, v) 
      r2=Red(Coul2):b2=Blue(Coul2) 
      If r2=255 And b2=255 
        v2=255 - Green(Coul2)
        r1=Red(Coul1):v1=Green(Coul1):b1=Blue(Coul1) 

        r3=Int(r1*v2/255) 
        v3=Int(v1*v2/255)
        b3=Int(b1*v2/255)

        Plot(u,v,RGB(r3,v3,b3)) 
      Else 
       Plot(u,v,RGB(r2,v2,b2)) 
      EndIf 
      
      StopDrawing() 
      
    Next 
  Next 
  Debug(coucou) 
   DisplayTransparentSprite(600,X,Y) 
 EndProcedure

Publié : mar. 14/sept./2004 7:33
par Thyphoon
Merci LSI (Le Soldat Inconnu)!! :o) ! En tout je suis assez contant cette fonction marche vraiment bien J'aurais peut être quelques améliorations a faire ...si ça marche je posterais ça ici !! :)