Display Sprite avec Ombre (1er resultat)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Display Sprite avec Ombre (1er resultat)

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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é
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 !! :)
Répondre