2011-11-27 43 views
0

我试图创建一种树形图,使得如果你点击其中一个圆圈,它的子圆圈向外散布一定程度的随机性从原始圆圈连接线。我有这个工作,但现在我想要做的是确保没有任何一个圆圈彼此碰撞,没有任何一条线纵横交错。你可以看到正在发生的事情的截图。我的代码如下。如何更改此代码以检查碰撞并避免碰撞?我已经阅读了flash的hitTestObject命令,但它只适用于上下文中的一个对象。我想测试一个对象与任何显示对象的联系。与舞台上的多个对象碰撞测试

import com.greensock.TweenMax; 

var sw = stage.stageWidth; 
var sh = stage.stageHeight; 
var cr = 3; //circle radius 
var moveRange = 25; 
var circleColor = 0xcccccc; 
var numCircles = 4; 
var lineCanvas:Sprite = new Sprite(); 
addChild(lineCanvas); 
var lineColor = 0xe9e9e9; 
var lineWeight = 1; 

function init(){ 
    firstCircle(); 
} 

function firstCircle(){ 
    var xPos = randomRange(cr, sw-cr); 
    var yPos = randomRange(cr, sh-cr); 
    var newCircle:Shape = new Shape(); 
    newCircle.graphics.beginFill(circleColor); 
    newCircle.graphics.drawCircle(0,0,cr); 
    newCircle.graphics.endFill(); 

    var circleClip:MovieClip = new MovieClip(); 
    circleClip.childCircles = 2; 
    circleClip.x = xPos; 
    circleClip.y = yPos; 
    circleClip.addChild(newCircle); 

    addChild(circleClip); 
    circleClip.addEventListener(MouseEvent.CLICK,clickCircle); 
} 

function clickCircle(e:MouseEvent):void { 
    var thisCircle = e.target; 
    for (var i=0; i<thisCircle.childCircles;i++){ 
     drawCircle(thisCircle); 
    } 
} 

function drawCircle(parentCircle){ 
    var xPos = parentCircle.x; 
    var yPos = parentCircle.y 
    //var xPos = randomRange(cr, sw-cr); 
    //var yPos = randomRange(cr, sh-cr); 
    var newCircle:Shape = new Shape(); 
    newCircle.graphics.beginFill(circleColor); 
    newCircle.graphics.drawCircle(0,0,cr); 
    newCircle.graphics.endFill(); 

    var circleClip:MovieClip = new MovieClip(); 
    circleClip.childCircles = 2; 
    circleClip.x = xPos; 
    circleClip.y = yPos; 
    circleClip.addChild(newCircle); 
    addChild(circleClip); 
    circleClip.addEventListener(MouseEvent.CLICK,clickCircle); 
    moveCircle(circleClip,xPos,yPos); 
} 

function drawLine(childCircle,parentX,parentY){ 
     lineCanvas.graphics.lineStyle(lineWeight,lineColor); 
     lineCanvas.graphics.moveTo(parentX,parentY); 
     lineCanvas.graphics.lineTo(childCircle.x,childCircle.y); 

//想检查线或圆是否在这里联系任何东西。如果是这样,我想杀死圈子(因此也停止绘制线)。

} 

function moveCircle(childCircle,parentX,parentY){ 
    var curX = childCircle.x; 
    var curY = childCircle.y; 
    var moveX = randomRange(curX-moveRange,curX+moveRange); 
    var moveY = randomRange(curY-moveRange-cr,curY+moveRange+cr); 
    TweenMax.to(childCircle,.5, { x: moveX, y: moveY, onUpdate:drawLine, onUpdateParams:[childCircle,parentX,parentY]}); 
} 

function randomRange(minNum:Number, maxNum:Number):Number { 
    return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum); 
} 

init(); 

回答

1

有2种方式,你可以这样做:

  1. 重因子代码中使用ActionScript物理库(即Box2D的或任何你喜欢)。然后,将您的“圈子”和“线条”看作会彼此碰撞的物理对象,可能与您在此尝试的效果相同。对此PRO来说,该库带有各种扩展类来处理物理交互。 CON是实施中的开销。
  2. 手动/自定义的方式是为ENTER_FRAME添加一个eventlistener,在舞台或初始圆上,它将通过它的子节点循环,并在每个“子”圆上调用hitTestObject方法,与其他每个圆“孩子”圈子。线在儿童圈内,所以应该没问题。

我注意到你实际上并没有将childCircles添加到最初的圆圈,而是将它们添加到舞台上。您可能需要将这些圆形推入数组中,以便稍后参考此“collisionDetection”方法。

1

基本上,您需要维护屏幕上所有圈子的列表,然后每当某物移动(或每个帧)时,都需要检查针对所有其他圈子的移动圆圈,以查看它们是否正在碰撞。

一个Array应该很好地跟踪所有的圈子。

然后,每当某物移动时,只要它在移动,就应该遍历该数组并检查它是否碰到了其他任何圆。使用类似:

function drawLine (...) 
{ 

    // Your code here 

    for (var i:int = 0; i < Array.length; i++) 
    { 
     childCircle.hitTestObject(Array[i]); 
    } 
} 

或者,您可以指定检查对所有其他圈子每一帧每一圈的的onEnterFrame功能,尽管这使用更多的资源。我猜测资源在这一点上对你来说不是问题,所以你可以使用更简单的路线,并在以后需要时进行优化。