2016-09-16 33 views
1

單個對象中刪除股票我想刪除的偵聽器被動畫的單個對象。我想刪除單個對象的代碼,因爲它們會在不同的時間停止,當它們在y中達到200px時。此代碼是Adobe Animate中的一個框架。所以這個代碼不工作:在createjs

this.stop(); 

that= this; 

var aParticle; 
var mySpeed = 12; 
var myRotation = 4; 
var totalParticles = 5; 
var stopParticles = false; 
var particleHolder = new createjs.Container(); 
var count = 0; 

var collission_ar = [this.parent.mc_coll0, this.parent.mc_coll1, `this.parent.mc_coll2, this.parent.mc_coll3, this.parent.mc_coll4,  this.parent.mc_coll5, this.parent.mc_coll6, this.parent.mc_coll7, this.parent.mc_coll8, this.parent.mc_coll9, this.parent.mc_coll10, this.parent.mc_coll11, this.parent.mc_coll12, this.parent.mc_coll13, this.parent.mc_coll14];` 
var totalCollisions = collission_ar.length; 
this.addChild(particleHolder); 


//stage.update(); 

var xRange = width; 
var yRange = height; 

var scaleNum = 1; 
//var collisionMethod = ndgmr.checkPixelCollision; 

this.scaleX = 1; 
this.scaleY = 1; 

createParticles() 

setTimeout(function(){ 
    removeTimer(); 
}, 5000) 

function createParticles(){ 

    var particle_ar = []; 
    var randNum = Math.ceil(Math.random() * totalParticles); 

    aParticle = new lib['MC_leaf'+randNum](); 
    aParticle.name = 'MC_leaf'+count; 
    aParticle.x = Math.random() * xRange; 
    aParticle.y = -Math.random() * 15; 

    theNum = Math.random() * scaleNum; 
    aParticle.scaleX = theNum 
    aParticle.scaleY = theNum 
    aParticle.alpha = 1; 
    aParticle.collision = Math.floor(Math.random() * 2); 
    particleHolder.addChild(aParticle); 
    aParticle.addEventListener("tick", animateParticle.bind(that)); 
    if(!stopParticles){ 
     timer = setTimeout(function() { createParticles() }, 100); 
    } 
    count++; 
} 

function animateParticle (event){ 
    var part = event.currentTarget; 

    event.currentTarget.y += mySpeed 
    event.currentTarget.x += Math.random()/10 
    event.currentTarget.rotation += myRotation; 

    if (part.y > 200) { 

     if(part.name == 'MC_leaf0') console.log('part0 y '+part.y); 
     part.removeEventListener("tick", animateParticle.bind(that)); 
    } 

} 

function removeTimer() { 
    stopParticles = true; 
    timer = clearInterval(); 

} 


var timer = setTimeout(function() { createParticles() }, 100, that); 

因此,這段代碼只是忽略: part.removeEventListener( 「嘀」,animateParticle.bind(即));

回答

0

您必須將與addEventListener一起使用的removeEventListener中的同一方法的引用傳遞給您。當您使用bind時,它每次都會生成一個包裝函數。

// This won't work. 
part.removeEventListener("tick", animateParticle.bind(that)); 

一個簡單的解決方法是存儲對綁定函數的引用,並使用它。

aParticle.tickHandler = animateParticle.bind(that); 
aParticle.addEventListener("tick", aParticle.tickHandler); 

消除聽者

part.removeEventListener("tick", part.tickHandler); 

有一個更好的方式來處理這個問題,雖然在隨後使用它。如果使用實用程序on()而不是addEventListener,則可以輕鬆地刪除處理程序中的方法。

aParticle.on("tick", animateParticle, that); 

// Then when removing: 
function animateParticle(event) { 
    if (conditions) { 
     event.remove(); 
    } 
} 

on()方法也有一個scope參數,這樣你就可以跳過功能結合。值得注意的是,雖然重要的是,on()方法做它自己的內部約束力,所以要去除一個監聽器通常的方式,你必須存儲對它的引用也是如此。

var listener = target.on("tick", handler, this); 
listener.off("tick", listener); 

希望有所幫助!

+0

很好,謝謝,蘭尼! – 4n6design

+0

在上面的相同代碼中,我將創建粒子的計時器更改爲setInterval,我失去了範圍,並且找不到如何停止時間間隔。 VAR計時器= setTimeout的(函數(){createParticles()},100,即); 最終的代碼進到功能: 功能removeTimer(){ stopParticles = TRUE; timer = clearInterval();這裏 } 計時器不會clearInterval。我做錯了什麼? – 4n6design