2017-10-01 70 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