Estoy tratando de cambiar el tamaño de un círculo gráfico haciendo un bucle con el método de escala. El bucle animará la escala del círculo de 1 a 3 y luego de 3 a 1. El siguiente código funciona como pretendía, sin embargo, cuando el círculo se agranda, cambia de tamaño en la dirección de abajo a la derecha. Luego, el círculo cambia de tamaño a su dirección opuesta (arriba a la izquierda) después de alcanzar la escala máxima dada. Aquí está el código:
const app = new PIXI.Application({ width: 300, height: 300, }); const canvasDiv = document.getElementById('canvasDiv'); canvasDiv.appendChild(app.view); let circle = new PIXI.Graphics(); circle.beginFill(0xffffff); circle.drawCircle(5, 5, 5); circle.x = 150; circle.y = 150; circle.endFill(); app.stage.addChild(circle); let scale = 1, motion = 1; app.ticker.add(() => animateLoop()); function animateLoop(){ if (motion == 1){ if (scale < 3){ scale += 0.2; } else{ motion = 0; } } else{ if (scale > 1){ scale -= 0.2; } else{ motion = 1; } } circle.scale.set(scale,scale); }Leí el sitio de Pixi y vi la opción pivotar para manejar el centrado de los gráficos durante el cambio de tamaño. Intenté implementarlo y tiene ligeras mejoras. Sin embargo, no puedo centrar exactamente el círculo a pesar de probar múltiples valores de pivote. Aquí está el código agregado:
/** On Motion 1 */ if (scale < 3){ scale += 0.2; circle.pivot.x += 0.5; circle.pivot.y += 0.2; } /** On Motion 0 */ if (scale > 1){ scale -= 0.2; circle.pivot.x -= 0.5; circle.pivot.y -= 0.2; }¿Cómo puedo solucionar esto?
El punto de pivote es una ubicación en algún lugar dentro del espacio de coordenadas local de un objeto.
Si echas un vistazo a la siguiente ilustración:
puede ver que la esquina superior izquierda está en x: 0 | y: 0 mientras que la parte inferior derecha está en x: circle.width | y: circulo.altura.
Eso significa que si queremos escalar el círculo desde su centro, ¡necesitamos mover el punto de pivote al centro! (x: círculo.ancho/2 | y: círculo.alto/2)
Aquí hay un ejemplo:
const app = new PIXI.Application({ width: 400, height: 300, backgroundColor: 0x1099bb, resolution: window.devicePixelRatio || 1, }); document.body.appendChild(app.view); const container = new PIXI.Container(); let circle = new PIXI.Graphics(); circle.beginFill(0x00ffff); circle.drawCircle(50, 50, 50); circle.endFill(); circle.x = 200; circle.y = 150; circle.pivot.x = circle.width / 2; circle.pivot.y = circle.height / 2; app.stage.addChild(circle); let scale = 1, motion = 1; app.ticker.add(() => animateLoop()); function animateLoop() { if (motion == 1) { if (scale < 3) { scale += 0.1; } else { motion = 0; } } else { if (scale > 1) { scale -= 0.1; } else { motion = 1; } } circle.scale.set(scale, scale); } <script src="https://pixijs.download/release/pixi.js"></script>