lightening, alpha et couleur, l'horreur totale

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

lightening, alpha et couleur, l'horreur totale

Message par Crystal Noir »

Salut tous :)

Bon je post ici au lieu de poluer un autre post dont ce n'est pas le sujet.

Bien, j'essais de faire une petite adaptation d'un code que j'avais refait en blitzmax.

Seulement je suis étonné que ce soit aussi galère en pure (alors que c'est archi simple en blitzmax).

L'algo lui fonctionne sur les deux ce n'est pas trop le problème.

Mon problème vient du rendu.

Ce que je veux c'est un rendu lightening avec gestion de l'alpha et des couleurs.

En fait j'ai une image en PNG qui est un flare pour faire un feu d'artifice.

Dans Bmax, je dis bon, je le veux en lightening, avec tel couleur et je veux que la transparence diminue à chaque tour (fondu en somme).

Ca c'est simple à faire il suffit de trois instructions.

Dans pure c'est pas tout à fait le cas j'ai l'impression :D

En fait sous les conseils de quelques un ici j'ai utiliser Sprite3DBlendingMode(7,2) pour le lightening.

D'accord ca marche le problème c'est que la gestion transparence n'est plus.

Donc j'ai essayé Sprite3DBlendingMode(5,7). La c'est déjà mieux...

Bon ok maintenant dernier soucis : comment j'fais moi pour mettre de la couleur à mon flare ?

Car le blanc c'est chouette mais pour un feu du 14 juillet, ca fait un peu pauvre non :D

Idem dans bmax, une instruction toute conne : setcolor.

Dans pure : prout ! et vu que j'utilise Sprite3D ca n'arrange pas l'affaire.

Il doit bien y avoir une astuce ?

Savez vous laquelle ?

merci d'avance :)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

moi et la 3D :? c'est juste pour te faire coucou Image
Image
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Bah en fait ce sont des sprites 2D :)

j'ai trouvé ca http://www.purebasic.fr/french/viewtopi ... pbsprite3d

Mais j'y trouve gros quand même d'avoir à faire tout ce bazar pour afficher un simple sprite alpha avec une couleur alors que sur d'autres langage une seule instruction suffit, pas besoin de s'embêter à faire 36 trucs.

J'sais pas trop.

Et coucou Flype :)
Dernière modification par Crystal Noir le mar. 17/juil./2007 15:23, modifié 1 fois.
Anonyme

Message par Anonyme »

au pire , tu charge un png avec un fond transparent, puis tu joue sur la couleur avec la méthode montré plus haut.

Code : Tout sélectionner

