Re: IsMovie() nicht "bulletproof"?
Verfasst: 11.09.2009 01:44
Hier eine lauffähige Kurzversion:
Als "Movie" können auch BMPs oder JPGs geladen werden.
Code: Alles auswählen
If InitSprite() = 0
End
Else
If InitSprite3D() = 0
End
EndIf
EndIf
If InitMovie() = 0
End
EndIf
wIDscrn.l = OpenWindow(#PB_Any, 10, 10, 640, 480, "Test")
OpenWindowedScreen(WindowID(wIDscrn), 0, 0, 640, 480, 1, 0, 0)
sID2d = CreateSprite(#PB_Any, 640, 480, #PB_Sprite_Texture) ;Img-Sprite erzeugen
sID3d = CreateSprite3D(#PB_Any, sID2d)
ZoomSprite3D(sID3d, 640, 480) ;Größe auf Screen anpassen
Sprite3DQuality(#PB_Sprite3D_BilinearFiltering) ;bilineare Filterung für 3D-Sprites aktivieren
movfile.s = OpenFileRequester("Movie", "*.*", "*.*", 0)
mID = LoadMovie(#PB_Any, movfile)
xs = MovieWidth(mID)
ys = MovieHeight(mID)
msID = CreateSprite(#PB_Any, xs, ys) ;Render-Movie-Sprite
MovieAudio(mID, 50, 0)
PlayMovie(mID, #PB_Movie_Rendered) ;Movie-Rendern auf Sprite starten
tfps = ElapsedMilliseconds()
Repeat
Repeat
EventID.l = WindowEvent()
If EventID = #PB_Event_CloseWindow ;Fenster schließen
If IsMovie(mID) ;wenn Movie vorhanden
Debug "Movie free"
FreeMovie(mID) ;<= hier IMA, wenn Movie als gültig geladen aber nicht lauffähig
FreeSprite(msID)
EndIf
movfile.s = OpenFileRequester("neues Movie laden, Abbrechen mit Cancel", "*.*", "*.*", 0)
If movfile <> ""
mID = LoadMovie(#PB_Any, movfile)
If IsMovie(mID)
Debug "Movie ok"
xs = MovieWidth(mID)
ys = MovieHeight(mID)
Debug Str(xs) + ":" + Str(ys)
msID = CreateSprite(#PB_Any, xs, ys) ;Render-Movie-Sprite neue Größe
PlayMovie(mID, #PB_Movie_Rendered) ;Movie-Rendern auf Sprite starten
Else
Debug "Movie fehler"
EndIf
EndIf
EndIf
Until Event = 0
If IsMovie(mID) ;wenn Movie vorhanden
RenderMovieFrame(mID, SpriteID(msID)) ;Movie auf Render-Sprite rendern
UseBuffer(sID2d)
DisplaySprite(msID, 0, 0) ;Render-Sprite auf neues Sprite
;das Render-Sprite wird für Alpha-Blending und Zoom auf ein neues Texture-Sprite kopiert
UseBuffer(#PB_Default)
Start3D()
DisplaySprite3D(sID3d, 0, 0, 255)
;hier noch andere Sprite-3D-Funktionen wie darübergelegter Text
Stop3D()
If StartDrawing(ScreenOutput())
DrawText(10, 10, Str(tfps))
StopDrawing()
EndIf
tgap.q = (1000 / 30) - (ElapsedMilliseconds() - tfps)
If tgap > 16 ;wenn länger als 16 ms bis nächsten Frame
If tgap > 100
tgap = 100
EndIf
Delay(tgap - 10) ;Pause einfügen für CPU-Entlastung
EndIf
FlipBuffers(#PB_Screen_SmartSynchronization)
tfps = ElapsedMilliseconds() ;aktuelle Zeit holen
EndIf
Until exit
End