2017-10-01 8 views
1

크리스탈을 생성하는 괴물이 있습니다. 나는 각 크리스탈이 몬스터의 궤도를 돌기를 원하지만, 크리스탈이 하나 이상일 때, 나는 서로 같은 거리를두고 궤도에 올랐 으면한다. 나는 이미 가지고있는 코드의 두 블록을 사용하여 이것을 작동 시키려고 노력했지만, 각각은 다른 것을하고 있으며, 나는 그것을하는 한 블록의 코드가 필요하다. 이 https://www.youtube.com/watch?v=ACclpQBsjPo등 간격의 궤도를 그리는 물체 AS3

이 코드 블록의 양에 따라 몬스터의 주위에 결정을 주선 : 여기

orbitRadius = 110; 
angle += orbitSpeed; 
rad = (angle * (Math.PI/180)); 
orbitX = monster.x + orbitRadius * Math.cos(rad); 
orbitY = monster.y + orbitRadius * Math.sin(rad); 

가 어떻게 생겼는지의 비디오입니다 :

이 블록은 단순히 객체가 다른 궤도를 할 수 있습니다

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

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

는 움직임 덕분에 모든 것을 부드럽게 똑같이 잘 보입니다.

+0

글쎄, 나는 분명히 그것을 계층 적 방법으로하고 있지 않다. 그것은 정말로 총체적 일 것입니다. 그리고이 솔루션은 내 코드를 약간 수정하는 것이 아니라 완전히 다른 접근 방식이라고 생각합니다. 이 프로그램을 현재 프로그램으로 변환하는 방법을 알아 내려고 노력하고 있습니다. 나는 Timer 나 Point 클래스를 사용하지 않고, "rotation"변수가 객체의 회전 속성을 참조하지 않고 고유 변수라고 가정합니다. –

+0

아, 처음에는 ** Sprite **의 하위 클래스가 아니기 때문에이 선언문을 만들었으므로 이제는이 선언을 할 필요가 없습니다. 결정된. 또한 옵션 1에 대한 당신의 혐오감을 이해하지 못합니다. 이것은 일을하는 전통적인 플래시 방식입니다. – Organis