【问题标题】:Flash AS3 Dragging multiple objectsFlash AS3 拖动多个对象
【发布时间】:2017-09-07 16:12:17
【问题描述】:

我正在寻找的是当我在舞台上拖动一个对象时,我希望一个底层对象(同一层)被拖动,并保持在放置主要对象的位置。我需要在多对象情况下使用数组吗? 这仅适用于一个对象(和“子对象”),总共有 22 个,我无法将子对象添加到其动画剪辑中,否则舞台上的其他 21 个对象将重叠并且互相干扰。

这是我目前所拥有的,也请参见插图。谁能指导我一些有用的代码?

CF.addEventListener(MouseEvent.MOUSE_DOWN, dragCF);
CF.addEventListener(MouseEvent.MOUSE_OVER, fadeCF_spaceIN);
CF.addEventListener(MouseEvent.MOUSE_UP, fadeCF_spaceIN);

function dragCF(evt:MouseEvent):void {
    addChild(MovieClip(evt.currentTarget));
    evt.currentTarget.startDrag();
    stage.addEventListener(MouseEvent.MOUSE_UP, dropCF);   }   

function dropCF(evt:MouseEvent):void {
     stopDrag();
     stage.removeEventListener(MouseEvent.MOUSE_UP, dropCF);  }

function fadeCF_spaceIN(evt:MouseEvent):void {
    CF_space.alpha = .5; 
    stage.addEventListener(MouseEvent.MOUSE_OUT, fadeCF_spaceOUT);
    stage.addEventListener(MouseEvent.MOUSE_DOWN, fadeCF_spaceOUT);      }

function fadeCF_spaceOUT(evt:MouseEvent):void {
    CF_space.alpha = 0; 
    stage.removeEventListener(MouseEvent.MOUSE_OUT, fadeCF_spaceOUT);  }

示例说明:

【问题讨论】:

  • 我不确定,因为我倾向于认为我不应该使用目标方法,因为用户可以在舞台上随机放置对象,没有固定目标。但也许是我太不擅长使用它了。
  • 但是那里使用的数组方法呢。如果你会做类似的事情,并将所有玩家存储在数组中。然后在拖动其中一个玩家之后,您可以计算它被拖动的方向和距离,并将其应用于该阵列中的所有其他玩家。 (我认为这就是你想要做的,对吧?)
  • 我明白你的意思,我尝试实现它,但我得到了相同的结果 - 主对象会移动,但它的从属对象不会移动这是我所做的:

标签: actionscript-3 flash


【解决方案1】:
var CF_1:Array = [CF_mc, CF_space];  // instance names
for each(var CF1_MC:MovieClip in CF_1)
{
    CF1_MC.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
    CF1_MC.addEventListener(MouseEvent.MOUSE_UP, dropIt);
    CF1_MC.startX = CF1_MC.x;
    CF1_MC.startY = CF1_MC.y;
}

function pickUp(event:MouseEvent):void 
{
    event.target.startDrag(true);
    event.target.parent.addChild(event.target);
}

function dropIt(event:MouseEvent):void 
{
    event.target.stopDrag();
}

【讨论】:

  • 我觉得这只是一行简单的代码,但我想我太菜鸟了。我真的需要一些帮助,有人可以帮忙吗?
【解决方案2】:

不能 100% 确定您的意思,但是您可以使用 ENTER_FRAME 函数代替 startDrag 和 stopDrag 吗?这是一个非常简单的示例,您也可以将其与对象数组一起使用。

var xDifference:Number;
var yDifference:Number;
var dragging:Boolean;

draggableObject.addEventListener(MouseEvent.MOUSE_DOWN, mDown);
draggableObject.addEventListener(MouseEvent.MOUSE_UP, mUp);
stage.addEventListener(Event.ENTER_FRAME, loop);

function loop(evt:Event):void{
    if(dragging){
        draggableObject.x = mouseX;
        draggableObject.y = mouseY;

        secondaryObject.x = draggableObject.x + xDifference;
        secondaryObject.y = draggableObject.y + yDifference;
    }
}

function mDown(evt:MouseEvent):void{
    xDifference = secondaryObject.x - draggableObject.x;
    yDifference = secondaryObject.y - draggableObject.y;
    dragging = true;
}

function mUp(evt:MouseEvent):void{
    dragging = false;
}

根据具体情况,您可能还想计算鼠标光标和可拖动对象在 MOUSE_DOWN 上的注册点之间的差异,以防止可拖动对象跳转到其中心点正好位于鼠标位置的位置。

【讨论】:

    【解决方案3】:

    感谢你的补充,事实证明它更简单,太简单了:

    object.addEventListener(MouseEvent.MOUSE_DOWN, drag);
    object.addEventListener(MouseEvent.MOUSE_UP, drop);
    
    function drag(evt:MouseEvent):void {
         addChild(MovieClip(evt.currentTarget));
         evt.currentTarget.startDrag();
    }
    
    function drop(evt:MouseEvent):void {
         stopDrag();
         object_space.x = object.x;
         object_space.y = object.y;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多