/** * @class Sprite * @description Base class for position based objects * @author Chris Peters * * @param {Integer} [x] The initial x position. Default is 0 * @param {Integer} [y] The initial y position. Default is 0 */ class Sprite { constructor(x = 0, y = 0) { this._x = x; this._y = y; this._pivotX = 1; this._pivotY = 1; this._width = 0; this._height = 0; this._scaleX = 1; this._scaleY = 1; this._rotation = 0; /** * The composite operation type. Can be source-atop|source-in|source-out|source-over|destination-atop|destination-in|destination-out|destination-over|lighter|xor|copy * Default is 'source-over' * * @member Sprite#_composite * @type {String} */ this._composite = Sprite._compositeDefault; this._opacity = 1; } /** * @method Sprite.getCompositeDefault * @return {String} */ static getCompositeDefault() { return Sprite._compositeDefault; } /** * @return {Object} The bounding area */ getBoundingArea() { return { maxX: this._x + (this._width * this._scaleX), maxY: this._y + (this._height * this._scaleY), minX: this._x, minY: this._y }; } /** * @method Sprite#getComposite * @return {String} */ getComposite() { return this._composite; } /** * @method Sprite#getHeight * @return {Integer} */ getHeight() { return this._height; } /** * @method Sprite#getOpacity * @return {Float} */ getOpacity() { return this._opacity; } /** * @method Sprite#getPivotX * @return {Integer} */ getPivotX() { return this._pivotX; } /** * @method Sprite#getPivotY * @return {Integer} */ getPivotY() { return this._pivotY; } /** * @method Sprite#getRotation * @return {Float} */ getRotation() { return this._rotation; } /** * @method Sprite#getRotation * @return {Float} */ getRotationRadians() { return this._rotation; } /** * @method Sprite#getScaleX * @return {Integer} */ getScaleX() { return this._scaleX; } /** * @method Sprite#getScaleY * @return {Integer} */ getScaleY() { return this._scaleY; } /** * @method Sprite#getSrcHeight * @return {Integer} */ getSrcHeight() { return this._srcHeight; } /** * @method Sprite#getSrcWidth * @return {Integer} */ getSrcWidth() { return this._srcWidth; } /** * @method Sprite#getSrcX * @return {Integer} */ getSrcX() { return this._srcX; } /** * @method Sprite#getSrcY * @return {Integer} */ getSrcY() { return this._srcY; } /** * @method Sprite#getWidth * @return {Integer} */ getWidth() { return this._width; } /** * @method Sprite#getX * @return {Integer} */ getX() { return this._x; } /** * @method Sprite#getY * @return {Integer} */ getY() { return this._y; } /** * @method Sprite#render * @param {Object} context The canvas' context */ render(context, factor, ticks) { context.translate( this._x + this._pivotX, this._y + this._pivotY ); context.scale(this._scaleX, this._scaleY); if (this._rotation !== 0) { context.translate(-this._pivotX, -this._pivotY); context.rotate(this._rotation); context.translate(-this._pivotX, -this._pivotY); } } /** * * @method Sprite#setComposite * @param {Integer} val The composite value * @return {Sprite} */ setComposite(val) { this._composite = val; return this; } /** * * @method Sprite#setHeight * @param {Integer} val The height value * @return {Sprite} */ setHeight(val) { this._height = val; return this; } /** * * @method Sprite#setOpacity * @param {Float} val The opacity value * @return {Sprite} */ setOpacity(val) { this._opacity = val; return this; } /** * @method Sprite#setPivotX * @param {Float} val The opacity value * @return {Sprite} */ setPivotX(val) { this._pivotX = val; return this; } /** * @method Sprite#setPivotY * @param {Float} val The opacity value * @return {Sprite} */ setPivotY(val) { this._pivotY = val; return this; } /** * * @method Sprite#setRotation * @param {Integer} val The rotation value * @return {Sprite} */ setRotation(val) { this._rotation = val * Math.PI / 180; return this; } /** * * @method Sprite#setScaleX * @param {Integer} val The scaleX value * @return {Sprite} */ setScaleX(val) { this._scaleX = val; return this; } /** * * @method Sprite#setScaleY * @param {Integer} val The scaleY value * @return {Sprite} */ setScaleY(val) { this._scaleY = val; return this; } /** * * @method Sprite#setSrcHeight * @param {Integer} val The srcHeight value * @return {Sprite} */ setSrcHeight(val) { this._srcHeight = val; return this; } /** * * @method Sprite#setSrcWidth * @param {Integer} val The srcWidth value * @return {Sprite} */ setSrcWidth(val) { this._srcWidth = val; return this; } /** * * @method Sprite#setSrcX * @param {Integer} val The srcX value * @return {Sprite} */ setSrcX(val) { this._srcX = val; return this; } /** * * @method Sprite#setSrcY * @param {Integer} val The srcY value * @return {Sprite} */ setSrcY(val) { this._srcY = val; return this; } /** * * @method Sprite#setWidth * @param {Integer} val The width value * @return {Sprite} */ setWidth(val) { this._width = val; return this; } /** * * @method Sprite#setComposite * @param {Integer} val The x value * @return {Sprite} */ setX(val) { this._x = val; return this; } /** * * @method Sprite#setY * @param {Integer} val The y value * @return {Sprite} */ setY(val) { this._y = val; return this; } /** * Add/Subtract current x/y values. Assign any non-number to leave value the same. * * @method Sprite#translate * @param {Integer} [x] * @param {Integer} [y] * @returns {Sprite} */ translate(x, y) { if (typeof x === 'number') { this._x += x; } if (typeof y === 'number') { this._y += y; } return this; } } /** * @member Sprite._compositeDefault * @type {String} */ Sprite._compositeDefault = 'source-over'; export default Sprite;