avm2: Prevent loader mouse pick from targeting direct child

Loaders have a similar behavior to the main stage - if a mouse pick
would target their direct child (the root movieclip in the stage case,
and the loaded MovieClip in the Loader case), the Stage/Loader is
targeted instead.
This commit is contained in:
Aaron Hill 2024-05-15 11:47:16 -04:00
parent 60000d6930
commit 4d2b2893ae
10 changed files with 285 additions and 1 deletions

View File

@ -219,9 +219,19 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> {
if let Some(child) = self.iter_render_list().next() { if let Some(child) = self.iter_render_list().next() {
if let Some(int) = child.as_interactive() { if let Some(int) = child.as_interactive() {
if int.as_displayobject().movie().is_action_script_3() { if int.as_displayobject().movie().is_action_script_3() {
return int let res = int
.mouse_pick_avm2(context, point, require_button_mode) .mouse_pick_avm2(context, point, require_button_mode)
.combine_with_parent((*self).into()); .combine_with_parent((*self).into());
if let Avm2MousePick::Hit(target) = res {
if target.as_displayobject().as_ptr() == child.as_ptr() {
if self.mouse_enabled() {
return Avm2MousePick::Hit((*self).into());
} else {
return Avm2MousePick::PropagateToParent;
}
}
}
return res;
} else { } else {
let avm1_result = int.mouse_pick_avm1(context, point, require_button_mode); let avm1_result = int.mouse_pick_avm1(context, point, require_button_mode);
if let Some(result) = avm1_result { if let Some(result) = avm1_result {

View File

@ -0,0 +1,16 @@
package {
import flash.display.MovieClip;
public class Loadable extends MovieClip {
public var mouseDisabled:MovieClip;
public function Loadable() {
this.mouseDisabled.mouseEnabled = false;
}
}
}

View File

@ -0,0 +1,60 @@
package {
import flash.display.MovieClip;
import flash.display.Shape;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.events.MouseEvent;
import flash.display.Loader;
import flash.display.Sprite;
public class Test extends MovieClip {
public function Test() {
var child = new Shape();
child.graphics.beginFill(0xFF0000);
child.graphics.drawRect(0, 0, 100, 100);
child.graphics.endFill();
this.addChild(child);
this.stage.addEventListener(MouseEvent.CLICK, function (e) {
trace("Clicked at: " + e.stageX + " " + e.stageY + " on: " + e.target + " (" + e.target.name + ")");
});
var loaderWrapper = new Sprite();
loaderWrapper.name = "LoaderWrapper";
var firstLoader = new Loader();
firstLoader.name = "firstLoader";
firstLoader.load(new URLRequest("loadable.swf"));
loaderWrapper.addChild(firstLoader);
var secondLoader = new Loader();
secondLoader.name = "secondLoader";
secondLoader.load(new URLRequest("loadable.swf"));
secondLoader.y = 150;
secondLoader.mouseEnabled = false;
loaderWrapper.addChild(secondLoader);
var thirdLoader = new Loader();
thirdLoader.name = "thirdLoader";
thirdLoader.load(new URLRequest("loadable.swf"));
thirdLoader.y = 300;
thirdLoader.mouseChildren = false;
loaderWrapper.addChild(thirdLoader);
var fourthLoader = new Loader();
fourthLoader.name = "fourthLoader";
fourthLoader.load(new URLRequest("loadable.swf"));
fourthLoader.y = 450;
fourthLoader.mouseEnabled = false;
fourthLoader.mouseChildren = false;
loaderWrapper.addChild(fourthLoader);
this.addChild(loaderWrapper);
}
}
}

View File

@ -0,0 +1,184 @@
[
{
"type": "MouseMove",
"pos": [45, 47]
},
{
"type": "MouseDown",
"pos": [45, 47],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [45, 47],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [140, 218]
},
{
"type": "MouseDown",
"pos": [140, 218],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [140, 218],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [248.25, 217.25]
},
{
"type": "MouseDown",
"pos": [248.25, 217.25],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [248.25, 217.25],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [358, 217]
},
{
"type": "MouseDown",
"pos": [358, 217],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [358, 217],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [131, 370]
},
{
"type": "MouseDown",
"pos": [131, 370],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [131, 370],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [255.25, 367.25]
},
{
"type": "MouseDown",
"pos": [255.25, 367.25],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [255.25, 367.25],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [361, 370]
},
{
"type": "MouseDown",
"pos": [361, 370],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [361, 370],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [148, 516]
},
{
"type": "MouseDown",
"pos": [148, 516],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [148, 516],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [246, 516]
},
{
"type": "MouseDown",
"pos": [246, 516],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [246, 516],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [351, 518]
},
{
"type": "MouseDown",
"pos": [351, 518],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [351, 518],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [136, 660]
},
{
"type": "MouseDown",
"pos": [136, 660],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [136, 660],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [267, 663]
},
{
"type": "MouseDown",
"pos": [267, 663],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [267, 663],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [352, 673]
},
{
"type": "MouseDown",
"pos": [352, 673],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [352, 673],
"btn": "Left"
}
]

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,13 @@
Clicked at: 45 47 on: [object Stage] (null)
Clicked at: 140 218 on: [object Loader] (firstLoader)
Clicked at: 248.25 217.25 on: [object MovieClip] (mouseChild)
Clicked at: 358 217 on: [object Loader] (firstLoader)
Clicked at: 131 370 on: [object Sprite] (LoaderWrapper)
Clicked at: 255.25 367.25 on: [object MovieClip] (mouseChild)
Clicked at: 361 370 on: [object Sprite] (LoaderWrapper)
Clicked at: 148 516 on: [object Loader] (thirdLoader)
Clicked at: 246 516 on: [object Loader] (thirdLoader)
Clicked at: 351 518 on: [object Loader] (thirdLoader)
Clicked at: 136 660 on: [object Sprite] (LoaderWrapper)
Clicked at: 267 663 on: [object Sprite] (LoaderWrapper)
Clicked at: 352 673 on: [object Sprite] (LoaderWrapper)

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
num_ticks = 1