[Résolu] DisplaySprite3D : pb transprance
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
[Résolu] DisplaySprite3D : pb transprance
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
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
as tu mis les flags :
Code : Tout sélectionner
#PB_Sprite_Texture | #PB_Sprite_AlphaBlending
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
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...
normalement ca doit fonctionner
a toi d'indiquer la couleur qui doit être transparente ^ ^
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)
a toi d'indiquer la couleur qui doit être transparente ^ ^
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Code : Tout sélectionner
TransparentSpriteColor(#PB_Default, $FF00FF)
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]