[Résolu] DisplaySprite3D : pb transprance

Généralités sur la programmation 3D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

[Résolu] DisplaySprite3D : pb transprance

Message par Le Soldat Inconnu »

Voila,

j'utilise displaysprite3D pour afficher des images avec un effet de fondu
mon souci est que cette fonction considère le noir comme totalement transparent
donc mon effet de fondu avec une image qui comporte du noir donne un truc tout moche.

Je souhaite que DisplaySprite3D ne prenne pas le noir comme couleur transparente, comme je change ça, j'ai pas trouvé

merci
Dernière modification par Le Soldat Inconnu le lun. 03/nov./2008 16:33, modifié 1 fois.
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)]
Anonyme

Message par Anonyme »

as tu mis les flags :

Code : Tout sélectionner

#PB_Sprite_Texture | #PB_Sprite_AlphaBlending 
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

marche pas avec ces 2 tags, le sprite est créer a partir d'une image que je modifie.

voila le code :

il faut mettre des images dans le même dossier que le code, de préférence des images avec du noir pour voir le problème

Code : Tout sélectionner

Structure Structure_Image
  Memoire.l
  Image.l
  sprite.l
  Sprite3D.l
  Fichier.s
  x.l
  y.l
EndStructure

Global NewList Image.Structure_Image()
Global Ecran_X, Ecran_Y

UseJPEGImageDecoder()