(#pb_sprite_texture | #pb_sprite_alphablending)
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

oui de faire comme dans le post que je vous ai montré là.

mais bon c'est pas top. Ecrire 36 lignes juste pour un effet comme cela...bof en plus en prenant le meme algo et en comparant sur les deux langages, pure pinaille.

J'ai l'impression que c'est pas trop son truc Sprite3D lol on arrive certes à faire de belles démos j'ai l'impression mais quelle galère...

j'vais tout de même essayer, mais j'ai déjà gratter un peu avec le code que j'ai mis plus haut en lien, ca marche pas lol, je dois vraiment être crétin.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Bon ya pas moyen, je dois être con je sais pas c'est ingolable :( arf, quel bazar pour juste avoir de la couleur sur un flare (sprite3d)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Peut-être qu'une ou deux macros à faire te feront oublier ce petit cauchemar :D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

N'existe-t-il pas une ou deux lib facilitant sous PB ce genre de prog.. ?
Force et sagesse...
Anonyme

Message par Anonyme »

envois moi tout , code + medias , je te sortirais un truc potable
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

C'est super gentil mais ce qui m'interesse c'est de comprendre comment on fait.

Alors la rigueur j'veux bien un exemple tout bête avec un flare (sprite3D) qui peut changer de couleur.

Maintenant si faut 36 instructions, je trouve pas cela très "optimisé" je veux dire ca pourrait sous pure se traduire par une instruction toute bête....A voir.

Le code j'peux le filer c'est pas un problème c'est juste qu'un truc tout pondu, j'vais pas forcément comprendre, je préfère adapter c'est plus instructif :)

mais si t'as un ex tout bête comme j'ai décris là un peu plus haut je suis preneur !
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Bon voilà je vous file le code que j'ai fait, si quelqu'un peut me dire comment faire en sorte que mes flare puisse prendre une couleur différente à chaque pet je suis preneur.

L'algo fonctionne à merveille, seulement impossible de trouver comment gérer cette couleur.

Voici : http://crystalnoir.free.fr/Creations/temp/Artifice.zip

Merci d'avance pour votre aide
Anonyme

Message par Anonyme »

Code : Tout sélectionner

  Structure   vertex
    sx.f
    sy.f
    sz.f
    rhw.f
    Color.l
    specular.l
    tu.f
    tv.f
  EndStructure
  
  Structure PB_Sprite3D
    Texture.l
    Vertice.vertex[4]
    Width.w
    Height.w
  EndStructure

  
  
  
  Procedure RGBA( Red , Green , Blue ,Alpha)
    ProcedureReturn RGB ( Blue , Green , Red ) + Alpha << 24
  EndProcedure
  

;Initialisation des composants
UsePNGImageDecoder()


;Initialisation Graphique
If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Direct3D system can't be initialized correctly", 0)
  End
EndIf

Fenetre = OpenScreen(800, 600, 32, "Sprite")


;Constantes et variables
#Feu = 0
#Feu3D = 1

Global Vitesse.f = 0.1
Global parax.f
Global paray.f
Global paraz.f
Global coulr.f
Global coulg.f
Global coulb.f
Global Angle1.f
Global Angle2.f

Global switch = 0
Global NbFeu = 300




;Chargement des images
MonFeu = LoadSprite(#Feu,"flare2.png",#PB_Sprite_Texture)
MonFeu3D = CreateSprite3D(#Feu3D,#Feu)
Sprite3DQuality(1)


;Définition de la structure et de la liste


Structure FeuArtifice
  x.f
  y.f
  z.f
  vy.f
  xd.f
  yd.f
  zd.f
  r.f
  g.f
  b.f
  Alpha.f
EndStructure

Global NewList Pouf.FeuArtifice()


;Procédure du programme


Procedure NewFeu()
  AddElement(Pouf())
  
  Angle1 = Random(360)
  Angle2 = Random(360)
  Vitesse = 0.1
  
  Pouf()\x = parax
  Pouf()\y = paray
  Pouf()\z = paraz
  Pouf()\r = coulr
  Pouf()\g = coulg
  Pouf()\b = coulb
  
  Pouf()\xd = Cos(Angle1) * Cos(Angle2) * Vitesse
  Pouf()\yd = Cos(Angle1) * Sin(Angle2) * Vitesse
  Pouf()\zd = Sin(Angle1) * Vitesse
  
  Pouf()\Alpha = 255.0
EndProcedure

Procedure AfficheFeu()

  If Pouf()\Alpha > 0
    Pouf()\x = Pouf()\x + Pouf()\xd * 10.0
    Pouf()\y = Pouf()\y + Pouf()\yd * 10.0
    Pouf()\z = Pouf()\z + Pouf()\zd * 10.0
    Pouf()\y = Pouf()\y + Pouf()\vy
    Pouf()\vy = Pouf()\vy + 0.02
    
    posx.f = (800/2) + ((Pouf()\x / Pouf()\z) * 500)
    posy.f = (600/2) + ((Pouf()\y / Pouf()\z) * 500)
    
    
    
    Pouf()\Alpha = Pouf()\Alpha - 2.0

    If Pouf()\Alpha < 0
      Pouf()\Alpha = 0
    EndIf
    Start3D()
    Sprite3DBlendingMode(5,7)
    ZoomSprite3D(#Feu3D,(139*8)/Pouf()\z,(143*8)/Pouf()\z)
    *S.PB_Sprite3D = IsSprite3D(#Feu3D)
    
    
    For v = 0 To 3
      *S\Vertice[v]\Color = RGBA(Pouf()\r,Pouf()\g,Pouf()\b,255)
    Next
    
    DisplaySprite3D(#Feu3D,posx,posy,Pouf()\Alpha)
    Sprite3DBlendingMode(5,6)
    Stop3D()
  Else
    DeleteElement(Pouf())
  EndIf
EndProcedure



Dim Couleur(5)

Couleur(0) = RGB(255,0,0)
Couleur(1) = RGB(0,255,0)
Couleur(2) = RGB(0,0,255)
Couleur(3) = RGB(64,128,255)
Couleur(4) = RGB(255,128,64)
Couleur(5) = RGB(255,64,128)






;Boucle Principale
Repeat
  ExamineKeyboard()
  FlipBuffers()
  ClearScreen(RGB(0,0,0))

  If Temps = 0
    parax = Random(200) - 100
    paray = Random(200) - 100
    paraz = 200
    
    Color =  Random(5)
    coulr = Red(Couleur(Color))
    coulg = Green(Couleur(Color))
    coulb = Blue(Couleur(Color))
    

    
    If switch = 0
      Temps = 40
    EndIf
    
    For i = 1 To NbFeu
      NewFeu()
    Next
  EndIf
  
  ResetList(Pouf())
  While NextElement(Pouf())
    AfficheFeu()
  Wend
  

  
  Temps = Temps - 1
Until KeyboardPushed(#PB_Key_Escape)

:wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

une autre soluce conciste a fabriquer ses propres sprite
comme ça tu met les couleur que tu veux :D

Code : Tout sélectionner



;Initialisation des composants
UsePNGImageDecoder()


;Initialisation Graphique
If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Direct3D system can't be initialized correctly", 0)
  End
EndIf

Fenetre = OpenScreen(800, 600, 32, "Sprite")


;Constantes et variables
#Feu = 0
#Feu3D = 1

Global vitesse.f = 0.1
Global parax.f
Global paray.f
Global paraz.f
Global coulr.f
Global coulg.f
Global coulb.f
Global Angle1.f
Global Angle2.f

Global switch = 0
Global NbFeu = 300



;Chargement des images
MonFeu = LoadSprite(#Feu,"flare2.png",#PB_Sprite_Texture)

For i=1 To 100
    RandomSeed(ElapsedMilliseconds())
    CreateSprite(i,128,128,#PB_Sprite_Texture)
    StartDrawing(SpriteOutput(i))  
        cr=Random(254)+1:  cv=Random(254)+1:  cv=Random(254)+1 
        Circle(64, 64, 64, RGB(cr,cv,cb))  
        StopDrawing()  
         MonFeu3D = CreateSprite3D(i,i)
Next i


Sprite3DQuality(1)


;Définition de la structure et de la liste


Structure FeuArtifice
  x.f
  Y.f
  z.f
  vy.f
  xd.f
  yd.f
  zd.f
  r.f
  g.f
  b.f
  Alpha.f
EndStructure

Global NewList Pouf.FeuArtifice()


;Procédure du programme


Procedure NewFeu()
  AddElement(Pouf())
  
  Angle1 = Random(360)
  Angle2 = Random(360)
  vitesse = 0.1
  
  Pouf()\x = parax
  Pouf()\Y = paray
  Pouf()\z = paraz
  Pouf()\r = coulr
  Pouf()\g = coulg
  Pouf()\b = coulb
  
  Pouf()\xd = Cos(Angle1) * Cos(Angle2) * vitesse
  Pouf()\yd = Cos(Angle1) * Sin(Angle2) * vitesse
  Pouf()\zd = Sin(Angle1) * vitesse
  
  Pouf()\Alpha = 255.0
EndProcedure

Procedure AfficheFeu(i)

  If Pouf()\Alpha > 0
    Pouf()\x = Pouf()\x + Pouf()\xd * 10.0
    Pouf()\Y = Pouf()\Y + Pouf()\yd * 10.0
    Pouf()\z = Pouf()\z + Pouf()\zd * 10.0
    Pouf()\Y = Pouf()\Y + Pouf()\vy
    Pouf()\vy = Pouf()\vy + 0.02
    
    posx.f = (800/2) + ((Pouf()\x / Pouf()\z) * 500)
    posy.f = (600/2) + ((Pouf()\Y / Pouf()\z) * 500)
    
    Pouf()\Alpha = Pouf()\Alpha - 2.0

    If Pouf()\Alpha < 0
      Pouf()\Alpha = 0
    EndIf
    Start3D()  
    Sprite3DBlendingMode(5,7)
    ZoomSprite3D(i,(139*8)/Pouf()\z,(143*8)/Pouf()\z)
    DisplaySprite3D(i,posx,posy,Pouf()\Alpha)
    Sprite3DBlendingMode(5,6)

    Stop3D()
  Else
    DeleteElement(Pouf())
  EndIf
EndProcedure


;Boucle Principale
Repeat
  ExamineKeyboard()
  FlipBuffers()
  ClearScreen(RGB(0,0,0))

  If Temps = 0
    parax = Random(200) - 100
    paray = Random(200) - 100
    paraz = 200
    coulr = Random(255)
    coulg = Random(255)
    coulb = Random(255)
    If switch = 0
      Temps = 80
    EndIf
    
    For i = 1 To NbFeu
      NewFeu()
Next i
 i=Random(99)+1
  EndIf
  
  ResetList(Pouf()) 
  While NextElement(Pouf())
    AfficheFeu(i)
  Wend
  

  
  Temps = Temps - 1

Until KeyboardPushed(#PB_Key_Escape)
; IDE Options = PureBasic v4.02 (Windows - x86)
; CursorPosition = 61
; FirstLine = 45
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

J'ai rien compris au code de Cpl Bator lol

oui dobro mais un flare c'est tellement plus joli qu'un cercle :)
Anonyme

Message par Anonyme »

J'ai rien compris au code de Cpl Bator lol
C'est ton code :?
Répondre