2012-10-21 3 views
2

여기에 객체 배열을 만드는 actionscript3 코드가 있습니다. 기본적으로 배열에는 동일한 객체의 인스턴스가 여러 개 있습니다. 개체를 90도 회전시키는 f0 함수를 호출하는 이벤트 리스너를 만들고 싶습니다. 내 문제는 배열에있는 각 개체에 고유 한 식별자를 할당하는 방법을 찾을 수 없다는 것입니다. 따라서 개체를 클릭 할 때 배열을 회전 시키지만 배열의 첫 번째 요소 만 회전합니다. 또한 객체가 (0,0)으로 회전하지 않도록 회전을 중앙에 배치하려고합니다.actionscript3의 객체 배열에 고유 식별자 할당

package 
{ 
import flash.display.Graphics; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.geom.ColorTransform; 
import flash.geom.Matrix; 
import flash.geom.Point; 
import flash.geom.ColorTransform; 

public class Main extends Sprite 
{ 
    var array = new Array(); 
    var i:int; 


    public function Main():void 
    { 
     if (stage) init(); 
     else addEventListener(Event.ADDED_TO_STAGE, init); 
    } 



private function init(e:Event = null):void 
    { 

     for (var i:int = 0; i < 10; i++) 
     { 
      var asd:Sprite = new Sprite(); 
      asd.graphics.beginFill(0x0000ff); 
      asd.graphics.drawRect(0, 0, 60, 60); 
      array.push(asd); 
      addChild(array[i]); 
      array[i].x = 60 * i ; 
      array[i].y = 60 * i ; 
      array[i].addEventListener(MouseEvent.CLICK, f0); 
      if (i % 2 == 0) { 
      asd.graphics.lineTo(asd.x + 60, asd.y + 60); 
      } 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
     } 
    } 
private function f0(e:Event):void 
    { 
     array[i].rotation += 90; 
    } 
} 

}

답변

1

이벤트 처리기에 추가 된 객체에 event.target 포인트, 올바른 스프라이트를 회전하는 것을 사용할 수 있습니다.

private function rotateAroundCenter (ob:DisplayObject, angleDegrees:Number):void 
{ 
    var matrix:Matrix = ob.transform.matrix; 

    var rect:Rectangle = ob.getBounds(this.parent); 

    matrix.translate(- (rect.left + (rect.width/2)), - (rect.top + (rect.height/2))); 

    matrix.rotate((angleDegrees/180)*Math.PI); 

    matrix.translate(rect.left + (rect.width/2), rect.top + (rect.height/2)); 

    ob.transform.matrix = matrix; 
} 

이 (0,0)에 오브젝트 센터 변환을 회전 한 후 원래 위치의에 다시 개체를 변환 : 그것은 당신이 할 수있는 센터의 주위에

private function init(e:Event = null):void 
{ 
    for (var i:int = 0; i < 10; i++) 
    { 
     createObject(i); 
    } 
} 

private function createObject(index:int):void 
{ 
    var asd:Sprite = new Sprite(); 
    asd.graphics.beginFill(0x0000ff); 
    asd.graphics.drawRect(0, 0, 60, 60); 
    array.push(asd); 
    addChild(asd); 
    array[index].x = 60 * index ; 
    array[index].y = 60 * index ; 
    array[index].addEventListener(MouseEvent.CLICK, f0); 
    if (index % 2 == 0) { 
     asd.graphics.lineTo(asd.x + 60, asd.y + 60); 
    } 

} 

private function f0(e:Event):void 
{ 
    e.target.rotation += 90; 
} 

는 객체를 회전합니다. 객체가 부모를 가지고 폭 값이 0이 아닌 경우에만 작동합니다.

+0

이제는 함수 rotateAroundCenter의 이벤트 처리기에서 객체에 대한 포인터를 추가 할 때 오류가 발생합니다. col : 25 오류 : 정적 유형 객체를 사용하는 값과 관련없는 유형의 암시 적 강제 형변환 flash.display : DisplayObject.private 기능 F0 (예 : 이벤트) : 보이드 \t \t 개인 함수 (F0) (예 : 이벤트) : 보이드 \t \t \t \t { \t rotateAroundCenter (e.target, 90); \t \t} – wedran

+0

오브젝트를 DisplayObject 또는 DisplayObject로 event.target을 사용하여 표시 오브젝트에 캐스팅 할 수 있습니다. –

+0

아, 작동합니다, 많은 감사합니다! – wedran