2011-08-05 59 views
2

我想讓我的遊戲角色(魚)只在他們目前的視錐能夠「看到」的情況下轉到新生成的目的地,因此我繪製了一個三角形MC使其成爲他們的視錐,並從那裏產生錐體區域內的隨機點,我所使用的代碼如下所示,並且它不斷返回我的階段的頂端座標爲什麼是這樣呢?我已經做了localToGlobal,它仍然是相同的在視錐中獲得隨機點

public function getRandomDestination():void 
{ 
    //Math.floor(Math.random()*(1+High-Low))+Low; 
    var conePoint:Point = new Point(Math.floor(Math.random() * cone.width), Math.floor(Math.random() * cone.height)); 
    _destinationX = localToGlobal(conePoint).x;//Math.floor(Math.random()*(1+_maxX-100)+100); 
    trace(_destinationX); 
    _destinationY = localToGlobal(conePoint).y; //Math.floor(Math.random() *(1+_maxY-100)+100); 
    trace(_destinationY); 
} 

回答

1

是你計算一個矩形的隨機點是無效的方式。 首先,您使用的不是圓錐體的矩形(圓錐體是三維幾何形狀)。這是我如何計算矩形內的隨機點(我將使用等腰三角形)

警告:令人驚歎的MSPaint skillz。

enter image description here

首先,我們獲得使用Math.randon()巫婆y軸的位置給了我們在0和1之間的隨機值(稱之爲rndY)。

接下來我們需要計算軸上x的位置。我們計算的話是這樣的:

rndX = 0.5 - rndY/2 + rndY * Math.random() 

這將確保我們在x軸的位置永遠是在三角形內。

要解決您的localtoglobal問題更多的來源或fla將會有所幫助。

2

首先選擇一個隨機角度(在指定的半徑內),然後用該角度從魚中選擇一個隨機距離不是更容易嗎?

是這樣的:

function selectPosition(maxAngle:Number, maxDistance:Number):Object 
{ 
    var base:Number = rotation + (-(maxAngle/2) + Math.random()*maxAngle); 
    var radians:Number = base/180 * Math.PI; 

    var dist:Number = Math.random()*maxDistance; 

    return { 
     x: Math.cos(radians) * dist, 
     y: Math.sin(radians) * dist 
    }; 
} 

var result:Object = selectPosition(30, 100); 
trace(result.x, result.y); 

這將返回一個包含對象和所指定的角度和距離落入x和y點。

上面可以在視覺上表示的是這樣的:

enter image description here

+0

喜,什麼是( - 用於 – sutoL

+0

(maxAngle/2)所以會發生什麼是 - (maxAngle/2)作爲出發?例如,如果maxAngle是60,它將是:-30 + Math.random()* 60,它可以在-30和30之間的任何地方給你。 – Marty

+0

這是如果你不需要一個完美的三角形,確實更好。 –