2014-01-22 34 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

再次感谢您的所有代码。我仍然有问题。总之,我想要做的是为孩子们创建一个绘画游戏。他们“按下”按钮开始(创建新形状),然后绘制,如果它们碰到重新开始的对象并删除线条和所有绘制的对象。或者他们可以通过再次点击“开始”来做同样的事情。但是,即使进行了更改,我的代码也非常麻烦。我知道它的密切寿命。它是一款迷宫游戏。所以当他们撞到墙时,他们会回到起点。 –