具有相等间距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

我不知道如何将晶体平均同时使它们围绕怪物圈出。为了实现这一目标需要做什么?

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);

您可以随时更改 RADIUS speed ,以及添加/删除项目,这要归功于运动平滑,所有这些都看起来同样好。

<</p>

最新更新