2011-11-27 46 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功能,儘管這使用更多的資源。我猜測資源在這一點上對你來說不是問題,所以你可以使用更簡單的路線,並在以後需要時進行優化。