import * as PIXI from "pixi.js"; import { AsyncComponent, DisplayObjectMutable, DisplayObjectProps, Sprite, } from "../types"; import { getDisplayObjectMutable, setDisplayObjectProps } from "../utils"; type Props = { texture: string; } & DisplayObjectProps; type Mutable = { setTexture: (texture?: string) => Promise; } & DisplayObjectMutable; export const spriteComponent: AsyncComponent = async ({ texture = undefined, ...props }) => { const spriteTexture = texture ? await PIXI.Assets.load(texture) : PIXI.Texture.EMPTY; const _getTexture = async (texture?: string) => { const targetTexture = texture ? await PIXI.Assets.load(texture) : PIXI.Texture.EMPTY; targetTexture.source.scaleMode = "nearest"; return targetTexture; }; const sprite = new PIXI.Sprite(spriteTexture) as Sprite; setDisplayObjectProps(sprite, props); return { // container ...getDisplayObjectMutable(sprite), // sprite setTexture: async (texture?: string) => { sprite.texture = await _getTexture(texture); }, } as Mutable; };