gpt4 book ai didi

actionscript - 在 Actionscript 3 中模拟鼠标事件

转载 作者:行者123 更新时间:2023-12-04 04:55:37 25 4
gpt4 key购买 nike

给定舞台坐标 (x,y),我想让我的 Flash 应用程序的行为就像用户在 (x,y) 位置单击一样。也就是说,像

function simulateClick(x:Number, y:Number):void{
var e:MouseEvent = new MouseEvent(MouseEvent.CLICK, true, false, x, y)
stage.dispatchEvent(e);
}

我找到了一堆页面在谈论这种事情,它们都提供了类似于上述的解决方案。然而,这并不等同于用户点击 (x,y)。有两个问题:

第一个是e.stageX和e.stageY都是0,我不能直接设置。文档说它们是在设置 e.localX 和 e.localY 时计算的,但是当我在 dispatchEvent 之前设置 e.localX 时,也不会在事件监听器中发生这种情况。

我可以用这样的东西重写我所有的事件监听器:
var p:Point = e.target.localToGlobal(new Point(e.localX, e.localY));

这是唯一的选择吗?

第二个问题是我的事件监听器注册到舞台的 child ,而不是舞台本身。所以我需要找出调用 dispatchEvent 的目标。很明显,Flash 能够确定目标应该是什么,即哪个对象拥有在位置 (x,y) 处可见的最高像素,因为它在用户实际点击时这样做。有没有一种简单的方法来获取这些信息,还是我应该编写自己的递归函数来做同样的事情?我目前正在使用 DisplayObjectContainer.getObjectsUnderPoint,但它不太正确。

我正在用 FlashDevelop 编写,如果这有什么不同的话。

最佳答案

e.stageX/Y为我正确填充...还有 getObjectsUnderPoint()似乎工作正常。我假设 x/y 值传递给 simulateClick是全局坐标吗?

编辑:正如评论中所指出的,鼠标事件必须在 InteractiveObject 实例上调度......相应地修改了代码。

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.InteractiveObject;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;

public function simulateClick(x:Number, y:Number):void
{
var objects:Array = stage.getObjectsUnderPoint(new Point(x, y));

var target:DisplayObject;
while(target = objects.pop())
{
if(target is InteractiveObject)
{
break;
}
}

if(target !== null)
{
var local:Point = target.globalToLocal(new Point(x, y));

var e:MouseEvent = new MouseEvent(MouseEvent.CLICK, true, false, local.x, local.y);
target.dispatchEvent(e);
}
}

public function addedToStage():void
{
var parent:Sprite = new Sprite();
stage.addChild(parent);

var child:Sprite = new Sprite();
child.name = 'child 1';
child.graphics.beginFill(0xff0000, 1);
child.graphics.drawRect(0, 0, 200, 200);
child.graphics.endFill();

var child2:Sprite = new Sprite();
child2.name = 'child 2';
child2.graphics.beginFill(0xff00ff, 1);
child2.graphics.drawRect(0, 0, 100, 100);
child2.graphics.endFill();
child2.x = 150;
child2.y = 150;

var bmpData:BitmapData = new BitmapData(80, 80, false, 0x00ff00);
var bmp:Bitmap = new Bitmap(bmpData);
bmp.name = 'bitmap';

child2.addChild(bmp);

parent.addChild(child);
parent.addChild(child2);

child2.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void
{
trace('target: ' + e.target.name);
trace('localX: ' + e.localX);
trace('localY: ' + e.localY);
trace('stageX: ' + e.stageX);
trace('stageY: ' + e.stageY);
});

simulateClick(190, 190);
}

输出:
target: child 2
localX: 40
localY: 40
stageX: 190
stageY: 190

关于actionscript - 在 Actionscript 3 中模拟鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12682596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com