Page 1 sur 2
Vidéo sur les sprites. Deuxième service!
Publié : ven. 10/déc./2004 16:36
par Chris
Ca y est, j'ai trouvé!!
J'ai réussi à lire une vidéo sur un sprite!
Chuis content, là
Code : Tout sélectionner
; Vidéo sur les sprites
;
#Window = 0
#Width = 700
#Height = 700
#Timer = 1
#Sprite = 0
#Sprite3D = 1
Global Film, Duree
Temps = 0
;- Initialisation de DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Erreur", "Impossible d'initialiser DirectX", #MB_ICONERROR)
End
EndIf
If InitMovie() =0
MessageRequester("Erreur", "Impossible d'initialiser l'environnement de lecture du film", #MB_ICONERROR)
End
EndIf
;- Chargement du film
Fichier$ = OpenFileRequester("Charger un film","","Fichier MPEG|*.mpg",0)
If Fichier$
Film = LoadMovie(#PB_Any, Fichier$)
Duree = MovieLength()/(MovieInfo(0)/1000)
Else
MessageRequester("Erreur","Le fichier est corrompu, ou ce format n'est pas pris en charge",#MB_ICONERROR)
EndIf
;- Procedures
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Static Temps
Select uMsg
Case #WM_TIMER
Select idEvent
Case 1
If Temps <= Duree
Temps = Temps + 1
Else
MovieSeek(0)
PlayMovie(Film, #PB_Movie_Rendered)
Temps = 0
EndIf
SetWindowTitle(#Window, "Durée = "+Str(Duree)+" secondes : Ecoulé = "+Str(Temps)+" seconde(s)")
EndSelect
EndSelect
EndProcedure
;- Ouverture de la fenêtre et de l'écran
hwnd = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "")
OpenWindowedScreen(hwnd, 0, 0, #Width, #Height, 0, 0, 0)
If CreateSprite(#Sprite, MovieWidth(), MovieHeight(), #PB_Sprite_Texture)
Id_Sprite3D = CreateSprite3D(#Sprite3D,#Sprite)
EndIf
PlayMovie(Film, #PB_Movie_Rendered)
x_Spr = WindowWidth()/2 - MovieWidth()/2
y_Spr = WindowHeight()/2 - MovieHeight()/2
;- Lancement du Timer, et début de la boucle
Timer = SetTimer_(hwnd, #Timer, 1000, @TimerProc())
Repeat
ClearScreen(0, 0, 0) : ExamineKeyboard()
Sprite3DQuality(1)
RenderMovieFrame(UseBuffer(#Sprite))
RotateSprite3D(#Sprite3D, 2, 1)
Start3D()
DisplaySprite3D(#Sprite3D,x_Spr, y_Spr)
Stop3D()
FlipBuffers()
If KeyboardPushed(#PB_Key_Escape)
FreeMovie(Film)
KillTimer_(hwnd,#Timer)
quit = 1
EndIf
While WindowEvent() : Wend
Until quit = 1
Utilisez un fichier *.mpg
Publié : ven. 10/déc./2004 21:27
par Chris
Une autre version, plus jolie.
Code : Tout sélectionner
; ================ Exemple de Vidéo sur les sprites ================
; = Auteur Chris : http://forum.purebasic.com =
; ==================================================================
;
If ExamineDesktops()
Width = DesktopWidth(0)
Height = DesktopHeight(0)
EndIf
Enumeration ;Sprites et Sprites 3D
#Sprite
#Sprite3D
#Sprite3D2
EndEnumeration
#Window = 0
#Timer = 1
Global Film, Duree, Ecoule
Temps = 0
;- Initialisation de DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Erreur", "Impossible d'initialiser DirectX", #MB_ICONERROR)
End
EndIf
If InitMovie() = 0
MessageRequester("Erreur", "Impossible d'initialiser l'environnement vidéo", #MB_ICONERROR)
End
EndIf
;- Chargement du film
Fichier$ = OpenFileRequester("Charger un film","","Fichier MPEG|*.mpg",0)
If Fichier$
Film = LoadMovie(#PB_Any, Fichier$)
If Film
Duree = MovieLength()/(MovieInfo(0)/1000)
Else
MessageRequester("Erreur","Le fichier est corrompu, ou ce format n'est pas pris en charge",#MB_ICONERROR)
EndIf
Else
End
EndIf
;- Procedures
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Static Temps
Select uMsg
Case #WM_TIMER
Select idEvent
Case 1
If Temps < Duree
Temps = Temps + 1
ElseIf Temps = Duree
Temps = 0
MovieSeek(0) : PlayMovie(Film, #PB_Movie_Rendered)
EndIf
Ecoule = Temps
EndSelect
EndSelect
EndProcedure
;- Ouverture de la fenêtre et de l'écran
hwnd = OpenWindow(#Window, 0, 0, Width, Height, #PB_Window_BorderLess | #PB_Window_ScreenCentered, "")
OpenWindowedScreen(hwnd, 0, 0, Width, Height, 0, 0, 0)
PlayMovie(Film, #PB_Movie_Rendered)
If CreateSprite(#Sprite, 150, 150, #PB_Sprite_Texture)
Id_Sprite3D = CreateSprite3D(#Sprite3D,#Sprite)
Id_Sprite3D2 = CreateSprite3D(#Sprite3D2,#Sprite)
EndIf
w_Film = SpriteWidth(#Sprite) : h_Film = SpriteHeight(#Sprite)
x_Spr1 = WindowWidth()/2 - MovieWidth()/2
y_Spr1 = WindowHeight()/2 - MovieHeight()/2
x_Spr2 = 0 : y_Spr2 = 0
angle = 5
OffsetX1 = 5 : OffsetY1 = 8
OffsetX2 = 11 : OffsetY2 = 5
;- Lancement du Timer, et début de la boucle
Timer = SetTimer_(hwnd, #Timer, 1000, @TimerProc())
Repeat
ClearScreen(0, 0, 0)
Sprite3DQuality(1)
RenderMovieFrame(UseBuffer(#Sprite))
RotateSprite3D(#Sprite3D, angle, 1)
Start3D()
DisplaySprite3D(#Sprite3D, x_Spr1, y_Spr1)
DisplaySprite3D(#Sprite3D2,x_Spr2, y_Spr2)
Stop3D()
x_Spr1 + OffsetX1 : y_Spr1 + OffsetY1
x_Spr2 + OffsetX2 : y_Spr2 + OffsetY2
If x_Spr1 <=0 Or x_Spr1 + w_Film >=Width
OffsetX1 = -OffsetX1 : angle = -angle
EndIf
If y_Spr1 <=0 Or y_Spr1 + h_Film >=Height
OffsetY1 = -OffsetY1 : angle = -angle
EndIf
If x_Spr2 <=0 Or x_Spr2+w_Film >=Width
OffsetX2 = -OffsetX2
EndIf
If y_Spr2 <=0 Or y_Spr2+h_Film >=Height
OffsetY2 = -OffsetY2
EndIf
StartDrawing(ScreenOutput())
DrawingMode(1) : FrontColor(128,128,128)
Locate(10,10) : DrawText("Durée = "+Str(Duree)+" secondes")
Locate(10,25) : DrawText("Ecoulé = "+Str(Ecoule)+" seconde(s)")
Locate(10,50) : DrawText("Escape pour quitter")
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
FreeMovie(Film)
KillTimer_(hwnd,#Timer)
quit = 1
EndIf
While WindowEvent() : Wend
Until quit = 1
Publié : ven. 10/déc./2004 22:24
par Le Soldat Inconnu
j'ai pas de MPEG pour tester, bouhouhou

Dès que je reçoit une conn...ie par mail avec un mpg, je le garde pour teser au lieu de le supprimer

Publié : ven. 10/déc./2004 22:28
par Chris
Publié : ven. 10/déc./2004 22:42
par Le Soldat Inconnu
Merci
Heu, tu n'as pas trouvé plus gros ?

9.6mo
Publié : ven. 10/déc./2004 22:48
par Chris
Ben...
Je peux te mettre un film complet, si tu veux.
J'ai Titanic, il fait un peu plus de trois heures, et un peu plus de 2 Go

Publié : ven. 10/déc./2004 23:02
par Le Soldat Inconnu
beurk (pour Titanic)
Sinon, c'est chouette, le résultat, mis à part la bande noire en haut et en bas du film qui rend pas bien car quand la couleur est RGB(0,0,0), on voit l'autre film qui passe dessous le premier par petit point.
Mais ça, on y peut pas grand chose
Publié : ven. 10/déc./2004 23:06
par Chris
Beurk quoi?
Titanic, ou la video sur les sprites?
Publié : ven. 10/déc./2004 23:09
par Le Soldat Inconnu
j'ai édité mon poste regarde, c'est bête d'écrire en même temps
Publié : ven. 10/déc./2004 23:14
par Chris
Oui, j'ai remarqué ça, quand il y a deux sprites qui se chevauchent et qu'ils contiennent du noir, le noir devient transparent et laisse passer le sprite du dessous.
Et ça fait pareil si tu affiches l'écran dans une autre couleur que le noir.
La couleur de l'écran passe à travers le sprite
En mettant un TransparentSpriteColor(#Sprite, 255,0,255) après la création du sprite, les points n'apparaissent plus.
Code : Tout sélectionner
If CreateSprite(#Sprite, 150, 150, #PB_Sprite_Texture)
TransparentSpriteColor(#Sprite, 255,0,255)
Id_Sprite3D = CreateSprite3D(#Sprite3D,#Sprite)
Id_Sprite3D2 = CreateSprite3D(#Sprite3D2,#Sprite)
EndIf
Publié : ven. 10/déc./2004 23:59
par Chris
Encore plus joli
Modifier la ligne 81 par :
Juste sous Repeat, mettre
Et dans les lignes qui inversent la direction du sprite 1, (108 et 111, en principe), ajouter
Moi, j'aime bien!

Publié : sam. 11/déc./2004 8:43
par Chris
J'ai refait mon premier exemple, en mettant des commentaires, et en utilisant uniquement les commandes de PureBasic.
Comme ça, il devrait être utilisable avec la version de démo.
Code : Tout sélectionner
;- =========== Lire une vidéo sur les Sprites et les Sprite3D =========== -;
;- -;
;- Auteur Chris : http://purebasic.hmt-forum.com -;
;- Librairies requises : Aucune -;
;- Utilise l'Api : Non -;
;- Version PB : 3.92 -;
;- Testé sur : Windows XP -;
;- ====================================================================== -;
;
;- Constantes
Enumeration ; Constantes fenêtres
#Window
EndEnumeration
Enumeration ; Constantes Sprites
#Sprite
#Sprite3D
EndEnumeration
#Width = 700 ; Largeur de la fenêtre
#Height = 700 ; Hauteur de la fenêtre
;- Variables
Temps = 0
;- Initialisation de DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Erreur", "Impossible d'initialiser DirectX", #MB_ICONERROR)
End
EndIf
If InitMovie() =0
MessageRequester("Erreur", "Impossible d'initialiser l'environnement de lecture du film", #MB_ICONERROR)
End
EndIf
;- Chargement du film
Fichier$ = OpenFileRequester("Charger un film","","Fichier MPEG|*.mpg",0)
If Fichier$
Film = LoadMovie(#PB_Any, Fichier$)
If Film
Duree = MovieLength()/(MovieInfo(0)/1000)
Else
MessageRequester("Erreur","Le fichier est corrompu, ou ce format n'est pas pris en charge",#MB_ICONERROR)
EndIf
Else
End
EndIf
;- Ouverture de la fenêtre et de l'écran
;/ Ouverture de la fenêtre
hwnd = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "")
;/ et ouverture de l'écran
OpenWindowedScreen(hwnd, 0, 0, #Width, #Height, 0, 0, 0)
;- Création du sprite 2D et du Sprite 3D
;/ Creation d'un sprite à la taille de la vidéo,
;/ et un sprite 3D basé sur ce sprite
If CreateSprite(#Sprite, MovieWidth(), MovieHeight(), #PB_Sprite_Texture)
;/ Définition d'une couleur de transparence.
;/ Dans une vidéo, il semblerait que 255,0,255 ne soit pas très fréquent.
TransparentSpriteColor(#Sprite, 255,0,255)
Id_Sprite3D = CreateSprite3D(#Sprite3D, #Sprite)
EndIf
;/ Calcul du centrage du sprite dans l'écran
x_Spr = WindowWidth()/2 - MovieWidth()/2
y_Spr = WindowHeight()/2 - MovieHeight()/2
;/ Création d'un timer : Initialisation
Start = ElapsedMilliseconds()
;/ Lancement de la vidéo
PlayMovie(Film, #PB_Movie_Rendered)
;- Début de la boucle
Repeat
;/ Effacement de l'écran, et définition de la qualité du sprite 3D
ClearScreen(24, 24, 24) : Sprite3DQuality(1)
;- Affichage de la durée et du temps écoulé
;/ Mise à jour du timer
If ElapsedMilliseconds() - Start >=1000
Temps + 1 : Start = ElapsedMilliseconds()
EndIf
;/ Affichage de la durée de la vidéo et du temps écoulé
StartDrawing(ScreenOutput())
DrawingMode(1) : FrontColor(128,128,128)
Locate(10,10) : DrawText("Durée : "+Str(Duree)+" Secondes")
Locate(10,25) : DrawText("Ecoulé : "+Str(Temps)+" secondes")
StopDrawing()
;/ Si le temps écoulé est égal à la longueur de la vidéo,
;/ on remet tout à 0, et on relance la vidéo depuis le début
If Temps >= Duree
Temps = 0 : PlayMovie(Film, #PB_Movie_Rendered)
EndIf
;- On peut afficher le sprite 2D, ou le sprite 3D, ou bien les deux ensemble
;- Apparement, il faut afficher les sprites 2D en premier
;/ Affichage du sprite 2D
DisplaySprite(#Sprite,#Width - MovieWidth(),0)
;- Diffusion de la vidéo sur le sprite 3D
;/ Lancement de la diffusion de la vidéo sur le sprite 3D
RenderMovieFrame(UseBuffer(#Sprite))
;/ On peut appliquer les effets que l'on veut: Ici, une rotation
RotateSprite3D(#Sprite3D, 2, 1)
;/ Affichage du sprite 3D
Start3D()
DisplaySprite3D(#Sprite3D,x_Spr, y_Spr)
Stop3D()
;/ Inversion des tampons d'affichage
FlipBuffers()
;/ Examen de la touche Escape pour quitter
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
FreeMovie(Film)
quit = 1
EndIf
;/ Gestion des évènement de la fenêtre : Inutile en mode Plein Ecran
While WindowEvent() : Wend
Until quit = 1
Publié : sam. 11/déc./2004 9:13
par comtois
j'ai le son , mais pas l'image
et au bout d'un moment , le prog ne répond plus.
Qu'est-ce qu'il me manque sur le pc ? un codec quelconque ?
pourtant j'arrive à lire ton film avec le lecteur de windows.
Publié : sam. 11/déc./2004 9:32
par Chris
Alors là...
Aucune idée.
Surtout si tu arrives à lire le film avec le lecteur de window, je ne vois pas ce qui peut poser un problème.
Tu n'as pas un autre film en *.mpg, pour essayer?
Publié : sam. 11/déc./2004 9:48
par comtois
ben en fait , j'avais commencé à tester avec d'autres films , et je n'avais pas d'image non plus .
Alors quand tu as proposé un film , je me suis dit , avec celui là , ça devrait être bon , il est homologué par Chris !!
Ben non , c'est toujours pas bon ...