首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3等间距在轨物体

AS3等间距在轨物体
EN

Stack Overflow用户
提问于 2017-10-01 00:08:36
回答 1查看 46关注 0票数 1

我有个怪物能产生水晶。我希望每个水晶围绕着怪物,但是当有不止一个晶体时,我希望它们以相等的距离运行。我一直在尝试用我已经拥有的两块代码来完成这个任务,但是每个代码都有不同的功能,我需要一段代码来完成所有的任务。

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

代码语言:javascript
复制
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

此代码块根据晶体的数量将晶体围绕在怪物周围排列,有:

代码语言:javascript
复制
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

我不知道如何同时把晶体和放在一起,让它们绕着怪物转。要做到这一点,需要做些什么?

EN

回答 1

Stack Overflow用户

发布于 2017-10-01 01:12:41

1)分层方式:将晶体放入同一个容器中,使它们均匀分布(就像在第二个视频中所做的那样),然后旋转容器。

2)数学方法。

执行情况:

代码语言:javascript
复制
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;
    }
}

用法:

代码语言:javascript
复制
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 fine ,以及添加/删除项,这要感谢运动平滑,这一切看起来都一样好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46508123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档