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.
@@ -52,12 +52,15 @@ export default class GameObject {
52
52
  * @param component The component to add.
53
53
  */
54
54
  addComponent(component) {
55
- const key = component.constructor.name;
56
- this._components.set(key, component);
57
- // Also index by RenderComponent if it is one, to allow abstract querying.
58
- // Use flag instead of instanceof to work across potential module duplications.
59
- if (component.isRenderComponent) {
60
- this._components.set('RenderComponent', component);
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._components.delete(componentClass.name);
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.
@@ -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,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAErC,0EAA0E;QAC1E,+EAA+E;QAC/E,IAAK,SAAwD,CAAC,iBAAiB,EAAE,CAAC;YAChF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAsB,cAA+C;QAClF,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,sEAAsE;IACtE,YAAY,CAAsB,cAA4C;QAC5E,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,sEAAsE;IACtE,YAAY,CAAsB,cAA4C;QAC5E,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAM,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
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
- * Checks if two game objects are colliding and resolves it if not static.
10
- * @param obj1 First object.
11
- * @param obj2 Second object.
12
- * @returns True if the objects are colliding.
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
- * Checks if two game objects are colliding and resolves it if not static.
12
- * @param obj1 First object.
13
- * @param obj2 Second object.
14
- * @returns True if the objects are colliding.
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
- const c1 = obj1;
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 rectWidth = (_b = (_a = rect.bounds) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0;
30
- const rectHeight = (_d = (_c = rect.bounds) === null || _c === void 0 ? void 0 : _c.height) !== null && _d !== void 0 ? _d : 0;
31
- const closestX = Math.max(rect.transform.position.x, Math.min(circle.center.x, rect.transform.position.x + rectWidth));
32
- const closestY = Math.max(rect.transform.position.y, Math.min(circle.center.y, rect.transform.position.y + rectHeight));
33
- isColliding = Vector2.distance(circle.center, new Vector2(closestX, closestY)) < circle.radius;
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
- const w1 = (_f = (_e = obj1.bounds) === null || _e === void 0 ? void 0 : _e.width) !== null && _f !== void 0 ? _f : 0;
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 resolveCollision(obj1, obj2, obj1Static, obj2Static) {
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
- // Calculate overlap
59
- const overlapX = Math.min(obj1.transform.position.x + w1 - obj2.transform.position.x, obj2.transform.position.x + w2 - obj1.transform.position.x);
60
- const overlapY = Math.min(obj1.transform.position.y + h1 - obj2.transform.position.y, obj2.transform.position.y + h2 - obj1.transform.position.y);
61
- // Push apart
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
- if (obj1.transform.position.x < obj2.transform.position.x) {
64
- if (!obj1Static)
65
- obj1.transform.position.x -= overlapX / 2;
66
- if (!obj2Static)
67
- obj2.transform.position.x += overlapX / 2;
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
- if (obj1.transform.position.y < obj2.transform.position.y) {
78
- if (!obj1Static)
79
- obj1.transform.position.y -= overlapY / 2;
80
- if (!obj2Static)
81
- obj2.transform.position.y += overlapY / 2;
82
- }
83
- else {
84
- if (!obj1Static)
85
- obj1.transform.position.y += overlapY / 2;
86
- if (!obj2Static)
87
- obj2.transform.position.y -= overlapY / 2;
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
  }
@@ -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;AAErD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC1B;;;;;;;QAOI;IACH,MAAM,CAAC,cAAc,CAAC,IAAgB,EAAE,IAAgB;;QACtD,MAAM,SAAS,GAAG,IAAI,YAAY,MAAM,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,YAAY,MAAM,CAAC;QACzC,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,IAAc,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAc,CAAC;YAC1B,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QAC/E,CAAC;aAAM,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAW,CAAC;YACnD,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,mCAAI,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,mCAAI,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;YACvH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;YACxH,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACjG,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,mCAAI,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,mCAAI,CAAC,CAAC;YACpC,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,mCAAI,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,mCAAI,CAAC,CAAC;YACpC,WAAW,GAAG,CACZ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE;gBAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE;gBAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAC3D,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAA,MAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,0CAAE,QAAQ,mCAAI,KAAK,CAAC;QAC1E,MAAM,UAAU,GAAG,MAAA,MAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,0CAAE,QAAQ,mCAAI,KAAK,CAAC;QAE1E,IAAI,WAAW,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IACM,MAAM,CAAC,gBAAgB,CAAC,IAAgB,EAAE,IAAgB,EAAE,UAAmB,EAAE,UAAmB;;QAC1G,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,mCAAI,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,mCAAI,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,mCAAI,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,mCAAI,CAAC,CAAC;QAEpC,oBAAoB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAC3D,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAC3D,CAAC;QAEF,aAAa;QACb,IAAI,QAAQ,GAAG,QAAQ,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;gBAC3D,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;gBAC3D,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;gBAC3D,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;gBAC3D,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
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
  }
@@ -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;IAC5B,CAAC;CAAA"}
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.
@@ -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;IAA/D;;QACE,8EAA8E;QAC9D,sBAAiB,GAAY,IAAI,CAAC;IAOpD,CAAC;CAAA"}
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 implements Vector2 {
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
@@ -1 +1 @@
1
- {"version":3,"file":"Vector2.js","sourceRoot":"","sources":["../src/Vector2.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,CAAC,OAAO;IAMZ,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;CACF"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dino-ge",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "Lightweight, performant 2D game engine built with TypeScript",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",