diff --git a/core/src/display_object/loader_display.rs b/core/src/display_object/loader_display.rs index aad8dc6fa..b2738d22f 100644 --- a/core/src/display_object/loader_display.rs +++ b/core/src/display_object/loader_display.rs @@ -117,6 +117,8 @@ impl<'gc> TDisplayObject<'gc> for LoaderDisplay<'gc> { } child.enter_frame(context); } + self.base_mut(context.gc_context) + .set_skip_next_enter_frame(false); } fn construct_frame(&self, context: &mut UpdateContext<'_, 'gc>) { diff --git a/core/src/loader.rs b/core/src/loader.rs index e6b3b04cb..1aca6acb6 100644 --- a/core/src/loader.rs +++ b/core/src/loader.rs @@ -640,6 +640,12 @@ impl<'gc> Loader<'gc> { // 'this.parent == null' and 'this.stage == null' mc.post_instantiation(context, None, Instantiator::Movie, false); catchup_display_object_to_frame(context, mc.into()); + // Movie clips created from ActionScript (including from a Loader) skip the next enterFrame, + // and consequently are observed to have their currentFrame lag one + // frame behind objects placed by the timeline (even if they were + // both placed in the same frame to begin with). + mc.base_mut(context.gc_context) + .set_skip_next_enter_frame(true); if let Some(MovieLoaderEventHandler::Avm2LoaderInfo(loader_info)) = event_handler { let mut activation = Avm2Activation::from_nothing(context.reborrow()); diff --git a/tests/tests/swfs/avm2/loader_loadbytes_events/expected.png b/tests/tests/swfs/avm2/loader_loadbytes_events/expected.png index 22047515c..e91c5ce31 100644 Binary files a/tests/tests/swfs/avm2/loader_loadbytes_events/expected.png and b/tests/tests/swfs/avm2/loader_loadbytes_events/expected.png differ diff --git a/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.fla b/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.fla index b698abbb1..09a7ae512 100644 Binary files a/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.fla and b/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.fla differ diff --git a/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.swf b/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.swf index 9a00937a7..3fc56319f 100644 Binary files a/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.swf and b/tests/tests/swfs/avm2/loader_loadbytes_events/loadable.swf differ diff --git a/tests/tests/swfs/avm2/loader_loadbytes_events/output.txt b/tests/tests/swfs/avm2/loader_loadbytes_events/output.txt index 90c467f4e..971ba695a 100644 --- a/tests/tests/swfs/avm2/loader_loadbytes_events/output.txt +++ b/tests/tests/swfs/avm2/loader_loadbytes_events/output.txt @@ -4,10 +4,14 @@ loader.contentLoaderInfo.bytesLoaded = 0 loader.contentLoaderInfo.bytesTotal = 0 loader.contentLoaderInfo.bytes = null loader.contentLoaderInfo.url = null -Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=674]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = null -Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=674 bytesTotal=674]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 674, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = null +Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=738]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = null +Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=738 bytesTotal=738]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 738, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = null +Framescript frame 1 Hello from loaded SWF! loader.contentLoaderInfo === loader.content.loaderInfo : true loader.contentLoaderInfo.content === loader.content : true -Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 674, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = file:/// -Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 674, loader.contentLoaderInfo.bytesTotal = 674, loader.contentLoaderInfo.url = file:/// +Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 738, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = file:/// +Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 738, loader.contentLoaderInfo.bytesTotal = 738, loader.contentLoaderInfo.url = file:/// +Framescript frame 2 +Framescript frame 1 +Hello from loaded SWF! diff --git a/tests/tests/swfs/avm2/loader_loadbytes_events/test.fla b/tests/tests/swfs/avm2/loader_loadbytes_events/test.fla new file mode 100644 index 000000000..b1d546ec8 Binary files /dev/null and b/tests/tests/swfs/avm2/loader_loadbytes_events/test.fla differ diff --git a/tests/tests/swfs/avm2/loader_loadbytes_events/test.swf b/tests/tests/swfs/avm2/loader_loadbytes_events/test.swf index a8ef30425..e93354e61 100644 Binary files a/tests/tests/swfs/avm2/loader_loadbytes_events/test.swf and b/tests/tests/swfs/avm2/loader_loadbytes_events/test.swf differ diff --git a/tests/tests/swfs/avm2/loader_loadbytes_events/test.toml b/tests/tests/swfs/avm2/loader_loadbytes_events/test.toml index 7aa0a14eb..0e7c9bb55 100644 --- a/tests/tests/swfs/avm2/loader_loadbytes_events/test.toml +++ b/tests/tests/swfs/avm2/loader_loadbytes_events/test.toml @@ -1,7 +1,7 @@ -num_frames = 3 +num_frames = 4 [image_comparison] tolerance = 0 [player_options] -with_renderer = { optional = true, sample_count = 1 } \ No newline at end of file +with_renderer = { optional = true, sample_count = 1 }