flash as3 Поставляемый объект DisplayObject должен быть дочерним по отношению к вызывающей стороне при перетаскивании клипа - PullRequest
0 голосов
/ 22 февраля 2011

все, что я пытаюсь сделать, это настроить перетаскивание для моих видеоклипов, но я получаю эту ошибку:

The supplied DisplayObject must be a child of the caller.

Это мой код:

projectThumb.addEventListener( MouseEvent.MOUSE_DOWN, onThumbPress );
projectThumb.addEventListener( MouseEvent.MOUSE_UP, onThumbRelease );

function onThumbPress( e:MouseEvent ):void
{
    setChildIndex( e.target as MovieClip, numChildren - 1 );
    e.target.startDrag();
}

function onThumbRelease( e:MouseEvent ):void
{
    e.target.stopDrag();
}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2011

Что сказал Кай ...

просто хотел бы добавить к этому то, что, вероятно, вызывает его.

Если вы нажмете на большой палец (фактический большой палец), это будет растровый объект. таким образом, цель не MovieClip. Попробуйте запустить его в режиме отладки, чтобы убедиться, что это так. Вы также можете добавить след flash.utils.getQualifiedClassName(e.target), чтобы увидеть, что это такое. Если вы конвертируете несвязанный класс (не являющийся производным от MovieClip или MovieClip классом), вы получите нулевое значение.

Вы можете сделать оператор while, чтобы найти родителя, который является projectThumb, или просто предположить, что это родитель. Еще один способ сделать это - добавить прозрачную кнопку, которая бы покрывала размер projectThumb поверх всего, чтобы вы знали, что вызывает прослушиватель события click


попробовать ...

projectThumb.addEventListener( MouseEvent.MOUSE_DOWN, onThumbPress );
projectThumb.addEventListener( MouseEvent.MOUSE_UP, onThumbRelease );

function onThumbPress( e:MouseEvent ):void
{
    var target:MovieClip = findPT(e.target as DisplayObject) as MovieClip;
    if(target){
        setChildIndex(target, numChildren - 1 );
        target.startDrag();
    }
}

function onThumbRelease( e:MouseEvent ):void
{
    var target:MovieClip = findPT(e.target as DisplayObject) as MovieClip;
    if(target){
        target.stopDrag();
    }
}

function findPT($mc:DisplayObject):DisplayObject{
    while (1){
        if ($mc is ProjectThumb){ // <- this is to check for the right class
             return $mc;
        }else if($mc.parent == null){
            return null
        }else{
            $mc = $mc.parent as DisplayObject;
        }
    }
    return null
}
0 голосов
/ 22 февраля 2011

Единственная функция, которую вы вызываете, которая выдаст эту ошибку, это setChildIndex.Вполне вероятно, что e.target as MovieClip возвращает null.

Убедитесь, что вы гарантируете, что e.target всегда является действительным MovieClip (помните, что as вернет null, если типы don 't), или добавьте там чек на null.

...