svelte/motion
You can animate using svelte/motion
just like you would in other Svelte application.
Spring
<script> import * as PIXI from 'pixi.js' import { Text, Sprite } from 'svelte-pixi' import { spring } from 'svelte/motion' let dragging = false let offset = { x: 0, y: 0 } let startingPosition = { x: 200, y: 200 } let position = spring(startingPosition, { stiffness: 0.2, damping: 0.4, }) function handleDragStart(event) { dragging = true const { x, y } = event.detail.data.global offset = { x: x - $position.x, y: y - $position.y } } function handleDrag(event) { if (dragging) { const { x, y } = event.detail.data.global position.update($position => ({ x: x - offset.x, y: y - offset.y, }), { hard: true }) } } function handleDragEnd() { dragging = false position.set(startingPosition, { soft: 1 }) } </script> <Text x={200} y={300} anchor={0.5} text="Try clicking and dragging the mushroom" style={{ fill: 'white', fontSize: 20 }} /> <Sprite texture={PIXI.Texture.from('/assets/mushroom.png')} anchor={0.5} x={$position.x} y={$position.y} rotation={($position.x - startingPosition.x) * 0.02} interactive buttonMode on:pointerdown={handleDragStart} on:pointerup={handleDragEnd} on:pointerupoutside={handleDragEnd} on:mousemove={handleDrag} />
Tween
<script> import { onMount} from 'svelte' import { Graphics, onTick } from 'svelte-pixi' import { tweened } from 'svelte/motion' import { cubicOut } from 'svelte/easing' const barWidth = 200 const progress = tweened(barWidth / 5, { duration: 400, easing: cubicOut }) let step = 0 onTick(() => { step += 1 if (step > 100) { step = 0 if ($progress < barWidth) { $progress += barWidth / 5 } else { $progress = barWidth / 5 } } }) </script> <Graphics x={200} y={200} pivot={{ x: barWidth / 2 }} draw={graphics => { graphics.clear() graphics.beginFill(0xff0000) graphics.drawRect(0, 0, $progress, 50) graphics.endFill() }}/>