easelJS

easelJS - Cache_vday

$(function() {
    init();
});
// Cache_vday

var canvas;
var stage;
var container;
var captureContainers;
var captureIndex;

function init(e) {
    
    canvas = document.getElementById('demo1');
    stage = new createjs.Stage(canvas);
    
    var w = canvas.width;
    var h = canvas.height;
    
    container = new createjs.Container();
    stage.addChild(container);
    container.name = "cname";
    
    captureContainers = [];
    captureIndex = 0;
    
    for(var i=0;i<1;i++){ // i<1就看一个的轨迹;但是还是会有多个显示出来;
        var heart = new createjs.Shape();
        heart.graphics.beginFill(createjs.Graphics.getHSL(Math.random()*30-45,100,50+Math.random()*30));
        heart.graphics.moveTo(0,-9).curveTo(0,-20,8,-20).curveTo(16,-20,16,-10).curveTo(16,0,0,12);
        heart.graphics.curveTo(-16,0,-16,-10).curveTo(-16,-20,-8,-20).curveTo(0,-20,0,-9);
        heart.y = -100;
        
        container.addChild(heart);
    }
    
    var text = new createjs.Text("the longer I'm with you
the more I love you","bold 24px Arial","#312");
    text.textAlign = "center";
    text.x = w/2;
    text.y = h/2;
    stage.addChild(text);
    
    for(i=0;i<100;i++){ // 这个如果i<10,就会看到其轨迹;
        var captureContainer = new createjs.Container();
        captureContainer.name = "cname"+i; // ADD 设置一个名字;
        captureContainer.cache(0,0,w,h); // 缓存的内容是什么东西?
        captureContainers.push(captureContainer);
    }
    
    createjs.Ticker.addEventListener("tick",tick);
    createjs.Ticker.setFPS(30);
}

function tick(event) {
    var w = canvas.width;
    var h = canvas.height;
    var l = container.getNumChildren();
    console.log("container.getNumChildren() is : "+container.getNumChildren());
    if(l>1){
        console.log("l > 1"); // l始终等于1;为什么界面上面会有两个以上的心形标记?而且心的速度也是一样的;
    } // 为什么会有两个以上? 表面上看着是心在动,实际是不停的播放不同的图片container,当heart.y<-50的时候,会重新设置一下heart;
      // 每一个heart经过屏幕的时候,被100个container依次给cache了;
    
    captureIndex = (captureIndex+1)%captureContainers.length;
    console.log("stage.getChildAt(0) is : "+stage.getChildAt(0)); // ADD 看看是什么东西,是Container;
    console.log("stage.getNumChildren() is : "+stage.getNumChildren()); // ADD 看看有多少个孩子? 始终是2个孩子;
    stage.removeChildAt(0); // 移除了谁?移除了container
    var captureContainer = captureContainers[captureIndex];
    stage.addChildAt(captureContainer, 0); // 每次都往0位置上面添加?是的;
    captureContainer.addChild(container); // 再把container作为孩子加了进来;
    
    for(var i=0;i<l;i++){
        var heart = container.getChildAt(i);
        if(heart.y < -50){ // 第一次重新处理一下坐标;不仅仅执行一次;当y坐标逐渐递减小于-50的时候,就需要重新执行一下;
            console.log("this is reset y");
            heart._x = Math.random()*w;
            heart.y = h*(1+Math.random())+50; // 重新修正y坐标;
            heart.perX = (1+Math.random())*h;
            heart.offX = Math.random()*h;
            heart.ampX = heart.perX*0.1*(0.2+Math.random());
            heart.velY = -Math.random()*2-2;
            heart.scaleX = heart.scaleY = Math.random()+1;
            heart.rotation = Math.random()*40-20;
            heart.alpha = Math.random();
        }
        heart.y += heart.velY; // 每次减少一下y坐标;
        heart.x = heart._x+Math.cos((heart.offX+heart.y)/heart.perX*Math.PI*2)*heart.ampX;
    }
    
    captureContainer.updateCache("source-over");
    
    stage.update(event);
}
原文地址:https://www.cnblogs.com/stono/p/5706303.html