// Create the renderer var renderer = PIXI.autoDetectRenderer(256, 256, {antialias: true}) // Add the canvas to the HTML document document.body.appendChild(renderer.view) // Create a container object called the `stage` var stage = new PIXI.Container() renderer.view.style.position = 'absolute' renderer.view.style.display = 'block' renderer.autoResize = true renderer.resize(window.innerWidth, window.innerHeight) var counter = 0, cycleDuration = 60, tri = { original: [ [0, 0], [-50, 50], [50, 50] ], target: [ [0, 0], [-50, 50], [50, 50] ] }, triangle = new PIXI.Graphics() stage.addChild(triangle) function randomInt (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min } function linearTweening (t, b, c, d) { // t = current time // b = start value // c = change in value // d = duration return ((c * t) / d) + b } function easeOutBounce (t, b, c, d) { if ((t /= d) < (1 / 2.75)) { return c * (7.5625 * t * t) + b } else if (t < (2 / 2.75)) { return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b } else if (t < (2.5 / 2.75)) { return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b } else { return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b } } function easeInOutExpo (t, b, c, d) { if (t == 0) return b if (t == d) return b + c if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b } function drawLine (x1, y1, x2, y2) { var line = new PIXI.Graphics() line.lineStyle(1, 0xFFFFFF, 1) line.moveTo(x1, y1) line.lineTo(x2, y2) line.x = x1 line.y = y1 stage.addChild(line) } function drawShiftingTriangle (triangle, originalPoints, targetPoints, counter, easingFn) { var i = 0 if (counter === 0) { // Given originalPoints, randomly shifts them by some amount, draws it, and returns new array of points var newPoints = [] // Start new cycle. New original is old target. New target is newly generated newPoints. originalPoints = targetPoints for (i = 0; i < originalPoints.length; i++) { newPoints[i] = [originalPoints[i][0] + randomInt(-10, 10), originalPoints[i][1] + randomInt(-10, 10)] } targetPoints = newPoints } triangle.lineStyle(1, 0xFAFAFA, 1) // triangle.beginFill(0x66FF33); for (i = 0; i < 4; i++) { if (i === 0) { triangle.moveTo(easingFn(counter, originalPoints[0][0], targetPoints[0][0] - originalPoints[0][0], cycleDuration), easingFn(counter, originalPoints[0][1], targetPoints[0][1] - originalPoints[0][1], cycleDuration)) } else if (i === 3) { triangle.lineTo(easingFn(counter, originalPoints[0][0], targetPoints[0][0] - originalPoints[0][0], cycleDuration), easingFn(counter, originalPoints[0][1], targetPoints[0][1] - originalPoints[0][1], cycleDuration)) } else { triangle.lineTo(easingFn(counter, originalPoints[i][0], targetPoints[i][0] - originalPoints[i][0], cycleDuration), easingFn(counter, originalPoints[i][1], targetPoints[i][1] - originalPoints[i][1], cycleDuration)) } } // triangle.endFill(); return { original: originalPoints, target: targetPoints } } function loop () { requestAnimationFrame(loop) triangle.clear() // drawLine(0, 0, counter, counter); tri = drawShiftingTriangle(triangle, tri.original, tri.target, counter, linearTweening) counter += 1 counter = counter % cycleDuration var mousePosition = renderer.plugins.interaction.mouse.global triangle.x = mousePosition.x triangle.y = mousePosition.y // Tell the `renderer` to `render` the `stage` renderer.render(stage) } loop()