Производительность кода, прослушиватели событий, несколько вращающихся блоков - PullRequest
2 голосов
/ 22 февраля 2011

Я создал сетку из трехмерных кубов, используя модуль, а трехмерные кубы были созданы из учебника по математике и Flash

Я настроил слушателей, чтобы при наведении курсора мышинад кубом он начинает вращаться:

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

Я понимаю, почему это было бы неэффективно, поскольку он запускает цикл каждый кадри для стольких множественных кубов он просто отстает (очень плохо).

У кого-нибудь есть лучший способ сделать это?Я был бы рад опубликовать больше кода, если людям это нужно / нужно.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Я должен уточнить, я надеюсь, что вращение будет продолжаться бесконечно, как только мышь движется от куба.

2-е РЕДАКТИРОВАНИЕ:

Вот как я создаю кубы на «сетке»:

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 ]

3 голосов
/ 22 февраля 2011

Новый ответ:

В этом случае вы можете поместить каждый куб, который вы хотите повернуть, в массив и вызвать ENTER_FRAME для клипа контейнера (не для каждого куба).

Loopingчерез ваш массив (в контейнере) будет быстрее, чем отправлять тонны событий ENTER_FRAME (я думаю).

(запросите примеры, если вам нужно; D)


Пример

Предполагая, что renderView является методом MenuCube, я предлагаю вам поместить весь код, необходимый для вращения, в renderView (информация, такая как i++, curTheta и curPhi).

// 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();
    }
}

Старый ответ:

Если я правильно понял, вы можете использовать события MOUSE_OVER и MOUSE_OUT:

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

Таким образом, ваши события мыши будут отправляться только при наведении курсора мыши на spBoard.

ps. Как видите, переменная i должна быть определена вне функций, чтобы это работало.

1 голос
/ 22 февраля 2011

Используйте анимационную библиотеку для анимации (она заменяет обработчик события enter frame).Большинство из этих библиотек гораздо эффективнее, чем «вручную» с помощью обработчика ввода, и, например, будут выполнять несколько шагов анимации в одном обработчике.Таким образом, вместо вызова n функций (для n квадратов, которые необходимо повернуть), он просто вызывает одну функцию, которая выполняет анимацию одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...