以等间距AS3轨道运行物体

时间:2017-10-01 00:08:36

标签: actionscript-3

我有一个生产水晶的怪物。我希望每个水晶绕着怪物运行,但是当有一个以上的水晶时,我希望它们以相同的距离彼此进行轨道运动。我一直试图使用我已经拥有的两个代码块来实现这个功能,但每个代码都做了不同的事情,我需要一个代码块才能完成所有这些代码。

这个块只允许一个物体围绕另一个物体运行:

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

我不知道如何同时将水晶间隔让它们同时围绕怪物。为实现这一目标需要做些什么?

1 个答案:

答案 0 :(得分: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);

您可以随时更改半径速度,以及添加/删除项目,这要归功于动画平滑,所有内容看起来都一样。