Flash AS3 / remover ou parar uma função

Preciso da resposta ao que parece ser uma pergunta óbvia, mas não a encontro em lado nenhum. Como se pára uma função no Flash AS3? Por exemplo básico, quando eu pressiono um botão, a função começa a funcionar. Quando eu pressiono o botão novamente, a função pára.

mais especificamente, como posso adaptar isto a uma declaração if/booleana (ou similar) de modo que quando/enquanto a variável é verdadeira, a função começa a funcionar. Uma vez que a variável false, A função deixa. Quando se torna verdade novamente, o processo se repete.

o código em questão é esta função de planeamento que outro utilizador ajudou a criar para mim.

        if(Zoomed == true) {
                MovieClip.y = stage.stageHeight / 2;
                MovieClip.x = stage.stageWidth / 2;
                addEventListener(MouseEvent.MOUSE_MOVE, panFunction);
                function panFunction(me: MouseEvent): void {
                    MovieClip.x = stage.stageWidth / 2 - (stage.mouseX - stage.stageWidth / 2);
                    MovieClip.y = stage.stageHeight / 2 - (stage.mouseY - stage.stageHeight / 2);
                }

}

Como podem ver, eu quero que quando a função booleana 'Zoomed' for verdadeira, a função activa-se e a funcionalidade de panning funciona. O problema é que quando eu voltar para Zoomed == false, A função ainda está em execução. Estou a tentar descobrir como impedir que isto aconteça.

Eu tentei um loop' while ' mas ele em última análise, apenas congela a animação (provavelmente porque é uma imagem em movimento e está tentando renderizar cada moldura com este código).

resumindo: preciso de uma maneira de uma função poder ser ligada e desligada. Alternativamente, ser capaz de adicioná-lo e removê-lo quando é necessário/não necessário deve funcionar o mesmo. Qualquer ajuda neste seria uma grande ajuda, obrigado!

Author: Jrex, 2016-07-14

1 answers

O que você precisa fazer é remover o ouvinte de eventos quando você não quer mais panning.

Algo assim, que assume que se muda o valor de zoomed num Clique:

var zoomed:Boolean = false; //a var to store whether we are currently zoomed

//change the zoom on mouse click
addEventListener(MouseEvent.CLICK, zoomClick);

function panFunction(me:MouseEvent): void {
    mc.x = stage.stageWidth / 2 - (stage.mouseX - stage.stageWidth / 2);
    mc.y = stage.stageHeight / 2 - (stage.mouseY - stage.stageHeight / 2);
}

function zoomClick(me:MouseEvent):void {
    zoomed = !zoomed; //toggle the zoomed value

    if(zoomed){
        //we're zoomed, so add the panning mouse move listener
        addEventListener(MouseEvent.MOUSE_MOVE, panFunction);
        //do whatever else you need to when first zoomed.
    }else{
        //no longer zoomed, remove the mouse move listener
        removeEventListener(MouseEvent.MOUSE_MOVE, panFunction);
    }
}

Algumas notas, a palavra MovieClip não é um bom nome de instância, pois pode entrar em conflito com o nome da classe MovieClip, eu recomendaria renomeá-la mc ou algo mais para evitar problemas potenciais mais tarde.

Também, evite funções inline (funções declaradas / contidas noutras funções), elas podem ser especialmente problemático quando ligado aos ouvintes de eventos e são uma boa maneira de introduzir vazamentos de memória em seu programa.

 3
Author: BadFeelingAboutThis, 2016-07-14 17:00:19