当前目标鼠标事件未注册。

时间:2017-04-30 05:59:30

标签: actionscript-3 mouseevent target flash-cs6

嘿伙计们,所以我在这个开始屏幕上有一个名为Warning: Invalid argument supplied for foreach()... Warning: Illegal string offset 'profile_first_name'... 的影片剪辑是另一个名为startScreen的影片剪辑,在mcOptions中你可以点击按钮来选择你的选项。我希望能够点击嵌套按钮但没有注册。以下是我设置的方法:

mcOptions

没有任何内容可追溯。难道我做错了什么?任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:0)

未经测试(此处没有AS3编译器),但您可以尝试:

startScreen.mcOptions.mcPlay.name = "mc_Play";
startScreen.mcOptions.mcStore.name = "mc_Store";

startScreen.mcOptions.addEventListener(MouseEvent.CLICK, onTap);

private function onTap(e:MouseEvent):void 
{
    if (e.currentTarget.name == "mc_Play" )
    {
        trace("PLAY OPTION TRUE");
    }
    else if (e.currentTarget.name == "mc_Store" )
    {
        trace("PLAY OPTION TRUE");
    }
}

如果您设置为e.currentTarget(无论是原始代码还是我的版本),e.target.currentTarget也可能效果更好。

答案 1 :(得分:0)

鼠标事件是一个冒泡事件(请在此处阅读:Event Bubbling, and Stop Propagation),因此 e.currentTarget e.target 可能是不同的对象。属性 e.currentTarget 始终指向您订阅方法的对象,在您的情况下为 startScreen.mcOptions 。如果您想在一个瓶颈容器中收集来自不同对象的事件,您应该使用 e.target 来了解哪个是哪个。

请注意, e.target 将是用于触发鼠标事件的最具鼠标功能的显示对象: SimpleButton TextField ,或精灵 MovieClip 或任何其他 InteractiveObject mouseChildren 属性设置为 false

startScreen.mcOptions.addEventListener(MouseEvent.CLICK, onTap);

private function onTap(e:MouseEvent):void 
{
    trace("Event from:", e.target, e.target.name);

    switch (e.target.name)
    {
        case "mcPlay":
            trace("PLAY OPTION TRUE");
            break;

        case "mcStore":
            trace("STORE OPTION TRUE");
            break;
    }
}

UPD:我这样做是为了回答另一个问题,但它可以正常运行,因为您希望代码也能正常运行。我不清楚你的理由究竟是什么错,因为我对这个理论没有错。

package
{
    import flash.display.Sprite;
    import flash.geom.Point;

    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Snap extends Sprite
    {
        private var Circus:Vector.<Sprite>;
        private var Dots:Vector.<Point>;

        public function Snap() 
        {
            Dots = new Vector.<Point>;
            Circus = new Vector.<Sprite>;

            // Create snap points, put them on stage and keep their coordinates.
            for (var i:int = 1; i * 100 < stage.stageWidth; i++)
            {
                for (var j:int = 1; j * 100 < stage.stageHeight; j++)
                {
                    var aDot:Sprite = new Sprite;
                    var aPos:Point = new Point(i * 100, j * 100);

                    aDot.graphics.beginFill(0xFF0000, 0.3);
                    aDot.graphics.drawCircle(0, 0, 4);
                    aDot.x = aPos.x;
                    aDot.y = aPos.y;

                    addChild(aDot);
                    Dots.push(aPos);
                }
            }

            var aCircas:int = 2 + 3 * Math.random();

            // Add random number of draggable objects.
            while (Circus.length < aCircas)
            {
                Circus.push(addCirca());
            }

            // Hook the mouse interaction.
            addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
        }

        // This method adds a draggable circle of random radius, color, position.
        private function addCirca():Sprite
        {
            var result:Sprite = new Sprite;

            result.name = "Circa";

            result.graphics.lineStyle(0, 0);
            result.graphics.beginFill(0x1000000 * Math.random(), 0.5);
            result.graphics.drawCircle(0, 0, 20 + 20 * Math.random());

            result.x = stage.stageWidth * Math.random();
            result.y = stage.stageHeight * Math.random();

            addChild(result);

            result.buttonMode = true;
            result.useHandCursor = true;

            return result;
        }

        // *** DRAGGING AN ITEM ** //

        // Snap radius.
        private var toleRance:int = 20

        // Mouse offset.
        private var offx:Number = 0;
        private var offy:Number = 0;

        // Dragged object.
        private var TheDrag:Sprite;

        private function startDragging(e:MouseEvent):void
        {
            // Get the dragged object reference.
            TheDrag = e.target as Sprite;

            trace("Try dragging:", TheDrag, TheDrag.name);

            if (TheDrag.name != "Circa") return;

            // Bring it to front.
            setChildIndex(TheDrag, numChildren - 1);

            // Record the mouse offset. If you comment the next 2 lines
            // the object will just snap to mouse by its center.
            offx = TheDrag.x - mouseX;
            offy = TheDrag.y - mouseY;

            // Watch the object position every frame.
            addEventListener(Event.ENTER_FRAME, onFrame);

            // Subscribe for certain events that mean the end of dragging.
            stage.addEventListener(Event.MOUSE_LEAVE, stopDragging);
            stage.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
        }

        private function onFrame(e:Event):void
        {
            // Get new object (x,y) according to the mouse position.
            var aPos:Point = new Point;

            aPos.x = mouseX + offx;
            aPos.y = mouseY + offy;

            // Browse through the list of snap points.
            for (var i:int = 0; i < Dots.length; i++)
            {
                // Snap to a point within tolerance pixels radius.
                if (Point.distance(aPos, Dots[i]) < toleRance)
                {
                    aPos = Dots[i];
                    break;
                }
            }

            TheDrag.x = aPos.x;
            TheDrag.y = aPos.y;
        }

        private function stopDragging(e:Event):void
        {
            TheDrag = null;

            // Stop monitoring.
            removeEventListener(Event.ENTER_FRAME, onFrame);

            // Stop waiting for events to cancel dragging.
            stage.removeEventListener(Event.MOUSE_LEAVE, stopDragging);
            stage.removeEventListener(MouseEvent.MOUSE_UP, stopDragging);
        }
    }
}
相关问题