2017-10-01 5 views
1

私は結晶を生成するモンスターを持っています。私は各クリスタルがモンスターの軌道に乗ることを望みますが、複数のクリスタルがある場合、それらのクリスタルが互いから等距離で周回するようにします。私は既にこれを持っている2つのコードブロックを使ってこれを動作させようとしてきましたが、それぞれ異なるものがあり、私はそれをすべて行う1ブロックのコードが必要です。 がhttps://www.youtube.com/watch?v=ACclpQBsjPo等間隔の旋回するオブジェクトAS3

このコードブロックは、量に基づいて、モンスターの周りに結晶を配置:ここ

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

は、それがどのように見えるかのビデオだ:

このブロックは、単にオブジェクトが他を周回することができます結晶があります。

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番目のビデオのように)。次にコンテナを回転させます。

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クラスを決して使用しません。あなたの "rotation"変数は、オブジェクトの回転プロパティを参照するのではなく、一意の変数であると仮定します。 –

+0

ああ、まず、** Sprite **のサブクラスではなく、この宣言を作成しました。一定。また、オプション1についてのあなたの嫌悪感を理解していません。これは、従来のFlashのやり方です。 – Organis

関連する問題