PIXI
Flickering issue with zoom
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.5.1/pixi.js"></script>
JavaScript
// Viewport class. Handles pan and zoom.
function ViewPort(){
return this.init.apply(this, arguments);
}
ViewPort.prototype = {
// Initiate our mandatory variables.
init: function(options){
// List of Containers that have zoom applied
this.zoomLayers = options.zoomLayers;
// PIXI.App ticker
this.ticker = options.ticker;
this.view = options.view;
this.renderer = options.renderer;
this.zoomListeners(options.smoothness, options.intensity);
},
// Set-up listeners for mouse wheel and add renderZoom to ticker
zoomListeners: function(delta, power){
this._remaining = 1;
this._zooming = false;
this._lastUpdate = 0;
this._change = delta;
var self = this;
this.ticker.add(this.renderZoom, this, PIXI.UPDATE_PRIORITY.HIGH);
this.view.addEventListener("wheel", function(e){
var zoomIn = e.deltaY < 0 ? true : false; // Determine if zooming in or out
var factor;
if (zoomIn){
factor = power;
} else {
factor = (1 / power);
}
self._remaining *= factor;
// If we're not zooming, now may as well be a good time to start...
if (!self._zooming){
self._lastUpdate = Date.now();
self._zooming = true;
}
})
},
// Render the zoom effect each frame
renderZoom: function(deltaTime){
if (!this._zooming){ return false}
var self = this;
function zoom(factor){
var mouse = self.renderer.plugins.interaction.eventData.data.global;
self.zoomLayers.forEach(function(layer){
// Set the new scale values for each layer
layer.scale.x *= factor;
layer.scale.y *= factor;
// Position the layers relative to the mouse postition
layer.x -= (mouse.x - layer.x) * (factor - 1);
layer.y -= (mouse.y - layer.y) * (factor -1);
})
}
// Calculate the zoom factor
var time = Date.now();
var tDelta = (time - this._lastUpdate);
this._lastUpdate = time;
// Determine the amount of power left to zoom.
var step = Math.pow(this._remaining, tDelta / 100);
this._remaining /= step;
// If...