2014-01-22 40 views
0

我正在嘗試創建一個簡單的hitTestObject並查看屏幕上用球擊中的線條。如果是,它將清除所有線條並開始新鮮。我非常接近。 checkIt()函數是代碼需要發生的地方,它清除了行但沒有創建新的形狀。當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

有趣的問題〜

我認爲這個問題可能是你忘了moveToclear後。

這裏是我的解決辦法:

mouseXmouseYcheckIt

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

你確實有一個形狀,而不是兩個,因爲一旦你做alreadyDrawn=myshape你失去附着有任何對象。您應該改爲alreadyDrawn.graphics.copyFrom(myshape.graphics);這會將所有筆畫從參數複製到對象而不會丟失其他實例。

接下來,你似乎也需要停止繪製,如果你已經發現了一個命中vs 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:調用可能未定義的方法copyFrom通過靜態類型的引用flash.display:Shape。 –

+0

糟糕,'copyFrom()'是一個'Graphics'類方法,並接受另一個'Graphics'對象作爲源。固定。 – Vesper

+0

再次感謝您的所有代碼。我仍然有問題。總之,我想要做的是爲孩子們創建一個繪畫遊戲。他們「按下」按鈕開始(創建新形狀),然後繪製,如果它們碰到重新開始的對象並刪除線條和所有繪製的對象。或者他們可以通過再次點擊「開始」來做同樣的事情。但是,即使進行了更改,我的代碼也非常麻煩。我知道它的密切壽命。它是一款迷宮遊戲。所以當他們撞到牆時,他們會回到起點。 –