core: Allow clicking on a non-interactive AVM2 child of a Loader

This commit is contained in:
Aaron Hill 2024-08-03 16:09:01 -04:00
parent b616f559e7
commit 51f004f171
9 changed files with 147 additions and 0 deletions

View File

@ -215,6 +215,9 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> {
return Avm2MousePick::Miss;
}
let mut options = HitTestOptions::SKIP_INVISIBLE;
options.set(HitTestOptions::SKIP_MASK, self.maskee().is_none());
// We have at most one child
if let Some(child) = self.iter_render_list().next() {
if let Some(int) = child.as_interactive() {
@ -240,6 +243,12 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> {
return Avm2MousePick::Miss;
}
}
} else if child.hit_test_shape(context, point, options) {
if self.mouse_enabled() {
return Avm2MousePick::Hit((*self).into());
} else {
return Avm2MousePick::PropagateToParent;
}
}
}
Avm2MousePick::Miss

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("image.png"));
loaderWrapper.addChild(firstLoader);
var secondLoader = new Loader();
secondLoader.name = "secondLoader";
secondLoader.load(new URLRequest("image.png"));
secondLoader.y = 150;
secondLoader.mouseEnabled = false;
loaderWrapper.addChild(secondLoader);
var thirdLoader = new Loader();
thirdLoader.name = "thirdLoader";
thirdLoader.load(new URLRequest("image.png"));
thirdLoader.y = 300;
thirdLoader.mouseChildren = false;
loaderWrapper.addChild(thirdLoader);
var fourthLoader = new Loader();
fourthLoader.name = "fourthLoader";
fourthLoader.load(new URLRequest("image.png"));
fourthLoader.y = 450;
fourthLoader.mouseEnabled = false;
fourthLoader.mouseChildren = false;
loaderWrapper.addChild(fourthLoader);
this.addChild(loaderWrapper);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

View File

@ -0,0 +1,72 @@
[
{
"type": "MouseMove",
"pos": [19, 29]
},
{
"type": "MouseDown",
"pos": [19, 29],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [19, 29],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [71, 26]
},
{
"type": "MouseDown",
"pos": [71, 26],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [71, 26],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [19, 175]
},
{
"type": "MouseDown",
"pos": [19, 175],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [19, 175],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [20, 324]
},
{
"type": "MouseDown",
"pos": [20, 324],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [20, 324],
"btn": "Left"
},
{
"type": "MouseMove",
"pos": [25, 477]
},
{
"type": "MouseDown",
"pos": [25, 477],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [25, 477],
"btn": "Left"
}
]

Binary file not shown.

View File

@ -0,0 +1,5 @@
Clicked at: 19 29 on: [object Loader] (firstLoader)
Clicked at: 71 26 on: [object Stage] (null)
Clicked at: 19 175 on: [object Sprite] (LoaderWrapper)
Clicked at: 20 324 on: [object Loader] (thirdLoader)
Clicked at: 25 477 on: [object Sprite] (LoaderWrapper)

Binary file not shown.

Binary file not shown.

View File

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