外部时钟

SpriteJS有自己的canvas内容更新机制,只要layer中的元素的属性有变化,layer就会将该元素放到等待刷新的列表中,在下一个渲染周期内刷新。这是SpriteJS内置的更新机制。

不过,SpriteJS可以使用外部时钟进行canvas更新。这使得它对很多第三方库非常友好。

SpriteJS要指定layer使用外部时钟,可以手动调用layer的draw方法,同时要屏蔽掉layer自己的更新机制,可以在创建layer的时候指定选项{autoRender:false}

外部时钟 - 图1

这个例子演示了SpriteJS和curvejs联合使用,在这里我们使用外部ticker调用SpriteJS的layer.draw(false)方法。参数false是指定layer在绘制的时候不clear掉canvas中的内容(因为curvejs中已经做了这件事)。

  1. ;(async function () {
  2. const birdsJsonUrl = 'https://s5.ssl.qhres.com/static/5f6911b7b91c88da.json';
  3. const birdsRes = 'https://p.ssl.qhimg.com/d/inn/c886d09f/birds.png';
  4. const scene = new Scene('#curvejs', {
  5. resolution: [1540, 600],
  6. viewport: 'auto',
  7. });
  8. const layer = scene.layer('fglayer', {
  9. autoRender: false,
  10. });
  11. await scene.preload([birdsRes, birdsJsonUrl]);
  12. const s = new Sprite('bird1.png');
  13. s.attr({
  14. anchor: [0.5, 0.5],
  15. pos: [300, 100],
  16. transform: {
  17. scale: [0.5, 0.5],
  18. },
  19. offsetPath: 'M10,80 q100,120 120,20 q140,-50 160,0',
  20. zIndex: 200,
  21. });
  22. s.animate([
  23. {offsetDistance: 0},
  24. {offsetDistance: 1},
  25. ], {
  26. duration: 3000,
  27. direction: 'alternate',
  28. iterations: Infinity,
  29. });
  30. s.animate([
  31. {scale: [0.5, 0.5], offsetRotate: 'auto'},
  32. {scale: [0.5, -0.5], offsetRotate: 'reverse'},
  33. {scale: [0.5, 0.5], offsetRotate: 'auto'},
  34. ], {
  35. duration: 6000,
  36. iterations: Infinity,
  37. easing: 'step-end',
  38. });
  39. s.animate([
  40. {textures: 'bird1.png'},
  41. {textures: 'bird2.png'},
  42. {textures: 'bird3.png'},
  43. ], {
  44. duration: 300,
  45. direction: 'alternate',
  46. iterations: Infinity,
  47. });
  48. layer.appendChild(s);
  49. const util = {
  50. random(min, max) {
  51. return min + Math.floor(Math.random() * (max - min + 1));
  52. },
  53. randomColor() {
  54. return ['#22CAB3', '#90CABE', '#A6EFE8', '#C0E9ED', '#C0E9ED', '#DBD4B7', '#D4B879', '#ECCEB2', '#F2ADA6', '#FF7784'][util.random(0, 9)];
  55. },
  56. };
  57. const {Stage, Curve, motion} = curvejs;
  58. const randomColor = util.randomColor,
  59. stage = new Stage(layer.canvas);
  60. stage.add(new Curve({
  61. points: [378, 123, 297, 97, 209, 174, 217, 258],
  62. color: randomColor(),
  63. motion: motion.rotate,
  64. data: Math.PI / 20,
  65. }));
  66. stage.add(new Curve({
  67. points: [378, 123, 385, 195, 293, 279, 217, 258],
  68. color: randomColor(),
  69. motion: motion.rotate,
  70. data: Math.PI / 20,
  71. }));
  72. function tick() {
  73. stage.update();
  74. layer.draw(false);
  75. requestAnimationFrame(tick);
  76. }
  77. tick();
  78. }())