继承元素类型

我们可以继承Sprite、Label、Path等元素创建我们自己的精灵类型。

  1. const {Scene, Label} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const setDefault = Symbol.for('spritejs_setAttributeDefault');
  10. class ButtonAttr extends Label.Attr {
  11. constructor(subject) {
  12. super(subject);
  13. this[setDefault]({
  14. text: ' ',
  15. fontSize: 36,
  16. lineHeight: 48,
  17. anchorX: 0.5,
  18. anchorY: 0.5,
  19. borderWidth: 1,
  20. borderColor: 'black',
  21. paddingRight: 10,
  22. paddingLeft: 10,
  23. textAlign: 'center',
  24. });
  25. }
  26. }
  27. class Button extends Label {
  28. static Attr = ButtonAttr;
  29. constructor(attrs = {}) {
  30. super(attrs);
  31. this.addEventListener('mousedown', () => {
  32. this.attr({scale: 0.9});
  33. });
  34. this.addEventListener('mouseup', () => {
  35. this.attr({scale: 1.0});
  36. });
  37. this.addEventListener('mouseenter', () => {
  38. this.layer.canvas.style.cursor = 'pointer';
  39. });
  40. this.addEventListener('mouseleave', () => {
  41. this.layer.canvas.style.cursor = '';
  42. });
  43. }
  44. }
  45. const button = new Button({
  46. text: 'Click Me',
  47. pos: [600, 300],
  48. });
  49. layer.append(button);
  50. button.addEventListener('click', () => {
  51. console.log('button clicked');
  52. });

注册元素类型

创建了精灵类型后,尽管我们已经可以直接使用这些新的元素,但我们可以最好spritejs.registerNodeType方法将它们注册到框架中,这样就可以通过spritejs.createElment来创建该类型的元素,d3和vue等第三方框架也需要用spritejs.createElement来创建对应的元素。

  1. spritejs.registerNodeType('button', Button);
  2. const button = spritejs.createElement('button');