UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

335 lines (271 loc) 8.35 kB
/** * @author Richard Davey <rich@phaser.io> * @copyright 2013-2025 Phaser Studio Inc. * @license {@link https://opensource.org/licenses/MIT|MIT License} */ var Body = require('../lib/body/Body'); var MATH_CONST = require('../../../math/const'); var WrapAngle = require('../../../math/angle/Wrap'); var WrapAngleDegrees = require('../../../math/angle/WrapDegrees'); // global bitmask flag for GameObject.renderMask (used by Scale) var _FLAG = 4; // 0100 // Transform Component /** * Provides methods used for getting and setting the position, scale and rotation of a Game Object. * * @namespace Phaser.Physics.Matter.Components.Transform * @since 3.0.0 */ var Transform = { /** * The x position of this Game Object. * * @name Phaser.Physics.Matter.Components.Transform#x * @type {number} * @since 3.0.0 */ x: { get: function () { return this.body.position.x; }, set: function (value) { this._tempVec2.set(value, this.y); Body.setPosition(this.body, this._tempVec2); } }, /** * The y position of this Game Object. * * @name Phaser.Physics.Matter.Components.Transform#y * @type {number} * @since 3.0.0 */ y: { get: function () { return this.body.position.y; }, set: function (value) { this._tempVec2.set(this.x, value); Body.setPosition(this.body, this._tempVec2); } }, /** * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. * * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this * isn't the case, use the `scaleX` or `scaleY` properties instead. * * @name Phaser.Physics.Matter.Components.Transform#scale * @type {number} * @since 3.88.0 */ scale: { get: function () { return (this._scaleX + this._scaleY) / 2; }, set: function (value) { this.setScale(value, value); } }, /** * The horizontal scale of this Game Object. * * @name Phaser.Physics.Matter.Components.Transform#scaleX * @type {number} * @since 3.0.0 */ scaleX: { get: function () { return this._scaleX; }, set: function (value) { var factorX = 1 / this._scaleX; var factorY = 1 / this._scaleY; this._scaleX = value; if (this._scaleX === 0) { this.renderFlags &= ~_FLAG; } else { this.renderFlags |= _FLAG; } // Reset Matter scale back to 1 (sigh) Body.scale(this.body, factorX, factorY); Body.scale(this.body, value, this._scaleY); } }, /** * The vertical scale of this Game Object. * * @name Phaser.Physics.Matter.Components.Transform#scaleY * @type {number} * @since 3.0.0 */ scaleY: { get: function () { return this._scaleY; }, set: function (value) { var factorX = 1 / this._scaleX; var factorY = 1 / this._scaleY; this._scaleY = value; if (this._scaleY === 0) { this.renderFlags &= ~_FLAG; } else { this.renderFlags |= _FLAG; } Body.scale(this.body, factorX, factorY); Body.scale(this.body, this._scaleX, value); } }, /** * Use `angle` to set or get rotation of the physics body associated to this GameObject. * Unlike rotation, when using set the value can be in degrees, which will be converted to radians internally. * * @name Phaser.Physics.Matter.Components.Transform#angle * @type {number} * @since 3.0.0 */ angle: { get: function () { return WrapAngleDegrees(this.body.angle * MATH_CONST.RAD_TO_DEG); }, set: function (value) { // value is in degrees this.rotation = WrapAngleDegrees(value) * MATH_CONST.DEG_TO_RAD; } }, /** * Use `rotation` to set or get the rotation of the physics body associated with this GameObject. * The value when set must be in radians. * * @name Phaser.Physics.Matter.Components.Transform#rotation * @type {number} * @since 3.0.0 */ rotation: { get: function () { return this.body.angle; }, set: function (value) { // value is in radians this._rotation = WrapAngle(value); Body.setAngle(this.body, this._rotation); } }, /** * Sets the position of the physics body along x and y axes. * Both the parameters to this function are optional and if not passed any they default to 0. * Velocity, angle, force etc. are unchanged. * * @method Phaser.Physics.Matter.Components.Transform#setPosition * @since 3.0.0 * * @param {number} [x=0] - The horizontal position of the body. * @param {number} [y=x] - The vertical position of the body. * * @return {this} This Game Object instance. */ setPosition: function (x, y) { if (x === undefined) { x = 0; } if (y === undefined) { y = x; } this._tempVec2.set(x, y); Body.setPosition(this.body, this._tempVec2); return this; }, /** * Immediately sets the angle of the Body. * Angular velocity, position, force etc. are unchanged. * * @method Phaser.Physics.Matter.Components.Transform#setRotation * @since 3.0.0 * * @param {number} [radians=0] - The angle of the body, in radians. * * @return {this} This Game Object instance. */ setRotation: function (radians) { if (radians === undefined) { radians = 0; } this._rotation = WrapAngle(radians); Body.setAngle(this.body, radians); return this; }, /** * Setting fixed rotation sets the Body inertia to Infinity, which stops it * from being able to rotate when forces are applied to it. * * @method Phaser.Physics.Matter.Components.Transform#setFixedRotation * @since 3.0.0 * * @return {this} This Game Object instance. */ setFixedRotation: function () { Body.setInertia(this.body, Infinity); return this; }, /** * Immediately sets the angle of the Body. * Angular velocity, position, force etc. are unchanged. * * @method Phaser.Physics.Matter.Components.Transform#setAngle * @since 3.0.0 * * @param {number} [degrees=0] - The angle to set, in degrees. * * @return {this} This Game Object instance. */ setAngle: function (degrees) { if (degrees === undefined) { degrees = 0; } this.angle = degrees; Body.setAngle(this.body, this.rotation); return this; }, /** * Sets the scale of this Game Object. * * @method Phaser.Physics.Matter.Components.Transform#setScale * @since 3.0.0 * * @param {number} [x=1] - The horizontal scale of this Game Object. * @param {number} [y=x] - The vertical scale of this Game Object. If not set it will use the x value. * @param {Phaser.Math.Vector2} [point] - The point (Vector2) from which scaling will occur. * * @return {this} This Game Object instance. */ setScale: function (x, y, point) { if (x === undefined) { x = 1; } if (y === undefined) { y = x; } var factorX = 1 / this._scaleX; var factorY = 1 / this._scaleY; this._scaleX = x; this._scaleY = y; Body.scale(this.body, factorX, factorY, point); Body.scale(this.body, x, y, point); return this; } }; module.exports = Transform;