Procedure Charger(Numero.l)
  SelectElement(Image(), Numero)
  
  If Image()\Memoire = 0
    If ReadFile(0, Image()\Fichier)
      Longueur.q = Lof(0)
      Image()\Memoire = AllocateMemory(Longueur)
      ReadData(0, Image()\Memoire, Longueur)
      CloseFile(0)
    EndIf
  EndIf
  If IsSprite(Image()\sprite) = 0
    Image()\Image = CatchImage(#PB_Any, Image()\Memoire)
    ; ResizeImage(Image()\Image, Ecran_X, Ecran_Y)
    Image()\x = (Ecran_X - ImageWidth(Image()\Image)) / 2
    Image()\y = (Ecran_Y - ImageHeight(Image()\Image)) / 2
    Image()\sprite = CreateSprite(#PB_Any, Ecran_X, Ecran_Y, #PB_Sprite_Texture)
    If StartDrawing(SpriteOutput(Image()\sprite))
        Box(0, 0, Ecran_X, Ecran_Y, $010000)
        DrawImage(ImageID(Image()\Image), Image()\x, Image()\y)
      StopDrawing()
    EndIf
    FreeImage(Image()\Image)
    Image()\Sprite3D = CreateSprite3D(#PB_Any, Image()\sprite)
    
  EndIf
  
EndProcedure
Procedure DeCharger(Numero.l)
  SelectElement(Image(), Numero)
  
  If IsSprite(Image()\sprite)
    FreeSprite3D(Image()\Sprite3D)
    FreeSprite(Image()\sprite)
  EndIf
  
EndProcedure

Procedure Liberer()
  ForEach Image()
    If Image()\Memoire
      FreeMemory(Image()\Memoire)
    EndIf
    If IsSprite(Image()\sprite)
      FreeSprite3D(Image()\Sprite3D)
      FreeSprite(Image()\sprite)
    EndIf
  Next
EndProcedure

Procedure Image_Chercher(Dossier.s)
  If Right(Dossier, 1) <> "\"
    Dossier + "\"
  EndIf

  If ExamineDirectory(0, Dossier, "*.jpg")
    ClearList(Image())
    
    While NextDirectoryEntry(0)
      AddElement(Image())
      Image()\Fichier = Dossier + DirectoryEntryName(0)
    Wend
    
    SortStructuredList(Image(), 2, OffsetOf(Structure_Image\Fichier), #PB_Sort_String)
    
    FinishDirectory(0)
  EndIf
EndProcedure





 Image_Chercher(GetCurrentDirectory())

If ExamineDesktops()
  Ecran_X = DesktopWidth(0)
  Ecran_Y = DesktopHeight(0)
  Ecran_F = DesktopFrequency(0)
  Ecran_D = DesktopDepth(0)
Else
  MessageRequester("Photos veille", "Impossible d'examiner la configurationa ctuelle de l'écran.", 0)
  End
EndIf

; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
  MessageRequester("Photos veille", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
  End
EndIf

SetRefreshRate(Ecran_F)
If OpenScreen(Ecran_X, Ecran_Y, Ecran_D, "Photos veille") = 0
  MessageRequester("Photos veille", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

Souris_X_Mem = Ecran_X / 2
Souris_Y_Mem = Ecran_Y / 2
MouseLocate(Souris_X_Mem, Souris_Y_Mem)

Temps_Image = 2500
Temps_Effet = 1000
Temps_Memoire = ElapsedMilliseconds()

Image = 0
Charger(Image)

Repeat
  
  ClearScreen($010000)
  
  ; On lit les évènements clavier et souris
  ExamineMouse()
  ExamineKeyboard()
  
  ; Position de la souris
  Souris_X = MouseX()
  Souris_Y = MouseY()
  
  Temps_Systeme = ElapsedMilliseconds()
  
  If Start3D()
      
    If Effet = 0
      
      If Temps_Systeme - Temps_Memoire > Temps_Image
        
        ; Nouvelle image
        Image_Nouvelle = Image + 1
        If Image_Nouvelle >= CountList(Image())
          Image_Nouvelle = 0
        EndIf
        Charger(Image_Nouvelle)
        
        ; Choix de l'effet
        Effet = 1
        
        ; Préparation de l'effet
        Effet_Fin = 0
        Select Effet
          Case 1 ; Effet de fondu
            Effet_Transparence.f = 0
            Effet_Transparence_Pas.f = 255 * Temps_Effet / Ecran_F / 1000
            
        EndSelect
        
      EndIf
      
      SelectElement(Image(), Image)
      DisplaySprite3D(Image()\Sprite3D, 0, 0)
      
    Else
      
      Select Effet
        Case 1 ; Effet de fondu
          Effet_Transparence + Effet_Transparence_Pas
          If Effet_Transparence >= 255
            Effet_Fin = 1
            Effet_Transparence = 255
          EndIf
          SelectElement(Image(), Image)
          DisplaySprite3D(Image()\Sprite3D, 0, 0)
          SelectElement(Image(), Image_Nouvelle)
          DisplaySprite3D(Image()\Sprite3D, 0, 0, Effet_Transparence)
          
          
      EndSelect
      
      If Effet_Fin
        DeCharger(Image)
        Temps_Memoire = Temps_Systeme
        Effet = 0
        Image = Image_Nouvelle
      EndIf
      
    EndIf
  
    Stop3D()
  EndIf
  
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape) Or IsScreenActive() = 0 Or Abs(Souris_X - Souris_X_Mem) > 50 Or Abs(Souris_Y - Souris_Y_Mem) > 50

Liberer()
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)]
Anonyme

Message par Anonyme »

les sprites 3D ne fonctionne toujours pas sous linux :/
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Avec les sprites 3d, tu peux utiliser une couche alpha, qui rendra ton sprite transparent quelle que soit sa couleur. C'est ce que tu veux faire?
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

il suffit d'ajouter un transparentspritecolor juste apres le createsprite qui sert de départ au sprite3D

par exemple pour avoir la couleur fushia transparente...

Code : Tout sélectionner

Image()\sprite = CreateSprite(#PB_Any, Ecran_X, Ecran_Y, #PB_Sprite_Texture) 
TransparentSpriteColor(Image()\sprite,$ff00ff)
normalement ca doit fonctionner

a toi d'indiquer la couleur qui doit être transparente ^ ^
ImageImage
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

TransparentSpriteColor(#PB_Default, $FF00FF)
ca marche avec ça effectivement et j'y pige plus rien. je l'avais essayé hier sans succès.
Bref, tant mieux, ca marche ... je sais pas ce que j'ai foutu.

j'avais fait ca pour transformer tout les points noirs $000000 en points un poil bleu $010000 pour ne plus avoir de soucis
voici le code si ca peut intéresser qlq'un :
le code est super rapide

Code : Tout sélectionner

Image = CatchImage(#PB_Any, ....)

;{ Traitement anti point noir
Protected bmi.BITMAPINFO, bm.BITMAP, hdc
GetObject_(ImageID(Image), SizeOf(BITMAP), @bm.BITMAP)
    
Dim ImageBits.l(bm\bmWidth * bm\bmHeight - 1)
hdc = CreateCompatibleDC_(GetDC_(ImageID(Image)))
If hdc
  
  bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth = bm\bmWidth
  bmi\bmiHeader\biHeight = bm\bmHeight
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  GetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, @ImageBits(), @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
  
  For x = 0 To bm\bmWidth * bm\bmHeight - 1
    If ImageBits(x) = 0
      ImageBits(x) = 1
    EndIf
  Next
  
  SetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, @ImageBits(), @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
  DeleteDC_(hdc)
EndIf
;}
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)]
Répondre