2017-10-01 111 views
1

我有一個可以產生晶體的怪物。我希望每個水晶都繞着怪物運行,但是當有多個水晶時,我希望它們彼此以相等的距離繞行。我一直試圖通過使用兩個已有的代碼塊來實現這個功能,但每個代碼都做了一些不同的事情,我需要一塊代碼來完成這些工作。等距空間軌道物體AS3

此塊只是允許一個對象軌道另一:

orbitRadius = 110; 
angle += orbitSpeed; 
rad = (angle * (Math.PI/180)); 
orbitX = monster.x + orbitRadius * Math.cos(rad); 
orbitY = monster.y + orbitRadius * Math.sin(rad); 

這裏是什麼樣子的視頻: https://www.youtube.com/watch?v=ACclpQBsjPo

基於量的代碼塊排列周圍的怪物晶體晶體有:

radius = 110; 
angle = ((Math.PI * 2)/targetArray.length) * targetArray.indexOf(this); 
orbitX = monster.x - (radius * Math.cos(angle)); 
orbitY = monster.y - (radius * Math.sin(angle)); 

而這裏的這個視頻:https://www.youtube.com/watch?v=TY0mBHc2A8U

我不知道如何均勻地將晶體空間分開使它們同時在怪物周圍環繞。爲了實現這個目標需要做些什麼?

回答

0

1)分層方式:將晶體放入同一個容器中,使它們均勻分佈(就像你在第二個視頻中做的那樣),然後旋轉容器。

2)數學方法。

實現:

public class Orbiter extends Sprite 
{ 
    // Pixels. 
    public var radius:Number = 100; 

    // Degrees per second. 
    public var speed:Number = 360; 

    public var items:Array; 
    public var lastTime:int; 

    public function start() 
    { 
     stop(); 

     rotation = 0; 
     items = new Array; 
     lastTime = getTimer(); 

     addEventListener(Event.ENTER_FRAME, onFrame); 
    } 

    public function stop():void 
    { 
     items = null; 

     removeEventListener(Event.ENTER_FRAME, onFrame); 
    } 

    public function onFrame(e:Event = null):void 
    { 
     var aTime:int = getTimer(); 

     rotation += speed * (aTime - lastTime)/1000; 
     lastTime = aTime; 

     for (var i:int = 0; i < items.length; i++) 
     { 
      // Get the object. 
      var anItem:DisplayObject = items[i]; 

      // Get the object's designated position. 
      var aPos:Point = getPosition(i); 

      // Follow the position smoothly. 
      anItem.x += (aPos.x - anItem.x)/10; 
      anItem.y += (aPos.y - anItem.y)/10; 
     } 
    } 

    private function getPosition(index:int):Point 
    { 
     // Calculate the angle with regard to the present items amount. 
     var anAngle:Number = (rotation - 360/items.length) * Math.PI/180; 
     var result:Point = new Point; 

     // Figure the position with regard to (x,y) offset. 
     result.x = x + radius * Math.cos(anAngle); 
     result.y = y + radius * Math.sin(anAngle); 

     return result; 
    } 
} 

用法:

var O:Orbiter = new Orbiter; 

// Define the offset. 
O.x = monster.x; 
O.y = monster.y; 

// Set radius and rotation speed. 
O.radius = 110; 
O.speed = 270; 

// Enable the rotation processing. 
O.start(); 

// Append items to orbit. 
O.items.push(Crystal1); 
O.items.push(Crystal2); 
O.items.push(Crystal3); 

您可以更改半徑速度任何時間,以及添加/刪除項目,這要歸功於運動平滑,所有的意志看起來同樣好。

+0

嗯,我絕對不會這樣做的分層方式。那將是非常糟糕的。 我想這個解決方案不會只是對我的代碼進行小小的調整,而是一種完全不同的方法。我想我會花一些時間試圖弄清楚如何將它轉換成我當前的程序。我從不使用Timer或Point類做任何事情,我假定你的「旋轉」變量不是引用對象的旋轉屬性,而是一個唯一的變量。 –

+0

啊,首先我將它創建爲** Sprite **的子類,所以這個聲明現在不是必需的。固定。另外,我不理解你對選項1的厭惡。這是傳統的Flash做事方式。 – Organis