在Actionscript 3中拖动影片剪辑

时间:2014-10-24 00:50:39

标签: actionscript-3 flash flash-cs5 flash-cs4 flash-cs6

嗨,所以最近我一直试图在AS3中拖动一个影片剪辑,但是我在接受任何想法的热门测试时遇到了一些麻烦?只是为了澄清,问题是当影片剪辑击中拖动测试对象时,他们不会执行gotoframe()函数。 initDrag()添加了动作侦听器: MOUSE_DOWN对象 舞台上的MOUSE_UP所以如果你不在物体上就没关系

endDrag()删除动作侦听器;在转到另一个框架之前调用此(对于每个对象)

startADrag()创建一个矩形,在该矩形内可以拖动对象(在本例中为舞台)         在对象上调用startDrag()

stopADrag()从currentObject调用对象的stopDrag()(但仅当currentObject不为null时)。

var currentObject:MovieClip = null;
initDrag(block1);
initDrag(block2);
initDrag(block3);
initDrag(block4);

function initDrag(obj:MovieClip )
{
    obj.addEventListener(MouseEvent.MOUSE_DOWN,startADrag);
    stage.addEventListener(MouseEvent.MOUSE_UP,stopADrag);
}
function endDrag(obj:MovieClip )
{
    obj.removeEventListener(MouseEvent.MOUSE_DOWN,startADrag);
    stage.removeEventListener(MouseEvent.MOUSE_UP,stopADrag);
}
function startADrag(e:MouseEvent):void
{
    currentObject = (MovieClip)(e.target);
    var rect:Rectangle = new Rectangle(0,0,stage.stageWidth - currentObject.width,stage.stageHeight - currentObject.height + 100);
    currentObject.startDrag(false,rect);
}
function stopADrag(e:MouseEvent):void
{
    if (currentObject != null)
    {
        currentObject.stopDrag();
    }
}
if(block1.hitTestObject(dragtest)){
gotoAndStop("lose");
}
if(block2.hitTestObject(dragtest)){
    gotoAndStop(27);
}
if(block3.hitTestObject( dragtest)){
    gotoAndStop("lose");

}
if(block4.hitTestObject( dragtest)){
gotoAndStop("lose");
}

感谢任何建议或答案。

1 个答案:

答案 0 :(得分:2)

以下代码应按预期工作。问题是,正如我在评论中已经说过的那样,您对hitTestObject(obj)的来电只能在应用的一开始 一次时执行。你需要做的是经常检查

考虑一下,如果你对hitTestObject调用的调用只在开始时执行一次,当你甚至没有机会拖动你的一个对象时,它总会返回false,对吗?因为你的对象仍处于初始位置(我必须假设dragtest object之外)。

使用Event.ENTER_FRAME的事件监听器,您可以每帧检查一次。因此,即使hitTestObject的所有结果都为false,它也会在下一帧中再次检查它们(如果您当前正在拖动,通过名为boolean的简单dragging进行控制。

var currentObject:MovieClip = null;
var dragging:Boolean = false;
initDrag(block1);
initDrag(block2);
initDrag(block3);
initDrag(block4);

addEventListener(Event.ENTER_FRAME, checkForHit);

function checkForHit(e:Event):void{
    if(dragging){
        if(block1.hitTestObject(dragtest)){
             gotoAndStop("lose");
        }
        if(block2.hitTestObject(dragtest)){
             gotoAndStop(27);
        }
        if(block3.hitTestObject( dragtest)){
            gotoAndStop("lose");
        }
        if(block4.hitTestObject( dragtest)){
            gotoAndStop("lose");
        }
    }
}

function initDrag(obj:MovieClip )
{
    obj.addEventListener(MouseEvent.MOUSE_DOWN,startADrag);
    stage.addEventListener(MouseEvent.MOUSE_UP,stopADrag);
}
function endDrag(obj:MovieClip )
{
    obj.removeEventListener(MouseEvent.MOUSE_DOWN,startADrag);
    stage.removeEventListener(MouseEvent.MOUSE_UP,stopADrag);
}
function startADrag(e:MouseEvent):void
{
    currentObject = (MovieClip)(e.target);
    var rect:Rectangle = new Rectangle(0,0,stage.stageWidth - currentObject.width,stage.stageHeight - currentObject.height + 100);
    currentObject.startDrag(false,rect);
    dragging = true;
}
function stopADrag(e:MouseEvent):void
{
    if (currentObject != null)
    {
        currentObject.stopDrag();
        dragging = false;
    }
}