我有一个生产水晶的怪物。我希望每个水晶绕着怪物运行,但是当有一个以上的水晶时,我希望它们以相同的距离彼此进行轨道运动。我一直试图使用我已经拥有的两个代码块来实现这个功能,但每个代码都做了不同的事情,我需要一个代码块才能完成所有这些代码。
这个块只允许一个物体围绕另一个物体运行:
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 :(得分: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);
您可以随时更改半径和速度,以及添加/删除项目,这要归功于动画平滑,所有内容看起来都一样。