Flash AS3 / remover ou parar uma função
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!
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.