diff --git a/source/funkin/graphics/video/FlxVideo.hx b/source/funkin/graphics/video/FlxVideo.hx index 393e2d49c..e95d7caa6 100644 --- a/source/funkin/graphics/video/FlxVideo.hx +++ b/source/funkin/graphics/video/FlxVideo.hx @@ -9,6 +9,7 @@ import openfl.net.NetStream; /** * Plays a video via a NetStream. Only works on HTML5. + * This does NOT replace hxCodec, nor does hxCodec replace this. hxCodec only works on desktop and does not work on HTML5! */ class FlxVideo extends FlxBasic { diff --git a/source/funkin/ui/title/AttractState.hx b/source/funkin/ui/title/AttractState.hx index d630c07f2..67c762da4 100644 --- a/source/funkin/ui/title/AttractState.hx +++ b/source/funkin/ui/title/AttractState.hx @@ -1,5 +1,11 @@ package funkin.ui.title; +#if html5 +import funkin.graphics.video.FlxVideo; +#else +import hxcodec.flixel.FlxVideoSprite; +#end + /** * After about 2 minutes of inactivity on the title screen, * the game will enter the Attract state, as a reference to physical arcade machines. @@ -9,9 +15,73 @@ package funkin.ui.title; */ class AttractState extends MusicBeatState { - static final ATTRACT_VIDEO_PATH:String = Paths.videos('kickstarterTrailer.mp4'); + static final ATTRACT_VIDEO_PATH:String = Paths.videos('kickstarterTrailer'); - public override function create():Void {} + public override function create():Void + { + // Pause existing music. + FlxG.sound.music.stop(); + + #if html5 + playVideoHTML5(ATTRACT_VIDEO_PATH); + #else + playVideoNative(ATTRACT_VIDEO_PATH); + #end + } + + #if html5 + var vid:FlxVideo; + + function playVideoHTML5(filePath:String):Void + { + // Video displays OVER the FlxState. + vid = new FlxVideo(filePath); + if (vid != null) + { + vid.zIndex = 0; + + vid.finishCallback = onAttractEnd; + + add(vid); + } + else + { + trace('ALERT: Video is null! Could not play cutscene!'); + } + } + #else + var vid:FlxVideoSprite; + + function playVideoNative(filePath:String):Void + { + // Video displays OVER the FlxState. + vid = new FlxVideoSprite(0, 0); + + if (vid != null) + { + vid.zIndex = 0; + vid.bitmap.onEndReached.add(onAttractEnd); + + add(vid); + vid.play(filePath, false); + } + else + { + trace('ALERT: Video is null! Could not play cutscene!'); + } + } + #end + + public override function update(elapsed:Float):Void + { + super.update(elapsed); + + // If the user presses any button, skip the video. + if (FlxG.keys.justPressed.ANY) + { + onAttractEnd(); + } + } /** * When the attraction state ends (after the video ends or the user presses any button), @@ -19,6 +89,21 @@ class AttractState extends MusicBeatState */ function onAttractEnd():Void { + #if html5 + if (vid != null) + { + remove(vid); + } + #else + if (vid != null) + { + vid.stop(); + remove(vid); + } + #end + vid.destroy(); + vid = null; + FlxG.switchState(new TitleState()); } }