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:
parent
60000d6930
commit
4d2b2893ae
|
@ -219,9 +219,19 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> {
|
|||
if let Some(child) = self.iter_render_list().next() {
|
||||
if let Some(int) = child.as_interactive() {
|
||||
if int.as_displayobject().movie().is_action_script_3() {
|
||||
return int
|
||||
let res = int
|
||||
.mouse_pick_avm2(context, point, require_button_mode)
|
||||
.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 {
|
||||
let avm1_result = int.mouse_pick_avm1(context, point, require_button_mode);
|
||||
if let Some(result) = avm1_result {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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.
|
@ -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.
|
@ -0,0 +1 @@
|
|||
num_ticks = 1
|
Loading…
Reference in New Issue