UNPKG

adventureland-gui

Version:

Basic UI for headless AdventureLand clients

97 lines 3.62 kB
import { getProjectileTextures, getRayTexture } from "./texture"; import { AnimatedSprite, Point, SimpleRope, Ticker } from "pixi.js"; import G from "./G.json"; const projectiles = new Map(); Ticker.shared.add(() => { const projectilesToDelete = []; for (const [pid, datum] of projectiles) { if (datum.data.isRay) { datum.sprite.alpha -= Ticker.shared.elapsedMS / 500; if (datum.sprite.alpha <= 0) projectilesToDelete.push(pid); } else { const gProjectile = G.projectiles[datum.data.name]; const movementAngle = Math.atan2(datum.data.y - datum.data.going_y, datum.data.x - datum.data.going_x); const distanceTraveled = gProjectile.speed * Ticker.shared.elapsedMS / 1000; const distanceToGoal = Math.hypot(datum.data.going_x - datum.data.x, datum.data.going_y - datum.data.y); if (distanceTraveled > distanceToGoal) { projectilesToDelete.push(pid); continue; } else { datum.data.x -= (Math.cos(movementAngle) * distanceTraveled); datum.data.y -= (Math.sin(movementAngle) * distanceTraveled); } datum.sprite.rotation = movementAngle - (Math.PI / 2); datum.sprite.x = datum.data.x; datum.sprite.y = datum.data.y; datum.sprite.zIndex = datum.data.y; } } for (const pid of projectilesToDelete) { const datum = projectiles.get(pid); if (datum) { datum.sprite.destroy({ baseTexture: false, children: true, texture: false }); projectiles.delete(pid); } } }); export const renderProjectile = (layers, projectile) => { let sprite; if (projectiles.has(projectile.pid)) { const oldProjectile = projectiles.get(projectile.pid); for (const datum in projectile) oldProjectile.data[datum] = projectile[datum]; sprite = oldProjectile.sprite; } else { if (projectile.isRay) { sprite = renderRay(layers, projectile); } else { sprite = renderShot(layers, projectile); } } if (sprite instanceof AnimatedSprite) { const movementAngle = Math.atan2(projectile.y - projectile.going_y, projectile.x - projectile.going_x); sprite.anchor.set(0.5); sprite.rotation = movementAngle - (Math.PI / 2); sprite.x = projectile.x; sprite.y = projectile.y; sprite.zIndex = projectile.y; } return sprite; }; const renderRay = (layers, ray) => { const texture = getRayTexture(ray.name); const sprite = new SimpleRope(texture, [ new Point(ray.x, ray.y), new Point(ray.going_x, ray.going_y) ], 1); sprite.cullable = false; sprite.interactive = false; sprite.interactiveChildren = false; sprite.zIndex = ray.y; layers.foreground?.addChild(sprite); const datum = { data: ray, sprite: sprite }; projectiles.set(ray.pid, datum); return sprite; }; const renderShot = (layers, shot) => { const textures = getProjectileTextures(shot.name); const sprite = new AnimatedSprite(textures); sprite.interactive = false; sprite.interactiveChildren = false; layers.foreground?.addChild(sprite); const datum = { data: shot, sprite: sprite }; projectiles.set(shot.pid, datum); return sprite; }; //# sourceMappingURL=projectile.js.map