2

ここに、オブジェクトの配列を作成する actionscript3 コードがあります。基本的に、配列には同じオブジェクトの複数のインスタンスがあります。オブジェクトを 90 度回転させる関数 f0 を呼び出すイベント リスナーを作成したいと考えています。私の問題は、配列内の各オブジェクトに一意の識別子を割り当てる方法が見つからないため、オブジェクトをクリックすると回転させたいのですが、配列の最初の要素のみが回転します。また、オブジェクトが (0,0) で回転しないように、回転を中央に配置したいと考えています。

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

}

4

1 に答える 1

1

event.targetは、イベントハンドラーが追加されたオブジェクトを指します。これを使用して、正しいスプライトを回転させることができます。

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

オブジェクトをその中心の周りで回転させるには、次のことができます。

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)に変換されて回転し、オブジェクトが元の位置に戻されます。オブジェクトに親があり、幅の高さがゼロ以外の場合にのみ機能します。

于 2012-10-21T17:26:39.737 に答える