外部时钟
SpriteJS有自己的canvas内容更新机制,只要layer中的元素的属性有变化,layer就会将该元素放到等待刷新的列表中,在下一个渲染周期内刷新。这是SpriteJS内置的更新机制。
不过,SpriteJS可以使用外部时钟进行canvas更新。这使得它对很多第三方库非常友好。
SpriteJS要指定layer使用外部时钟,可以手动调用layer的draw
方法,同时要屏蔽掉layer自己的更新机制,可以在创建layer的时候指定选项{autoRender:false}
。
这个例子演示了SpriteJS和curvejs联合使用,在这里我们使用外部ticker调用SpriteJS的layer.draw(false)
方法。参数false是指定layer在绘制的时候不clear掉canvas中的内容(因为curvejs中已经做了这件事)。
;(async function () {
const birdsJsonUrl = 'https://s5.ssl.qhres.com/static/5f6911b7b91c88da.json';
const birdsRes = 'https://p.ssl.qhimg.com/d/inn/c886d09f/birds.png';
const scene = new Scene('#curvejs', {
resolution: [1540, 600],
viewport: 'auto',
});
const layer = scene.layer('fglayer', {
autoRender: false,
});
await scene.preload([birdsRes, birdsJsonUrl]);
const s = new Sprite('bird1.png');
s.attr({
anchor: [0.5, 0.5],
pos: [300, 100],
transform: {
scale: [0.5, 0.5],
},
offsetPath: 'M10,80 q100,120 120,20 q140,-50 160,0',
zIndex: 200,
});
s.animate([
{offsetDistance: 0},
{offsetDistance: 1},
], {
duration: 3000,
direction: 'alternate',
iterations: Infinity,
});
s.animate([
{scale: [0.5, 0.5], offsetRotate: 'auto'},
{scale: [0.5, -0.5], offsetRotate: 'reverse'},
{scale: [0.5, 0.5], offsetRotate: 'auto'},
], {
duration: 6000,
iterations: Infinity,
easing: 'step-end',
});
s.animate([
{textures: 'bird1.png'},
{textures: 'bird2.png'},
{textures: 'bird3.png'},
], {
duration: 300,
direction: 'alternate',
iterations: Infinity,
});
layer.appendChild(s);
const util = {
random(min, max) {
return min + Math.floor(Math.random() * (max - min + 1));
},
randomColor() {
return ['#22CAB3', '#90CABE', '#A6EFE8', '#C0E9ED', '#C0E9ED', '#DBD4B7', '#D4B879', '#ECCEB2', '#F2ADA6', '#FF7784'][util.random(0, 9)];
},
};
const {Stage, Curve, motion} = curvejs;
const randomColor = util.randomColor,
stage = new Stage(layer.canvas);
stage.add(new Curve({
points: [378, 123, 297, 97, 209, 174, 217, 258],
color: randomColor(),
motion: motion.rotate,
data: Math.PI / 20,
}));
stage.add(new Curve({
points: [378, 123, 385, 195, 293, 279, 217, 258],
color: randomColor(),
motion: motion.rotate,
data: Math.PI / 20,
}));
function tick() {
stage.update();
layer.draw(false);
requestAnimationFrame(tick);
}
tick();
}())