phaser4-rex-plugins
Version:
213 lines (173 loc) • 6.09 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.rexviewportcoordinateplugin = factory());
})(this, (function () { 'use strict';
const EventEmitter = Phaser.Events.EventEmitter;
var MonitorViewport = function (viewport) {
// Don't monitor properties again
if (viewport.events) {
return viewport;
}
var events = new EventEmitter();
var x = viewport.x;
Object.defineProperty(viewport, 'x', {
get: function () {
return x;
},
set: function (value) {
if (x !== value) {
x = value;
events.emit('update', viewport);
}
},
});
var y = viewport.y;
Object.defineProperty(viewport, 'y', {
get: function () {
return y;
},
set: function (value) {
if (y !== value) {
y = value;
events.emit('update', viewport);
}
},
});
var width = viewport.width;
Object.defineProperty(viewport, 'width', {
get: function () {
return width;
},
set: function (value) {
if (width !== value) {
width = value;
events.emit('update', viewport);
}
},
});
var height = viewport.height;
Object.defineProperty(viewport, 'height', {
get: function () {
return height;
},
set: function (value) {
if (height !== value) {
height = value;
events.emit('update', viewport);
}
},
});
viewport.events = events;
return viewport;
};
var VPXYToXY = function (vpx, vpy, vpxOffset, vpyOffset, viewport, out) {
if (out === undefined) {
out = {};
} else if (out === true) {
out = GlobXY;
}
if (typeof (vpxOffset) !== 'number') {
vpxOffset = 0;
vpyOffset = 0;
}
out.x = viewport.x + (viewport.width * vpx) + vpxOffset;
out.y = viewport.y + (viewport.height * vpy) + vpyOffset;
return out;
};
var GlobXY = {};
var AddViewportCoordinateProperties = function (gameObject, viewport, vpx, vpy, vpxOffset, vpyOffset, transformCallback) {
// Don't attach properties again
if (gameObject.hasOwnProperty('vp')) {
return gameObject;
}
if (typeof (vpx) === 'function') {
transformCallback = vpx;
vpx = undefined;
}
if (typeof (vpxOffset) === 'function') {
transformCallback = vpxOffset;
vpxOffset = undefined;
}
if (vpx === undefined) { vpx = 0.5; }
if (vpy === undefined) { vpy = 0.5; }
if (vpxOffset === undefined) { vpxOffset = 0; }
if (vpyOffset === undefined) { vpyOffset = 0; }
if (transformCallback === undefined) {
transformCallback = VPXYToXY;
}
MonitorViewport(viewport);
var events = viewport.events;
gameObject.vp = viewport;
// Set position of game object when view-port changed.
var Transform = function () {
transformCallback(vpx, vpy, vpxOffset, vpyOffset, viewport, gameObject);
};
events.on('update', Transform);
gameObject.once('destroy', function () {
events.off('update', Transform);
gameObject.vp = undefined;
});
Object.defineProperty(gameObject, 'vpx', {
get: function () {
return vpx;
},
set: function (value) {
if (vpx !== value) {
vpx = value;
Transform();
}
},
});
Object.defineProperty(gameObject, 'vpy', {
get: function () {
return vpy;
},
set: function (value) {
if (vpy !== value) {
vpy = value;
Transform();
}
},
});
Object.defineProperty(gameObject, 'vpxOffset', {
get: function () {
return vpxOffset;
},
set: function (value) {
if (vpxOffset !== value) {
vpxOffset = value;
Transform();
}
},
});
Object.defineProperty(gameObject, 'vpyOffset', {
get: function () {
return vpyOffset;
},
set: function (value) {
if (vpyOffset !== value) {
vpyOffset = value;
Transform();
}
},
});
Transform();
};
class ViewportCoordinatePlugin extends Phaser.Plugins.BasePlugin {
constructor(pluginManager) {
super(pluginManager);
}
start() {
var eventEmitter = this.game.events;
eventEmitter.on('destroy', this.destroy, this);
}
add(gameObject, viewport, vpx, vpy, transformCallback) {
return AddViewportCoordinateProperties(gameObject, viewport, vpx, vpy, transformCallback);
}
vpxyToxy(vpx, vpy, viewport, out) {
return VPXYToXY(vpx, vpy, viewport, out);
}
}
return ViewportCoordinatePlugin;
}));