Page 1 sur 1

[Résolu] DisplaySprite3D : pb transprance

Publié : dim. 02/nov./2008 18:52
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

Publié : dim. 02/nov./2008 18:54
par Anonyme
as tu mis les flags :

Code : Tout sélectionner

#PB_Sprite_Texture | #PB_Sprite_AlphaBlending 

Publié : dim. 02/nov./2008 20:05
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()

Publié : dim. 02/nov./2008 21:14
par Anonyme
les sprites 3D ne fonctionne toujours pas sous linux :/

Publié : dim. 02/nov./2008 23:13
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?

Publié : lun. 03/nov./2008 1:53
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 ^ ^

Publié : lun. 03/nov./2008 16:31
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
;}