dino-ge 1.5.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GameObject.js +18 -7
- package/dist/GameObject.js.map +1 -1
- package/dist/Physics.d.ts +28 -6
- package/dist/Physics.js +170 -60
- package/dist/Physics.js.map +1 -1
- package/dist/PhysicsComponent.d.ts +4 -0
- package/dist/PhysicsComponent.js +4 -0
- package/dist/PhysicsComponent.js.map +1 -1
- package/dist/RenderComponent.d.ts +0 -2
- package/dist/RenderComponent.js +0 -5
- package/dist/RenderComponent.js.map +1 -1
- package/dist/Vector2.d.ts +19 -10
- package/dist/Vector2.js +42 -1
- package/dist/Vector2.js.map +1 -1
- package/package.json +1 -1
package/dist/GameObject.js
CHANGED
|
@@ -52,12 +52,15 @@ export default class GameObject {
|
|
|
52
52
|
* @param component The component to add.
|
|
53
53
|
*/
|
|
54
54
|
addComponent(component) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
// Index the component by its class name and all base class names up to Component.
|
|
56
|
+
let proto = Object.getPrototypeOf(component);
|
|
57
|
+
while (proto && proto.constructor.name !== 'Object') {
|
|
58
|
+
const key = proto.constructor.name;
|
|
59
|
+
this._components.set(key, component);
|
|
60
|
+
// Stop walking once we've indexed up to the base Component class.
|
|
61
|
+
if (key === 'Component')
|
|
62
|
+
break;
|
|
63
|
+
proto = Object.getPrototypeOf(proto);
|
|
61
64
|
}
|
|
62
65
|
component.gameObject = this;
|
|
63
66
|
}
|
|
@@ -66,7 +69,15 @@ export default class GameObject {
|
|
|
66
69
|
* @param componentClass The class of the component to remove.
|
|
67
70
|
*/
|
|
68
71
|
removeComponent(componentClass) {
|
|
69
|
-
this.
|
|
72
|
+
const component = this.getComponent(componentClass);
|
|
73
|
+
if (!component)
|
|
74
|
+
return;
|
|
75
|
+
// Remove all keys that point to this specific component instance.
|
|
76
|
+
for (const [key, value] of this._components.entries()) {
|
|
77
|
+
if (value === component) {
|
|
78
|
+
this._components.delete(key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
70
81
|
}
|
|
71
82
|
/**
|
|
72
83
|
* Checks if this entity has a component of the specified class.
|
package/dist/GameObject.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameObject.js","sourceRoot":"","sources":["../src/GameObject.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AACzD,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAE7C,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAgB,UAAU;IAWtC,YAAY,GAAW,EAAE,MAAc;QAVvC,wDAAwD;QAChD,gBAAW,GAA2B,IAAI,GAAG,EAAE,CAAC;QAUtD,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,CAAC,SAAS,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,EAAE,CAAC,IAAY,EAAE,QAAsC;QACrD,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,IAAY,EAAE,QAAsC;;QACtD,MAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,0CAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,IAAY,EAAE,MAAgB;;QACjC,MAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,0CAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,SAAoB;QAC/B,MAAM,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"GameObject.js","sourceRoot":"","sources":["../src/GameObject.ts"],"names":[],"mappings":"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"}
|
package/dist/Physics.d.ts
CHANGED
|
@@ -1,16 +1,38 @@
|
|
|
1
|
+
import Vector2 from './Vector2.js';
|
|
1
2
|
import GameObject from './GameObject.js';
|
|
3
|
+
/**
|
|
4
|
+
* Holds data about a collision between two objects.
|
|
5
|
+
*/
|
|
6
|
+
export interface CollisionManifold {
|
|
7
|
+
/** First object in the collision. */
|
|
8
|
+
obj1: GameObject;
|
|
9
|
+
/** Second object in the collision. */
|
|
10
|
+
obj2: GameObject;
|
|
11
|
+
/** Normalized direction of the collision from obj1 to obj2. */
|
|
12
|
+
normal: Vector2;
|
|
13
|
+
/** Penetration depth. */
|
|
14
|
+
depth: number;
|
|
15
|
+
}
|
|
2
16
|
/**
|
|
3
17
|
* Utility class for collision detection between game objects.
|
|
4
18
|
*/
|
|
5
19
|
export default class Physics {
|
|
6
20
|
/**
|
|
7
21
|
* Checks if two game objects are colliding.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
22
|
+
* @param obj1 First object.
|
|
23
|
+
* @param obj2 Second object.
|
|
24
|
+
* @returns A manifold if colliding, else null.
|
|
25
|
+
*/
|
|
26
|
+
static getCollisionManifold(obj1: GameObject, obj2: GameObject): CollisionManifold | null;
|
|
27
|
+
private static circleVsCircle;
|
|
28
|
+
private static aabbVsAabb;
|
|
29
|
+
private static circleVsRect;
|
|
30
|
+
/**
|
|
31
|
+
* Checks if two game objects are colliding and resolves it.
|
|
32
|
+
* @param obj1 First object.
|
|
33
|
+
* @param obj2 Second object.
|
|
34
|
+
* @returns True if the objects were colliding.
|
|
35
|
+
*/
|
|
14
36
|
static checkCollision(obj1: GameObject, obj2: GameObject): boolean;
|
|
15
37
|
private static resolveCollision;
|
|
16
38
|
}
|
package/dist/Physics.js
CHANGED
|
@@ -7,85 +7,195 @@ import PhysicsComponent from './PhysicsComponent.js';
|
|
|
7
7
|
export default class Physics {
|
|
8
8
|
/**
|
|
9
9
|
* Checks if two game objects are colliding.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*/
|
|
16
|
-
static checkCollision(obj1, obj2) {
|
|
17
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
10
|
+
* @param obj1 First object.
|
|
11
|
+
* @param obj2 Second object.
|
|
12
|
+
* @returns A manifold if colliding, else null.
|
|
13
|
+
*/
|
|
14
|
+
static getCollisionManifold(obj1, obj2) {
|
|
18
15
|
const isCircle1 = obj1 instanceof Circle;
|
|
19
16
|
const isCircle2 = obj2 instanceof Circle;
|
|
20
|
-
let isColliding = false;
|
|
21
17
|
if (isCircle1 && isCircle2) {
|
|
22
|
-
|
|
23
|
-
const c2 = obj2;
|
|
24
|
-
isColliding = Vector2.distance(c1.center, c2.center) < c1.radius + c2.radius;
|
|
18
|
+
return this.circleVsCircle(obj1, obj2);
|
|
25
19
|
}
|
|
26
20
|
else if (isCircle1 || isCircle2) {
|
|
27
21
|
const circle = (isCircle1 ? obj1 : obj2);
|
|
28
22
|
const rect = (isCircle1 ? obj2 : obj1);
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
23
|
+
const manifold = this.circleVsRect(circle, rect);
|
|
24
|
+
if (manifold && isCircle2) {
|
|
25
|
+
// Flip normal if obj1 was the rect
|
|
26
|
+
manifold.normal.multiply(-1);
|
|
27
|
+
}
|
|
28
|
+
return manifold;
|
|
34
29
|
}
|
|
35
30
|
else {
|
|
36
|
-
|
|
37
|
-
const h1 = (_h = (_g = obj1.bounds) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0;
|
|
38
|
-
const w2 = (_k = (_j = obj2.bounds) === null || _j === void 0 ? void 0 : _j.width) !== null && _k !== void 0 ? _k : 0;
|
|
39
|
-
const h2 = (_m = (_l = obj2.bounds) === null || _l === void 0 ? void 0 : _l.height) !== null && _m !== void 0 ? _m : 0;
|
|
40
|
-
isColliding = (obj1.transform.position.x < obj2.transform.position.x + w2 &&
|
|
41
|
-
obj1.transform.position.x + w1 > obj2.transform.position.x &&
|
|
42
|
-
obj1.transform.position.y < obj2.transform.position.y + h2 &&
|
|
43
|
-
obj1.transform.position.y + h1 > obj2.transform.position.y);
|
|
44
|
-
}
|
|
45
|
-
const obj1Static = (_p = (_o = obj1.getComponent(PhysicsComponent)) === null || _o === void 0 ? void 0 : _o.isStatic) !== null && _p !== void 0 ? _p : false;
|
|
46
|
-
const obj2Static = (_r = (_q = obj2.getComponent(PhysicsComponent)) === null || _q === void 0 ? void 0 : _q.isStatic) !== null && _r !== void 0 ? _r : false;
|
|
47
|
-
if (isColliding && (!obj1Static || !obj2Static)) {
|
|
48
|
-
this.resolveCollision(obj1, obj2, obj1Static, obj2Static);
|
|
31
|
+
return this.aabbVsAabb(obj1, obj2);
|
|
49
32
|
}
|
|
50
|
-
return isColliding;
|
|
51
33
|
}
|
|
52
|
-
static
|
|
34
|
+
static circleVsCircle(c1, c2) {
|
|
35
|
+
const combinedRadius = c1.radius + c2.radius;
|
|
36
|
+
const diff = c2.center.clone().subtract(c1.center);
|
|
37
|
+
const distSq = diff.x * diff.x + diff.y * diff.y;
|
|
38
|
+
if (distSq > combinedRadius * combinedRadius)
|
|
39
|
+
return null;
|
|
40
|
+
const dist = Math.sqrt(distSq);
|
|
41
|
+
const normal = dist !== 0 ? diff.multiply(1 / dist) : new Vector2(0, 1);
|
|
42
|
+
return {
|
|
43
|
+
obj1: c1,
|
|
44
|
+
obj2: c2,
|
|
45
|
+
normal,
|
|
46
|
+
depth: combinedRadius - dist
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
static aabbVsAabb(obj1, obj2) {
|
|
53
50
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
54
51
|
const w1 = (_b = (_a = obj1.bounds) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0;
|
|
55
52
|
const h1 = (_d = (_c = obj1.bounds) === null || _c === void 0 ? void 0 : _c.height) !== null && _d !== void 0 ? _d : 0;
|
|
56
53
|
const w2 = (_f = (_e = obj2.bounds) === null || _e === void 0 ? void 0 : _e.width) !== null && _f !== void 0 ? _f : 0;
|
|
57
54
|
const h2 = (_h = (_g = obj2.bounds) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0;
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
const pos1 = obj1.transform.position;
|
|
56
|
+
const pos2 = obj2.transform.position;
|
|
57
|
+
// Center to center distance
|
|
58
|
+
const center1 = new Vector2(pos1.x + w1 / 2, pos1.y + h1 / 2);
|
|
59
|
+
const center2 = new Vector2(pos2.x + w2 / 2, pos2.y + h2 / 2);
|
|
60
|
+
const diff = center2.clone().subtract(center1);
|
|
61
|
+
// Overlap on x and y axes
|
|
62
|
+
const overlapX = (w1 / 2 + w2 / 2) - Math.abs(diff.x);
|
|
63
|
+
if (overlapX <= 0)
|
|
64
|
+
return null;
|
|
65
|
+
const overlapY = (h1 / 2 + h2 / 2) - Math.abs(diff.y);
|
|
66
|
+
if (overlapY <= 0)
|
|
67
|
+
return null;
|
|
68
|
+
// Resolve on the axis of least penetration
|
|
62
69
|
if (overlapX < overlapY) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
if (!obj1Static)
|
|
71
|
-
obj1.transform.position.x += overlapX / 2;
|
|
72
|
-
if (!obj2Static)
|
|
73
|
-
obj2.transform.position.x -= overlapX / 2;
|
|
74
|
-
}
|
|
70
|
+
return {
|
|
71
|
+
obj1,
|
|
72
|
+
obj2,
|
|
73
|
+
normal: new Vector2(diff.x > 0 ? 1 : -1, 0),
|
|
74
|
+
depth: overlapX
|
|
75
|
+
};
|
|
75
76
|
}
|
|
76
77
|
else {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
78
|
+
return {
|
|
79
|
+
obj1,
|
|
80
|
+
obj2,
|
|
81
|
+
normal: new Vector2(0, diff.y > 0 ? 1 : -1),
|
|
82
|
+
depth: overlapY
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
static circleVsRect(circle, rect) {
|
|
87
|
+
var _a, _b, _c, _d;
|
|
88
|
+
const rectWidth = (_b = (_a = rect.bounds) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0;
|
|
89
|
+
const rectHeight = (_d = (_c = rect.bounds) === null || _c === void 0 ? void 0 : _c.height) !== null && _d !== void 0 ? _d : 0;
|
|
90
|
+
const rectPos = rect.transform.position;
|
|
91
|
+
const closestX = Math.max(rectPos.x, Math.min(circle.center.x, rectPos.x + rectWidth));
|
|
92
|
+
const closestY = Math.max(rectPos.y, Math.min(circle.center.y, rectPos.y + rectHeight));
|
|
93
|
+
const diff = new Vector2(closestX, closestY).subtract(circle.center);
|
|
94
|
+
const distSq = diff.x * diff.x + diff.y * diff.y;
|
|
95
|
+
if (distSq > circle.radius * circle.radius)
|
|
96
|
+
return null;
|
|
97
|
+
const dist = Math.sqrt(distSq);
|
|
98
|
+
let normal;
|
|
99
|
+
let depth;
|
|
100
|
+
if (dist === 0) {
|
|
101
|
+
// Circle center is inside the rectangle
|
|
102
|
+
const center = circle.center;
|
|
103
|
+
const dLeft = center.x - rectPos.x;
|
|
104
|
+
const dRight = rectPos.x + rectWidth - center.x;
|
|
105
|
+
const dTop = center.y - rectPos.y;
|
|
106
|
+
const dBottom = rectPos.y + rectHeight - center.y;
|
|
107
|
+
const minDist = Math.min(dLeft, dRight, dTop, dBottom);
|
|
108
|
+
depth = circle.radius + minDist;
|
|
109
|
+
if (minDist === dLeft)
|
|
110
|
+
normal = new Vector2(-1, 0);
|
|
111
|
+
else if (minDist === dRight)
|
|
112
|
+
normal = new Vector2(1, 0);
|
|
113
|
+
else if (minDist === dTop)
|
|
114
|
+
normal = new Vector2(0, -1);
|
|
115
|
+
else
|
|
116
|
+
normal = new Vector2(0, 1);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
normal = diff.multiply(1 / dist);
|
|
120
|
+
depth = circle.radius - dist;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
obj1: circle,
|
|
124
|
+
obj2: rect,
|
|
125
|
+
normal,
|
|
126
|
+
depth
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Checks if two game objects are colliding and resolves it.
|
|
131
|
+
* @param obj1 First object.
|
|
132
|
+
* @param obj2 Second object.
|
|
133
|
+
* @returns True if the objects were colliding.
|
|
134
|
+
*/
|
|
135
|
+
static checkCollision(obj1, obj2) {
|
|
136
|
+
var _a, _b;
|
|
137
|
+
const manifold = this.getCollisionManifold(obj1, obj2);
|
|
138
|
+
if (!manifold)
|
|
139
|
+
return false;
|
|
140
|
+
const phys1 = obj1.getComponent(PhysicsComponent);
|
|
141
|
+
const phys2 = obj2.getComponent(PhysicsComponent);
|
|
142
|
+
const obj1Static = (_a = phys1 === null || phys1 === void 0 ? void 0 : phys1.isStatic) !== null && _a !== void 0 ? _a : false;
|
|
143
|
+
const obj2Static = (_b = phys2 === null || phys2 === void 0 ? void 0 : phys2.isStatic) !== null && _b !== void 0 ? _b : false;
|
|
144
|
+
if (!obj1Static || !obj2Static) {
|
|
145
|
+
this.resolveCollision(manifold, phys1, phys2);
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
static resolveCollision(manifold, phys1, phys2) {
|
|
150
|
+
var _a, _b;
|
|
151
|
+
const { obj1, obj2, normal, depth } = manifold;
|
|
152
|
+
const isStatic1 = (_a = phys1 === null || phys1 === void 0 ? void 0 : phys1.isStatic) !== null && _a !== void 0 ? _a : true; // Assume static if no physics component
|
|
153
|
+
const isStatic2 = (_b = phys2 === null || phys2 === void 0 ? void 0 : phys2.isStatic) !== null && _b !== void 0 ? _b : true;
|
|
154
|
+
// 1. Positional Correction (to prevent sinking/jitter)
|
|
155
|
+
const percent = 0.8; // How much of the penetration to resolve
|
|
156
|
+
const slop = 0.01; // Allowable penetration
|
|
157
|
+
const correctionMagnitude = Math.max(depth - slop, 0) / ((isStatic1 ? 0 : 1) + (isStatic2 ? 0 : 1)) * percent;
|
|
158
|
+
const correction = normal.clone().multiply(correctionMagnitude);
|
|
159
|
+
if (!isStatic1)
|
|
160
|
+
obj1.transform.position.subtract(correction);
|
|
161
|
+
if (!isStatic2)
|
|
162
|
+
obj2.transform.position.add(correction);
|
|
163
|
+
// 2. Impulse-based Velocity Response
|
|
164
|
+
if (phys1 && phys2) {
|
|
165
|
+
// Relative velocity along normal
|
|
166
|
+
const rv = phys2.velocity.clone().subtract(phys1.velocity);
|
|
167
|
+
const velAlongNormal = Vector2.dot(rv, normal);
|
|
168
|
+
// Do not resolve if velocities are separating
|
|
169
|
+
if (velAlongNormal > 0)
|
|
170
|
+
return;
|
|
171
|
+
// Calculate restitution (bounciness) - use the minimum of both objects
|
|
172
|
+
const e = Math.min(phys1.restitution, phys2.restitution);
|
|
173
|
+
// Calculate impulse scalar
|
|
174
|
+
// Impulse j = -(1 + e) * (Vrel . n) / (1/m1 + 1/m2)
|
|
175
|
+
const invMass1 = isStatic1 ? 0 : (1 / phys1.mass);
|
|
176
|
+
const invMass2 = isStatic2 ? 0 : (1 / phys2.mass);
|
|
177
|
+
let j = -(1 + e) * velAlongNormal;
|
|
178
|
+
j /= invMass1 + invMass2;
|
|
179
|
+
// Apply impulse
|
|
180
|
+
const impulse = normal.clone().multiply(j);
|
|
181
|
+
if (!isStatic1)
|
|
182
|
+
phys1.velocity.subtract(impulse.clone().multiply(invMass1));
|
|
183
|
+
if (!isStatic2)
|
|
184
|
+
phys2.velocity.add(impulse.clone().multiply(invMass2));
|
|
185
|
+
}
|
|
186
|
+
else if (phys1 || phys2) {
|
|
187
|
+
// Only one object has physics, treat the other as static infinity mass
|
|
188
|
+
const activePhys = phys1 || phys2;
|
|
189
|
+
const n = phys1 ? normal.clone().multiply(-1) : normal;
|
|
190
|
+
const rv = activePhys.velocity.clone().multiply(-1); // Relative to static (0,0)
|
|
191
|
+
const velAlongNormal = Vector2.dot(rv, n);
|
|
192
|
+
if (velAlongNormal > 0)
|
|
193
|
+
return;
|
|
194
|
+
const e = activePhys.restitution;
|
|
195
|
+
let j = -(1 + e) * velAlongNormal;
|
|
196
|
+
j /= (1 / activePhys.mass);
|
|
197
|
+
const impulse = n.clone().multiply(j);
|
|
198
|
+
activePhys.velocity.add(impulse.clone().multiply(1 / activePhys.mass));
|
|
89
199
|
}
|
|
90
200
|
}
|
|
91
201
|
}
|
package/dist/Physics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Physics.js","sourceRoot":"","sources":["../src/Physics.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"Physics.js","sourceRoot":"","sources":["../src/Physics.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,4 +12,8 @@ export default class PhysicsComponent extends Component {
|
|
|
12
12
|
mass: number;
|
|
13
13
|
/** Whether the object is immovable (e.g., walls). */
|
|
14
14
|
isStatic: boolean;
|
|
15
|
+
/** Bounciness of the object (0 = inelastic, 1 = perfectly elastic). */
|
|
16
|
+
restitution: number;
|
|
17
|
+
/** Resistance to sliding. */
|
|
18
|
+
friction: number;
|
|
15
19
|
}
|
package/dist/PhysicsComponent.js
CHANGED
|
@@ -14,6 +14,10 @@ export default class PhysicsComponent extends Component {
|
|
|
14
14
|
this.mass = 1;
|
|
15
15
|
/** Whether the object is immovable (e.g., walls). */
|
|
16
16
|
this.isStatic = false;
|
|
17
|
+
/** Bounciness of the object (0 = inelastic, 1 = perfectly elastic). */
|
|
18
|
+
this.restitution = 0.5;
|
|
19
|
+
/** Resistance to sliding. */
|
|
20
|
+
this.friction = 0.2;
|
|
17
21
|
}
|
|
18
22
|
}
|
|
19
23
|
//# sourceMappingURL=PhysicsComponent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsComponent.js","sourceRoot":"","sources":["../src/PhysicsComponent.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IAAvD;;QACE,6CAA6C;QAC7C,aAAQ,GAAY,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,yDAAyD;QACzD,iBAAY,GAAY,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,wDAAwD;QACxD,SAAI,GAAW,CAAC,CAAC;QACjB,qDAAqD;QACrD,aAAQ,GAAY,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"PhysicsComponent.js","sourceRoot":"","sources":["../src/PhysicsComponent.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IAAvD;;QACE,6CAA6C;QAC7C,aAAQ,GAAY,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,yDAAyD;QACzD,iBAAY,GAAY,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,wDAAwD;QACxD,SAAI,GAAW,CAAC,CAAC;QACjB,qDAAqD;QACrD,aAAQ,GAAY,KAAK,CAAC;QAC1B,uEAAuE;QACvE,gBAAW,GAAW,GAAG,CAAC;QAC1B,6BAA6B;QAC7B,aAAQ,GAAW,GAAG,CAAC;IACzB,CAAC;CAAA"}
|
|
@@ -3,8 +3,6 @@ import Component from './Component.js';
|
|
|
3
3
|
* Base class for all rendering-related components.
|
|
4
4
|
*/
|
|
5
5
|
export default abstract class RenderComponent extends Component {
|
|
6
|
-
/** Internal flag to identify rendering components across module instances. */
|
|
7
|
-
readonly isRenderComponent: boolean;
|
|
8
6
|
/**
|
|
9
7
|
* The actual rendering logic.
|
|
10
8
|
* @param ctx The canvas 2D rendering context.
|
package/dist/RenderComponent.js
CHANGED
|
@@ -3,10 +3,5 @@ import Component from './Component.js';
|
|
|
3
3
|
* Base class for all rendering-related components.
|
|
4
4
|
*/
|
|
5
5
|
export default class RenderComponent extends Component {
|
|
6
|
-
constructor() {
|
|
7
|
-
super(...arguments);
|
|
8
|
-
/** Internal flag to identify rendering components across module instances. */
|
|
9
|
-
this.isRenderComponent = true;
|
|
10
|
-
}
|
|
11
6
|
}
|
|
12
7
|
//# sourceMappingURL=RenderComponent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderComponent.js","sourceRoot":"","sources":["../src/RenderComponent.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,OAAO,OAAgB,eAAgB,SAAQ,SAAS;
|
|
1
|
+
{"version":3,"file":"RenderComponent.js","sourceRoot":"","sources":["../src/RenderComponent.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,OAAO,OAAgB,eAAgB,SAAQ,SAAS;CAM9D"}
|
package/dist/Vector2.d.ts
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple 2D vector interface.
|
|
3
|
-
*/
|
|
4
|
-
export interface Vector2 {
|
|
5
|
-
/** X coordinate. */
|
|
6
|
-
x: number;
|
|
7
|
-
/** Y coordinate. */
|
|
8
|
-
y: number;
|
|
9
|
-
}
|
|
10
1
|
/**
|
|
11
2
|
* Class representing a 2D vector or point.
|
|
12
3
|
*/
|
|
13
|
-
export default class
|
|
4
|
+
export default class Vector2 {
|
|
14
5
|
/** X coordinate. */
|
|
15
6
|
x: number;
|
|
16
7
|
/** Y coordinate. */
|
|
@@ -23,4 +14,22 @@ export default class implements Vector2 {
|
|
|
23
14
|
* @returns The distance between v1 and v2.
|
|
24
15
|
*/
|
|
25
16
|
static distance(v1: Vector2, v2: Vector2): number;
|
|
17
|
+
/**
|
|
18
|
+
* Calculates the dot product of two vectors.
|
|
19
|
+
* @param v1 First vector.
|
|
20
|
+
* @param v2 Second vector.
|
|
21
|
+
*/
|
|
22
|
+
static dot(v1: Vector2, v2: Vector2): number;
|
|
23
|
+
/** Returns the length of the vector. */
|
|
24
|
+
get magnitude(): number;
|
|
25
|
+
/** Returns a new normalized (unit length) version of this vector. */
|
|
26
|
+
get normalized(): Vector2;
|
|
27
|
+
/** Adds another vector to this one. */
|
|
28
|
+
add(other: Vector2): Vector2;
|
|
29
|
+
/** Subtracts another vector from this one. */
|
|
30
|
+
subtract(other: Vector2): Vector2;
|
|
31
|
+
/** Multiplies this vector by a scalar. */
|
|
32
|
+
multiply(scalar: number): Vector2;
|
|
33
|
+
/** Returns a copy of this vector. */
|
|
34
|
+
clone(): Vector2;
|
|
26
35
|
}
|
package/dist/Vector2.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Class representing a 2D vector or point.
|
|
3
3
|
*/
|
|
4
|
-
export default class {
|
|
4
|
+
export default class Vector2 {
|
|
5
5
|
constructor(x = 0, y = 0) {
|
|
6
6
|
this.x = x;
|
|
7
7
|
this.y = y;
|
|
@@ -17,5 +17,46 @@ export default class {
|
|
|
17
17
|
const dy = v1.y - v2.y;
|
|
18
18
|
return Math.sqrt(dx * dx + dy * dy);
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculates the dot product of two vectors.
|
|
22
|
+
* @param v1 First vector.
|
|
23
|
+
* @param v2 Second vector.
|
|
24
|
+
*/
|
|
25
|
+
static dot(v1, v2) {
|
|
26
|
+
return v1.x * v2.x + v1.y * v2.y;
|
|
27
|
+
}
|
|
28
|
+
/** Returns the length of the vector. */
|
|
29
|
+
get magnitude() {
|
|
30
|
+
return Math.sqrt(this.x * this.x + this.y * this.y);
|
|
31
|
+
}
|
|
32
|
+
/** Returns a new normalized (unit length) version of this vector. */
|
|
33
|
+
get normalized() {
|
|
34
|
+
const mag = this.magnitude;
|
|
35
|
+
if (mag === 0)
|
|
36
|
+
return new Vector2(0, 0);
|
|
37
|
+
return new Vector2(this.x / mag, this.y / mag);
|
|
38
|
+
}
|
|
39
|
+
/** Adds another vector to this one. */
|
|
40
|
+
add(other) {
|
|
41
|
+
this.x += other.x;
|
|
42
|
+
this.y += other.y;
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
/** Subtracts another vector from this one. */
|
|
46
|
+
subtract(other) {
|
|
47
|
+
this.x -= other.x;
|
|
48
|
+
this.y -= other.y;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
/** Multiplies this vector by a scalar. */
|
|
52
|
+
multiply(scalar) {
|
|
53
|
+
this.x *= scalar;
|
|
54
|
+
this.y *= scalar;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
/** Returns a copy of this vector. */
|
|
58
|
+
clone() {
|
|
59
|
+
return new Vector2(this.x, this.y);
|
|
60
|
+
}
|
|
20
61
|
}
|
|
21
62
|
//# sourceMappingURL=Vector2.js.map
|
package/dist/Vector2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Vector2.js","sourceRoot":"","sources":["../src/Vector2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Vector2.js","sourceRoot":"","sources":["../src/Vector2.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAM1B,YAAY,IAAY,CAAC,EAAE,IAAY,CAAC;QACtC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAW,EAAE,EAAW;QACtC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,EAAW,EAAE,EAAW;QACjC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,wCAAwC;IACxC,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,qEAAqE;IACrE,IAAI,UAAU;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3B,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,uCAAuC;IACvC,GAAG,CAAC,KAAc;QAChB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8CAA8C;IAC9C,QAAQ,CAAC,KAAc;QACrB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;QACjB,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,KAAK;QACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;CACF"}
|