我有一个产生晶体的怪物。我希望每个晶体能绕怪物绕,但是当有多个晶体时,我希望它们彼此相等的距离绕轨道绕。我一直在尝试使用我已经拥有的两个代码块使它工作,但是每个代码都做了不同的事情,我需要一个代码来完成所有操作。
此块仅允许对象绕另一个绕:
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>