2014-01-22 3 views
0

간단한 hitTestObject를 만들고 볼을 사용하여 화면에 그려지는 선을 봅니다. 그럴 경우 모든 줄을 지우고 신선한 것을 시작합니다. 나는 아주 가깝다. checkIt() 함수는 코드를 생성하고 라인을 지우지 만 새로운 모양을 만들지 않는 곳입니다.as3 hitTestObject에 도달하면 as3 마우스로 그림을 그립니다.

히트 테스트에 도달했을 때 마우스가 그린 선을 지우고 새로 시작하려면 어떻게합니까?

var myshape:Shape; 


myshape = new Shape(); 
myshape.graphics.lineStyle(12, 0xC807DE); 
var alreadyDrawn:Shape; 
alreadyDrawn = new Shape(); 

stage.addEventListener(MouseEvent.MOUSE_DOWN, activateDraw); 
function activateDraw(event:MouseEvent):void 
{ 
    myshape.graphics.moveTo(mouseX,mouseY); 
    addChild(myshape); 

    stage.addEventListener(MouseEvent.MOUSE_MOVE, lineDraw); 
    function lineDraw(myevent:MouseEvent):void 
    { 
     stage.addEventListener(MouseEvent.MOUSE_UP, stopDraw); 
     function stopDraw(endevent:MouseEvent):void 
     { 
      alreadyDrawn = myshape; 
      stage.removeEventListener(MouseEvent.MOUSE_MOVE, lineDraw); 

     } 


     myshape.graphics.lineTo(mouseX,mouseY); 
     myevent.updateAfterEvent(); 
     checkIt(); 
    } 


} 

function checkIt() 
{ 
    if (alreadyDrawn.hitTestObject(Ball) == true) 
    { 
     trace("Hit The Balls"); 
     myshape.graphics.clear(); 
     myshape.graphics.lineStyle(12, 0xC807DE); 


    } 

} 

답변

0

흥미로운 질문 ~

나는 문제는 당신이 clearmoveTo에 잊었 될 수있다 생각합니다.

패스 mouseX, mouseYcheckIt에 :

여기 내 수정합니다. 당신이 alreadyDrawn=myshape을 일단 당신이 연결된 어떤 객체 잃어 버려

checkIt(mouseX, mouseY); 

function checkIt(mouseX:Number, mouseY:Number):void 
{ 
    if (alreadyDrawn.hitTestObject(Ball))//you don't need == true here 
    { 
     trace("Hit The Balls"); 
     myshape.graphics.clear(); 
     myshape.graphics.lineStyle(12, 0xC807DE); 
     myshape.graphics.moveTo(mouseX,mouseY); 
    } 
} 
1

당신은 실제로 대신 두 ONE 형태를 가지고있다. alreadyDrawn.graphics.copyFrom(myshape.graphics); 대신 다른 인스턴스를 잃지 않고 모든 스트로크를 인수에서 객체로 복사합니다.

다음으로 조회수가 alreadyDrawn 인 것으로 감지 된 경우 그리기를 중지해야합니다.이 경우 stopDraw(null);checkIt()에서 호출하십시오.

다음으로, 점점 더 많이 추가하는 동안 무대에서 모든 청취자를 삭제하지는 않습니다. 여러 줄을 연속해서 그리는 경우 (누르기 - 끌기 - 해제), stopDraw 청취자가 여러 번 추가되고 한번도 제거되지 않습니다. 이렇게하려면 stopDraw 함수 내에서 removeEventListener(MouseEvent.MOUSE_UP, stopDraw); 함수를 사용하고 추가 행을 activateDraw으로 이동하십시오. 마우스를 끌 때 여러 "마우스 이동"이벤트가 발생하고 이벤트를 처리 할 때마다 다른 수신기가 추가되기 때문입니다.

마지막으로 실제 필요없이 기능을 중첩하지 마십시오!

고정 코드는 다음과 같아야합니다

var myshape:Shape; 
myshape = new Shape(); 
myshape.graphics.lineStyle(12, 0xC807DE); 
var alreadyDrawn:Shape; 
alreadyDrawn = new Shape(); 

stage.addEventListener(MouseEvent.MOUSE_DOWN, activateDraw); 
function activateDraw(event:MouseEvent):void 
{ 
    myshape.graphics.moveTo(mouseX,mouseY); 
    addChild(myshape); 

    stage.addEventListener(MouseEvent.MOUSE_MOVE, lineDraw); 
    stage.addEventListener(MouseEvent.MOUSE_UP, stopDraw); 
} 

function lineDraw(event:MouseEvent):void 
{ 
    myshape.graphics.lineTo(mouseX,mouseY); 
    event.updateAfterEvent(); 
    checkIt(); 
} 
function stopDraw(event:MouseEvent):void 
{ 
    alreadyDrawn.graphics.copyFrom(myshape.graphics); 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, lineDraw); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopDraw); 
} 

function checkIt() 
{ 
    if (alreadyDrawn.hitTestObject(Ball) == true) 
    { 
     trace("Hit The Balls"); 
     myshape.graphics.clear(); 
     myshape.graphics.lineStyle(12, 0xC807DE); 
     alreadyDrawn.graphics.clear(); // clear this too 
     stopDraw(null); // stop active draw, if any 
    } 
} 

copyFrom() manual reference

+0

와우는 큰 코드 주셔서 감사합니다. 장면 1, 레이어 '레이어 1', 프레임 1, 라인 25에이 오류가 발생했습니다. \t 1061 : 고정 유형 flash.display : Shape를 사용하여 참조를 통해 가능한 정의되지 않은 메서드 copyFrom을 호출합니다. –

+0

죄송 합니다만,'copyFrom()'은'Graphics' 클래스 메소드이며, 또 다른'Graphics' 객체를 소스로 받아들입니다. 결정된. – Vesper

+0

모든 코드를 다시 한 번 고맙습니다. 나는 아직도 문제가있다. 간단히 말해서 내가하고 싶은 것은 아이들을위한 그리기 게임을 만드는 것입니다. 그들은 "시작"버튼을 눌러 (새로운 모양을 만든다) 그리다가 그 위에 물건을 올리면 다시 시작하고 그려진 모든 물건과 선을 지 웁니다. 또는 '시작'을 다시 눌러 똑같은 작업을 수행 할 수 있습니다. 하지만 내 코드는 변경 사항이 있더라도 매우 버그가 있습니다. 나는 그것의 가까운 tho를 알고있다. 그것의 미로 게임. 그래서 벽에 부딪쳤을 때 그들은 처음으로 돌아 간다. –