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é!! :lol:
J'ai réussi à lire une vidéo sur un sprite!

Chuis content, là 8)

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 :lol:
Dès que je reçoit une conn...ie par mail avec un mpg, je le garde pour teser au lieu de le supprimer :wink:

Publié : ven. 10/déc./2004 22:28
par Chris
J'en ai mis un à cette adresse :
http://www.cgsoftwares.com/PureBasic/PrgForum/Film.zip

Au cas ou... :lol:

Publié : ven. 10/déc./2004 22:42
par Le Soldat Inconnu
Merci

Heu, tu n'as pas trouvé plus gros ? :mrgreen: 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 :lol:

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 :lol:

Modifier la ligne 81 par :

Code : Tout sélectionner

angle.f = 0
Juste sous Repeat, mettre

Code : Tout sélectionner

angle + 0.5
If angle > 359 : angle = 0 : EndIf
Et dans les lignes qui inversent la direction du sprite 1, (108 et 111, en principe), ajouter

Code : Tout sélectionner

angle = -angle
Moi, j'aime bien! :lol:

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 ...