【问题标题】:Dragging Sprite Array in Actionscript 3在 Actionscript 3 中拖动 Sprite 数组
【发布时间】:2013-03-22 03:09:32
【问题描述】:

我的目标是在MOUSE_WHEEL 事件上生成一个圆圈,并在发生拖动时移动它们所有,正如MOUSE_DOWNMOUSE_UP 检测到的那样。我通过将创建的每个Sprite 添加到一个数组中来完成此操作,并在鼠标向上/向下时迭代它。注意:Node 只是 Sprite 类型的扩展。

但是,由于某种原因,只有最近在数组中绘制的Sprite 被移动。任何想法为什么?

我的画布类:

    public function Canvas() {
        trace("Starting it");

        const background:Sprite = new Sprite();
        background.graphics.beginFill(0x00000000);
        background.graphics.drawRect(0, 0, this.stage.stageWidth, this.stage.stageHeight);
        background.graphics.endFill();
        addChild(background);

        background.addEventListener(MouseEvent.MOUSE_WHEEL, createNode);
        background.addEventListener(MouseEvent.MOUSE_DOWN, startObjectMove);
        background.addEventListener(MouseEvent.MOUSE_UP, endObjectMove);


        mNodeList = new Array();
    }
...
}

我的 startObjectMove 和 endObjectMove 方法:

        public function startObjectMove(pEvent:MouseEvent) : void {
        trace("Starting drag...");
        trace("There are " + mNodeList.length + " in list");
        for (var i:int = 0; i < mNodeList.length; i++) {
            var node:Node;
            node = Node(mNodeList[i]);
            node.startMove(pEvent);
        }
    }
    public function endObjectMove(pEvent:MouseEvent) : void {
        trace("Ending drag...");
        trace("There are " + mNodeList.length + " in list");
        for (var i:int = 0; i < mNodeList.length; i++) {
            var node:Node;
            node = Node(mNodeList[i]);
            node.endMove(pEvent);
        }
    }

endMovestartMove 方法只需调用 this.startDrag()this.endDrag()

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    您一次只能对一个对象使用 startDrag 和 stopDrag。

    您需要在舞台本身上监听鼠标按下事件 - 当用户单击时,存储每个节点的初始位置(在 Node 类中创建两个公共变量/属性),并记录鼠标从哪里开始。

    然后,每当鼠标移动直到它被释放时,计算它从鼠标向下移动了多远,并将这个量添加到每个节点的初始位置以设置它的位置。

    你需要做这样的事情:

    var initX:int;//Variables to store the mouse position on click:
    var initY:int;
    
    stage.addEventListener(MouseEvent.MOUSE_DOWN):void {
    
        initX = stage.mouseX;//Store the starting mouse position
        initY = stage.mouseY;
    
    
        //Store the node positions:
        for(var i:int = 0; i < mNodeList.length; i++){
            var node:Node = Node(mNodeList[i]);
            node.startX = node.x;
            node.startY = node.y;
        }
    
        //Listen for mouse move events
        stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
    }
    
    
    stage.addEventListener(MouseEvent.MOUSE_UP):void {
        //Stop listening for mouse move events
        stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
    }
    
    
    
    //MouseMove event handler:
    
    function mouseMove(e:MouseEvent):void{
            for(var i:int = 0; i < mNodeList.length; i++){
                    var node:Node = Node(mNodeList[i]);
    
                    // Position each as amount the mouse has moved 
                    // to each node's initial position:
    
                    node.x = (stage.mouseX-initX) + node.startX;
                    node.y = (stage.mouseY-initY) + node.startY;
            }
    
    }
    

    【讨论】:

    • 非常感谢,从来不知道你不能将它用于多个对象!
    • 我希望它有效,如果你想再看一遍,我已经修改了很多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多