2014-10-24 4 views
1

Привет, недавно я пытался перетащить фрагмент ролика в AS3, но у меня возникли проблемы с ударами тестов, у кого есть какие-то идеи? Чтобы уточнить, проблема заключается в том, что когда мувиклипы попадают в объект теста перетаскивания, они не выполняют функцию gotoframe(). initDrag() добавляет слушателей действий: MOUSE_DOWN на объект MOUSE_UP на сцене, так что не имеет значения, если вы от объектаПеретаскивание видеороликов в Action Script 3

endDrag() удаляет слушатели действий; называем это (для каждого объекта), прежде чем перейти к другому кадру

startADrag() создайте прямоугольник, внутри которого объект может быть перетаскиваются (в этом случае этап) вызова startDrag() на объекте

stopADrag() call stopDrag() для объекта из объекта currentObject (но только если currentObject не является нулевым).

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"); 
} 

благодарит за любые советы или ответы.

+0

Ваш код перетаскивания выглядит правильно, не могли бы вы рассказать о проблеме с помощью тестов на попадание? – Iggy

+0

@Iggy hitTestObject не обнаруживает и не меняет рамку. Поэтому, когда я перетаскиваю мувиклип на объект dragtest, он должен изменить кадр на «потерять» или 27 – Trows

+0

Ну, для одного вы должны поместить все ваши операторы if внутри цикла событий. – Iggy

ответ

2

Следующий код должен работать должным образом. Проблема заключается в том, что, как я уже сказал в своем комментарии, ваши звонки на hitTestObject(obj) только выполняются после, на очень начинается вашего приложения. Что вам нужно сделать, но это Постоянно проверяйте его.

Подумайте об этом, если ваши вызовы hitTestObject-calls выполняются только один раз в начале, когда у вас даже не было возможности перетащить один из ваших объектов, он всегда будет возвращать false, правильно? Потому что ваши объекты все еще находятся в исходном положении (за пределами dragtest object я должен предположить).

С прослушивателем событий для Event.ENTER_FRAME вы его проверяете один раз за кадр вместо этого. Поэтому, даже если все результаты для hitTestObject являются ложными, он будет проверять их все снова на следующем кадре (если вы в настоящее время перетаскиваете, управляете простым 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; 
    } 
}