代码性能,事件监听器,多个旋转框

时间:2011-02-22 16:46:27

标签: flash actionscript-3

我使用模数创建了一个三维立方体网格,三维立方体是从数学和Flash tutorial

创建的

我已经设置了监听器,所以当鼠标悬停在一个立方体上时,它开始旋转:

private function setUpListeners():void {

      spBoard.addEventListener(MouseEvent.ROLL_OUT,boardOut);

}

工作正常。

要在鼠标经过它时开始旋转立方体,我使用了:

     private function boardOut(e:MouseEvent):void {

        addEventListener(Event.ENTER_FRAME,rotateSquare);

        var i:int = 1;

        function rotateSquare(e:Event) {
            renderView(curTheta+i,curPhi+i); 
            i++;
         }
}

我可以看出为什么这会效率低下,因为它每隔一帧运行一次循环,对于这么多的多维数据集它只是滞后(非常糟糕)。

有人有更好的方法吗?如果人们需要/需要它,我会很乐意发布更多代码。

提前致谢。

编辑:我应该澄清一下,我希望一旦鼠标离开立方体,旋转将无限期地继续。

第二次编辑:

以下是我在“网格”上创建立方体的方法:

public function FlowerMenu(){

                var rowY:Number = 0;                    
                for (var i:int = 0; i < 190; i++) {
                    var myCube = new CubeMenu(["anemon.jpg","parodia.jpg","anagallis.jpg","lila.jpg","cosmos.jpg","adonis.jpg"],100);
                    myCube.x = 0 + ((i % 10) * 200);
                    if (i % 10 == 0) {
                        rowY += 200;
                    }
                    myCube.y = rowY;
                    addChild(myCube);


                }

2 个答案:

答案 0 :(得分:3)

新答案:

在这种情况下,您可以将要旋转的每个多维数据集放在一个数组中,并在容器剪辑上调用ENTER_FRAME(而不是每个多维数据集)。

循环播放数组(在容器中)将比调度大量的ENTER_FRAME事件(我认为)更快。

(如果需要,请询问示例; D)


实施例

假设renderView是MenuCube的一种方法,我建议您将所有轮换所需的代码放在renderView内(i++curTheta和{{1}等信息})。

curPhi

旧答案:

如果我做对了,你可以使用MOUSE_OVER和MOUSE_OUT事件:

// The container where every cube will reside
public var CubeContainer:Sprite;

// Creating Cubes, setting a listener to rotate them on MOUSE_OVER
// and adding them to the container.
public function CreateCubes()
{
    CubeContainer = new Sprite();

    for (var i:int = 0; i < 10; i++)
    {
        var NewCube = new CubeMenu(/*...*/);

        NewCube.addEventListener(MouseEvent.MOUSE_OVER, RotateMe);

        CubeContainer.addChild(NewCube);
    }

    CubeContainer.addEventListener(Event.ENTER_FRAME, RotateCubes);
}

// When MOUSE_OVER fires, start rotating (by pushing it into an Array)
// and remove MOUSE_OVER listener
public function RotateMe(e:MouseEvent):void
{
    var TargetCube:CubeMenu = e.currentTarget;

    CubesToRotate.push(TargetCube);
    TargetCube.removeEventListener(MouseEvent.MOUSE_OVER, RotateMe);
}

// ENTER_FRAME of the container...
// This will check every container that need to be rotated
// and call renderView for it.
public function RotateCubes(e:Event):void
{
    for(var i:int = 0; i <= CubesToRotate.length; i++)
    {
        var CurrentCube:CubeMenu = CubesToRotate[i];

        CurrentCube.renderView();
    }
}

这样,当您将鼠标移到private var i:int = 0; private function setUpListeners():void { spBoard.addEventListener(MouseEvent.MOUSE_OVER, boardOver); spBoard.addEventListener(MouseEvent.MOUSE_OUT, boardOut); } private function boardOver(e:MouseEvent):void { addEventListener(Event.ENTER_FRAME, rotateSquare); } private function boardOut(e:MouseEvent):void { removeEventListener(Event.ENTER_FRAME, rotateSquare); } private function rotateSquare(e:Event) { renderView(curTheta+i, curPhi+i); i++; } 上时,鼠标事件将仅

ps:如您所见,必须在函数外部定义spBoard变量才能使其生效。

答案 1 :(得分:1)

使用补间库来执行动画(它取代了输入帧事件处理程序)。大多数这些库比使用输入框处理程序“手动”执行它更有效,例如,它将在单个处理程序中执行多个动画步骤。因此,它不是调用n函数(对于需要旋转的n个方格),而是调用一次执行动画的单个函数。