2014-10-24 1 views
1

안녕하세요, 저는 최근에 AS3에서 무비 클립을 드래그하려고 시도해 왔지만 적중률 테스트를 수행하는 데 어려움을 겪고 있습니다. 명확히하기 위해 문제는 무비 클립이 드래그 테스트 객체를 쳤을 때 gotoframe() 함수를 실행하지 않는다는 것입니다. initDrag는() 액션 청취자를 추가합니다 : 당신이 객체 떨어져액션 스크립트 3에서 무비 클립 끌기

EndDrag가() 액션 리스너를 제거하면 스테이지에서 객체 MOUSE_UP에 MOUSE_DOWN이 문제가되지 않도록; 당신이 객체

stopADrag에 (이 경우 단계) 다른 프레임

startADrag() 객체가 드래그 할 수있는 내에서 사각형을 만들에 호출되는 startDrag()를 가기 전에 (각 개체에 대해)이 호출() 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"); 
} 

어떤 조언이나 답변을 주셔서 감사합니다.

+0

드래그 코드가 정확한 것처럼 보였습니다. 히트 테스트의 문제를 자세히 설명해 주시겠습니까? – Iggy

+0

@Iggy hitTestObject가 프레임을 감지하고 변경하지 않습니다. 따라서 무비 클립을 객체 dragtest로 드래그하면 프레임이 "잃게"변경됩니다. – Trows

+0

하나의 경우 모든 if 문을 이벤트 루프 안에 배치해야합니다. – Iggy

답변

2

다음 코드는 예상대로 작동합니다. 문제는 내가 이미 언급 한 바와 같이 hitTestObject(obj)에 대한 호출이 번, 매우 시작된 응용 프로그램의에만 실행됩니다. 그래도해야 할 일은 으로 항상 확인하십시오..

hitTestObject-calls에 대한 호출이 처음에 한 번만 실행되면, 객체 중 하나를 드래그 할 기회조차 없을 때 항상 false를 반환합니다. 맞습니까? 귀하의 개체가 초기 위치에 있기 때문에 (dragtest object 밖에 있음) 가정해야합니다.

Event.ENTER_FRAME에 대한 이벤트 수신기로 프레임 당 한 번 을 확인하십시오. 따라서 hitTestObject에 대한 모든 결과가 false 인 경우에도 다음 프레임에서 모두 다시 확인됩니다 (현재 드래그하는 경우 boolean라는 간단한 컨트롤을 통해 제어 됨).

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; 
    } 
} 
관련 문제