-
Notifications
You must be signed in to change notification settings - Fork 7.1k
/
Copy pathTransform.js
334 lines (271 loc) · 8.15 KB
/
Transform.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
/**
* @author Richard Davey <[email protected]>
* @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;