动作脚本3:围绕内部点旋转多个形状

时间:2015-04-09 17:33:13

标签: actionscript-3 flash math rotation shapes

我在使用AS3时遇到了麻烦,我必须将其用于我的一个小型研究项目。

AS3项目将创建一些随机放置的正方形,这些正方形将围绕其中心点旋转。

我设法弄清楚如何使用this handy walkthrough在内部旋转它。

但是我无法将此方法应用于在随机选择的舞台点的for循环中创建的所有正方形。只有第一个创建的将旋转

以下是有问题的代码: -

for(var i=0; i<10; i++)
{
    var square:Shape = new Shape();
    this.addChild(square);
    var posX = Math.floor(Math.random() * stage.stageWidth) + 50;
    var posY = Math.floor(Math.random() * stage.stageHeight) + 50;
    square.x=posX;
    square.y=posY;
    var curSquareAng:Number=0;
    var squareRotCenter:Point=new Point(0,0);
    drawShapes();
    var squareMat:Matrix=square.transform.matrix.clone();
}

this.addEventListener(Event.ENTER_FRAME, onEnter);

function onEnter(e:Event):void {
    curSquareAng = (curSquareAng+2)%360;
    rotateSquare(curSquareAng);
}

function rotateSquare(deg:Number):void {
    var mat:Matrix= squareMat.clone();  
    MatrixTransformer.rotateAroundInternalPoint(mat,squareRotCenter.x, squareRotCenter.y, deg);
    square.transform.matrix = mat;
}

我意识到我可能必须为每个正方形的初始中心点创建一个数组并循环它们。但是我完全迷失了如何这样做。你可能会说我不熟悉AS3,非常感谢你能给这个初学程序员提供任何帮助。 :P

2 个答案:

答案 0 :(得分:2)

你需要根据一个形状创建你自己的类,然后你把它充满了代表旋转中心点,当前角度以及你希望你的方块包含的任何其他属性的属性,然后给出类{{ 1}}方法将执行您在update函数中为自己编写的内容。然后,您将更容易控制您的方块能够做什么。这种技术被称为&#34;封装&#34;。

另外,如果您希望广场围绕(0,0)的内部点旋转,则可以设置其onEnter属性以达到所需效果。对于其他点,应使用演练或其等价物。

rotation

现在,你必须保持一个正方形阵列,使它们分开旋转:

public class Square extends Shape {
    public var rotationCenter:Point=new Point();
    private var currentAngle:Number=0;
    public var rotationSpeed:Number=2; // degrees per frame
    private var baseMatrix:Matrix;
    public function Square() {
        // draw the shape on "this.graphics"
        this.graphics.beginFill(0xffff00,1);
        this.graphics.moveTo(-20,-20);
        this.graphics.lineTo(20,-20);
        this.graphics.lineTo(20,20);
        this.graphics.lineTo(20,-20);
        this.graphics.lineTo(-20,-20);
        this.graphics.endFill();
        // if not set in declaration, set internal vars
        baseMatrix=this.transform.matrix; // likely identity matrix, but let's initialize anyway
    }
    public function storeMatrix():void {
        // you are positioning a square after you create it, so probably you want its new location to be transformed
        // that one's matrix will no longer be an identity, so go capture
        baseMatrix=this.transform.matrix;
    }
    public function update():void {
        // should be called once per frame
        currentAngle=(currentAngle+rotationSpeed)%360;
        var mat:Matrix= baseMatrix.clone();
        MatrixTransformer.rotateAroundInternalPoint(mat,rotationCenter.x, rotationCenter.y, currentAngle);
        this.transform.matrix = mat;
    }
}

答案 1 :(得分:0)

没关系。谢谢Vesper让我走上了正确的轨道我已经设法通过你的输入解决了我的问题(不一定按照你的方式,但你的输入帮助我按照说法到达目的地)。

我认为我通过矩阵路线使它变得有点复杂,而是使用形状数组来循环方块并添加旋转。我遇到的解决方案有点简单但完成工作。

    public var rotationSpeed:Number=2; // degrees per frame
    public var square:Array = new Array(  );
    public function Square() {

        for (var i:int=0;i<10;i++) {
            square[i] = new Shape();
            var posX = Math.floor(Math.random() * stage.stageWidth) + 50;
            var posY = Math.floor(Math.random() * stage.stageHeight) + 50;
            square[i].graphics.lineStyle();
            var rgb = Math.random() * 0xFFFFFF;
            square[i].graphics.beginFill(rgb);
            // -50 determines where the spin will center from.
            square[i].graphics.drawRect(-50,-50,100,100);
            square[i].graphics.endFill();
            square[i].x = posX;
            square[i].y = posY;
            addChild(square[i]);
        }
        addEventListener(Event.ENTER_FRAME,onEnter);
    }

    private function onEnter(e:Event):void {
        for (var i:int=0; i < square.length; i++) {
            getChildAt(i).rotation += rotationSpeed;
        }
    }