Published unlisted
Edited
Jul 7, 2020
Insert cell
md`# Pixi Spritesheet Loader`
Insert cell
delay = 1000
Insert cell
url = "https://vikusviewer.fh-potsdam.de/smb/beide/data/sprites/web_web_full.json" //
Insert cell
baseUrl = url.substring(0, url.lastIndexOf('/')) + "/"
Insert cell
data = await fetch(url).then(r => r.json())
Insert cell
function extractSpriteTexture(texture, sprite) {
const frame = new PIXI.Rectangle(
sprite.position.x,
sprite.position.y,
sprite.dimension.w,
sprite.dimension.h
);
const orig = new PIXI.Rectangle(
0,
0,
sprite.dimension.w,
sprite.dimension.h
);
return new PIXI.Texture(texture, frame, orig, false, false);
}
Insert cell
async function* loadTextures() {
const textures = [];
const baseTextures = [];

invalidation.then(() => {
console.log("invalidate textures");
for (const [id, texture] of textures.flat()) {
texture.destroy();
}
});
for (const sprites of data.spritesheets) {
const baseTexture = await loadTexture(baseUrl + sprites.image);
baseTextures.push(baseTexture);
const textureGroup = [];
for (const spritedata of sprites.sprites) {
const texture = extractSpriteTexture(baseTexture, spritedata);
textureGroup.push([spritedata.name, texture]);
}
textures.push(textureGroup);
if (delay) await Promises.delay(delay);
yield textureGroup;
}
}
Insert cell
sprites = {
const sprites = new Map();
const textures = loadTextures();
const iterator = textures[Symbol.asyncIterator]();

invalidation.then(() => {
for (const sprite of sprites.values()) {
container.removeChild(sprite);
sprite.destroy();
}
});

while (true) {
const { done, value } = await iterator.next();
if (done) return;
for (const [id, texture] of value) {
const sprite = new PIXI.Sprite(texture);
sprite.anchor.set(0.5);
sprite.x = Math.random() * width;
sprite.y = Math.random() * height;
sprite.scale.set(0.1);
container.addChild(sprite);
sprites.set(id, sprite);
}

yield sprites;
}
}
Insert cell
{
sprites;
return container.children.length; //return PIXI.js container size to confirm only new sprites/Textures are created
}
Insert cell
{
const x = Math.sin(now / 1000);
sprites.forEach(sprite => {
sprite.position.x += x; // commented to see new sprites comming
});
renderer.render(container);
return renderer.view;
}
Insert cell
/*sprites = {
let difference = Array.from(textures.keys()).filter(x => !spriteCache.has(x));
console.log(difference)
for(const id of difference){
const sprite = new PIXI.Sprite(textures.get(id));
sprite.anchor.set(0.5)
sprite.x = Math.random()*width
sprite.y = Math.random()*height
sprite.scale.set(0.1)
mutable spriteCache.set(id, sprite)
container.addChild(sprite)
}
//invalidation.then(() => enter exit ?);
renderer.render(container)
return spriteCache
}
*/
Insert cell
// mutable spriteCache = new Map()
Insert cell
// {
// const button = html`<button>clear spritecache`;
// button.onclick = () => spriteCache.clear();
// return button;
// }
Insert cell
//
Insert cell
// loop = {
// const x = (Math.sin(now / 1000) + 1) / 2 * (width);
// sprites.forEach(sprite => {
// sprite.position.x = x
// })
// renderer.render(container)
// }
Insert cell
PIXI.utils
Insert cell
import { renderer, container, PIXI, width, height } from "@cpietsch/pixi-renderer"
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more