sparkletown/sparkle

View on GitHub
src/components/templates/AnimateMap/game/map/systems/SpriteSystem.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { ListIteratingSystem } from "@ash.ts/ash";
import { Container, Sprite } from "pixi.js";

import { SpriteNode } from "../nodes/SpriteNode";

export class SpriteSystem extends ListIteratingSystem<SpriteNode> {
  private _container?: Container | null;

  constructor(container?: Container | null) {
    super(SpriteNode);

    this._container = container;
  }

  public updateNode(node: SpriteNode, time: number) {
    const view = node.sprite.view;
    const position = node.position;

    if (!view) {
      return;
    }

    view.setTransform(
      position.x,
      position.y,
      position.scaleX,
      position.scaleY,
      position.rotation
    );
  }

  public nodeAdded = (node: SpriteNode) => {
    let view = node.sprite.view;

    if (!view) {
      const imageUrl = node.sprite.imageUrl;

      if (imageUrl && imageUrl !== "") {
        view = Sprite.from(node.sprite.imageUrl);
      } else {
        view = new Sprite();
      }

      node.sprite.view = view;
    }

    view.anchor.set(0.5);

    if (!this._container?.children.includes(view)) {
      this._container?.addChild(view);
    }
  };

  public nodeRemoved = (node: SpriteNode) => {
    const view = node.sprite.view;
    if (view && this._container?.children.includes(view)) {
      this._container?.removeChild(view);
    }
  };
}