sliver-engine 0.0.1-alpha-4

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.
Files changed (178) hide show
  1. package/README.md +37 -0
  2. package/dist/Assets/Shapes/Arrow.d.ts +12 -0
  3. package/dist/Assets/Shapes/Arrow.d.ts.map +1 -0
  4. package/dist/Assets/Shapes/Arrow.js +32 -0
  5. package/dist/Assets/Shapes/Arrow.js.map +1 -0
  6. package/dist/Assets/Shapes/index.d.ts +4 -0
  7. package/dist/Assets/Shapes/index.d.ts.map +1 -0
  8. package/dist/Assets/Shapes/index.js +2 -0
  9. package/dist/Assets/Shapes/index.js.map +1 -0
  10. package/dist/CanvasController/SpriteLibrary.d.ts +58 -0
  11. package/dist/CanvasController/SpriteLibrary.d.ts.map +1 -0
  12. package/dist/CanvasController/SpriteLibrary.js +412 -0
  13. package/dist/CanvasController/SpriteLibrary.js.map +1 -0
  14. package/dist/CanvasController/Transformations.d.ts +5 -0
  15. package/dist/CanvasController/Transformations.d.ts.map +1 -0
  16. package/dist/CanvasController/Transformations.js +19 -0
  17. package/dist/CanvasController/Transformations.js.map +1 -0
  18. package/dist/CanvasController/index.d.ts +238 -0
  19. package/dist/CanvasController/index.d.ts.map +1 -0
  20. package/dist/CanvasController/index.js +418 -0
  21. package/dist/CanvasController/index.js.map +1 -0
  22. package/dist/Context/index.d.ts +53 -0
  23. package/dist/Context/index.d.ts.map +1 -0
  24. package/dist/Context/index.js +103 -0
  25. package/dist/Context/index.js.map +1 -0
  26. package/dist/Events/decorators.d.ts +74 -0
  27. package/dist/Events/decorators.d.ts.map +1 -0
  28. package/dist/Events/decorators.js +417 -0
  29. package/dist/Events/decorators.js.map +1 -0
  30. package/dist/Events/index.d.ts +50 -0
  31. package/dist/Events/index.d.ts.map +1 -0
  32. package/dist/Events/index.js +73 -0
  33. package/dist/Events/index.js.map +1 -0
  34. package/dist/Events/keyAccumulator.d.ts +9 -0
  35. package/dist/Events/keyAccumulator.d.ts.map +1 -0
  36. package/dist/Events/keyAccumulator.js +17 -0
  37. package/dist/Events/keyAccumulator.js.map +1 -0
  38. package/dist/Game/Saves/index.d.ts +39 -0
  39. package/dist/Game/Saves/index.d.ts.map +1 -0
  40. package/dist/Game/Saves/index.js +213 -0
  41. package/dist/Game/Saves/index.js.map +1 -0
  42. package/dist/Game/index.d.ts +45 -0
  43. package/dist/Game/index.d.ts.map +1 -0
  44. package/dist/Game/index.js +101 -0
  45. package/dist/Game/index.js.map +1 -0
  46. package/dist/GameObject/Decorators/index.d.ts +81 -0
  47. package/dist/GameObject/Decorators/index.d.ts.map +1 -0
  48. package/dist/GameObject/Decorators/index.js +183 -0
  49. package/dist/GameObject/Decorators/index.js.map +1 -0
  50. package/dist/GameObject/Hitboxes/ColisionHandler.d.ts +23 -0
  51. package/dist/GameObject/Hitboxes/ColisionHandler.d.ts.map +1 -0
  52. package/dist/GameObject/Hitboxes/ColisionHandler.js +458 -0
  53. package/dist/GameObject/Hitboxes/ColisionHandler.js.map +1 -0
  54. package/dist/GameObject/Hitboxes/index.d.ts +50 -0
  55. package/dist/GameObject/Hitboxes/index.d.ts.map +1 -0
  56. package/dist/GameObject/Hitboxes/index.js +306 -0
  57. package/dist/GameObject/Hitboxes/index.js.map +1 -0
  58. package/dist/GameObject/Library/Button.d.ts +15 -0
  59. package/dist/GameObject/Library/Button.d.ts.map +1 -0
  60. package/dist/GameObject/Library/Button.js +45 -0
  61. package/dist/GameObject/Library/Button.js.map +1 -0
  62. package/dist/GameObject/Library/Clickableshape.d.ts +14 -0
  63. package/dist/GameObject/Library/Clickableshape.d.ts.map +1 -0
  64. package/dist/GameObject/Library/Clickableshape.js +36 -0
  65. package/dist/GameObject/Library/Clickableshape.js.map +1 -0
  66. package/dist/GameObject/Library/FloatingView.d.ts +20 -0
  67. package/dist/GameObject/Library/FloatingView.d.ts.map +1 -0
  68. package/dist/GameObject/Library/FloatingView.js +39 -0
  69. package/dist/GameObject/Library/FloatingView.js.map +1 -0
  70. package/dist/GameObject/Library/Group.d.ts +8 -0
  71. package/dist/GameObject/Library/Group.d.ts.map +1 -0
  72. package/dist/GameObject/Library/Group.js +26 -0
  73. package/dist/GameObject/Library/Group.js.map +1 -0
  74. package/dist/GameObject/Library/HoverableShape.d.ts +15 -0
  75. package/dist/GameObject/Library/HoverableShape.d.ts.map +1 -0
  76. package/dist/GameObject/Library/HoverableShape.js +41 -0
  77. package/dist/GameObject/Library/HoverableShape.js.map +1 -0
  78. package/dist/GameObject/Library/SceneTranslator.d.ts +14 -0
  79. package/dist/GameObject/Library/SceneTranslator.d.ts.map +1 -0
  80. package/dist/GameObject/Library/SceneTranslator.js +104 -0
  81. package/dist/GameObject/Library/SceneTranslator.js.map +1 -0
  82. package/dist/GameObject/Library/ScrollView.d.ts +41 -0
  83. package/dist/GameObject/Library/ScrollView.d.ts.map +1 -0
  84. package/dist/GameObject/Library/ScrollView.js +112 -0
  85. package/dist/GameObject/Library/ScrollView.js.map +1 -0
  86. package/dist/GameObject/Library/ShowOnHover.d.ts +13 -0
  87. package/dist/GameObject/Library/ShowOnHover.d.ts.map +1 -0
  88. package/dist/GameObject/Library/ShowOnHover.js +33 -0
  89. package/dist/GameObject/Library/ShowOnHover.js.map +1 -0
  90. package/dist/GameObject/Library/Text.d.ts +25 -0
  91. package/dist/GameObject/Library/Text.d.ts.map +1 -0
  92. package/dist/GameObject/Library/Text.js +35 -0
  93. package/dist/GameObject/Library/Text.js.map +1 -0
  94. package/dist/GameObject/Library/TextBox.d.ts +45 -0
  95. package/dist/GameObject/Library/TextBox.d.ts.map +1 -0
  96. package/dist/GameObject/Library/TextBox.js +170 -0
  97. package/dist/GameObject/Library/TextBox.js.map +1 -0
  98. package/dist/GameObject/Library/index.d.ts +11 -0
  99. package/dist/GameObject/Library/index.d.ts.map +1 -0
  100. package/dist/GameObject/Library/index.js +11 -0
  101. package/dist/GameObject/Library/index.js.map +1 -0
  102. package/dist/GameObject/Walker.d.ts +91 -0
  103. package/dist/GameObject/Walker.d.ts.map +1 -0
  104. package/dist/GameObject/Walker.js +634 -0
  105. package/dist/GameObject/Walker.js.map +1 -0
  106. package/dist/GameObject/index.d.ts +97 -0
  107. package/dist/GameObject/index.d.ts.map +1 -0
  108. package/dist/GameObject/index.js +386 -0
  109. package/dist/GameObject/index.js.map +1 -0
  110. package/dist/Lib/Math.d.ts +2 -0
  111. package/dist/Lib/Math.d.ts.map +1 -0
  112. package/dist/Lib/Math.js +4 -0
  113. package/dist/Lib/Math.js.map +1 -0
  114. package/dist/Lib/MinHeap/index.d.ts +12 -0
  115. package/dist/Lib/MinHeap/index.d.ts.map +1 -0
  116. package/dist/Lib/MinHeap/index.js +64 -0
  117. package/dist/Lib/MinHeap/index.js.map +1 -0
  118. package/dist/Lib/Mixins/index.d.ts +8 -0
  119. package/dist/Lib/Mixins/index.d.ts.map +1 -0
  120. package/dist/Lib/Mixins/index.js +45 -0
  121. package/dist/Lib/Mixins/index.js.map +1 -0
  122. package/dist/Lib/PathfindingProxy/index.d.ts +16 -0
  123. package/dist/Lib/PathfindingProxy/index.d.ts.map +1 -0
  124. package/dist/Lib/PathfindingProxy/index.js +48 -0
  125. package/dist/Lib/PathfindingProxy/index.js.map +1 -0
  126. package/dist/Lib/Vector/index.d.ts +24 -0
  127. package/dist/Lib/Vector/index.d.ts.map +1 -0
  128. package/dist/Lib/Vector/index.js +94 -0
  129. package/dist/Lib/Vector/index.js.map +1 -0
  130. package/dist/Lib/index.d.ts +6 -0
  131. package/dist/Lib/index.d.ts.map +1 -0
  132. package/dist/Lib/index.js +6 -0
  133. package/dist/Lib/index.js.map +1 -0
  134. package/dist/Scenes/SceneManager/Transitions.d.ts +37 -0
  135. package/dist/Scenes/SceneManager/Transitions.d.ts.map +1 -0
  136. package/dist/Scenes/SceneManager/Transitions.js +165 -0
  137. package/dist/Scenes/SceneManager/Transitions.js.map +1 -0
  138. package/dist/Scenes/SceneManager/index.d.ts +24 -0
  139. package/dist/Scenes/SceneManager/index.d.ts.map +1 -0
  140. package/dist/Scenes/SceneManager/index.js +151 -0
  141. package/dist/Scenes/SceneManager/index.js.map +1 -0
  142. package/dist/Scenes/index.d.ts +44 -0
  143. package/dist/Scenes/index.d.ts.map +1 -0
  144. package/dist/Scenes/index.js +252 -0
  145. package/dist/Scenes/index.js.map +1 -0
  146. package/dist/ScriptedEvents/Combinators/index.d.ts +17 -0
  147. package/dist/ScriptedEvents/Combinators/index.d.ts.map +1 -0
  148. package/dist/ScriptedEvents/Combinators/index.js +127 -0
  149. package/dist/ScriptedEvents/Combinators/index.js.map +1 -0
  150. package/dist/ScriptedEvents/Library/TextBoxSequence.d.ts +7 -0
  151. package/dist/ScriptedEvents/Library/TextBoxSequence.d.ts.map +1 -0
  152. package/dist/ScriptedEvents/Library/TextBoxSequence.js +16 -0
  153. package/dist/ScriptedEvents/Library/TextBoxSequence.js.map +1 -0
  154. package/dist/ScriptedEvents/Library/WaitForKeyPress.d.ts +2 -0
  155. package/dist/ScriptedEvents/Library/WaitForKeyPress.d.ts.map +1 -0
  156. package/dist/ScriptedEvents/Library/WaitForKeyPress.js +1 -0
  157. package/dist/ScriptedEvents/Library/WaitForKeyPress.js.map +1 -0
  158. package/dist/ScriptedEvents/Library/WalkCharacter.d.ts +4 -0
  159. package/dist/ScriptedEvents/Library/WalkCharacter.d.ts.map +1 -0
  160. package/dist/ScriptedEvents/Library/WalkCharacter.js +14 -0
  161. package/dist/ScriptedEvents/Library/WalkCharacter.js.map +1 -0
  162. package/dist/ScriptedEvents/Library/index.d.ts +3 -0
  163. package/dist/ScriptedEvents/Library/index.d.ts.map +1 -0
  164. package/dist/ScriptedEvents/Library/index.js +3 -0
  165. package/dist/ScriptedEvents/Library/index.js.map +1 -0
  166. package/dist/ScriptedEvents/index.d.ts +42 -0
  167. package/dist/ScriptedEvents/index.d.ts.map +1 -0
  168. package/dist/ScriptedEvents/index.js +61 -0
  169. package/dist/ScriptedEvents/index.js.map +1 -0
  170. package/dist/SoundManager/index.d.ts +69 -0
  171. package/dist/SoundManager/index.d.ts.map +1 -0
  172. package/dist/SoundManager/index.js +208 -0
  173. package/dist/SoundManager/index.js.map +1 -0
  174. package/dist/index.d.ts +19 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +19 -0
  177. package/dist/index.js.map +1 -0
  178. package/package.json +36 -0
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Sliver Engine
2
+
3
+ Pre-alpha TypeScript/HTML5 Canvas 2D game engine.
4
+
5
+ Official documentation: https://sliver-engine.gramont.digital
6
+
7
+ ## Engine features (Sliver Engine)
8
+
9
+ - **Game loop + context**: tick/render split, configurable TPS, shared `GameContext`, message bus, and key state.
10
+ - **Scenes + transitions**: scene stack, camera offset, gravity, background/overlay, and built-in transitions.
11
+ - **Rendering**: canvas primitives, text, sprites/sprite-sheets, animation helpers, clipping, rotation, and font loading.
12
+ - **Input/events**: keyboard + mouse + wheel events with decorators (`@onClick`, `@onClickAnywhere`, `@onHover`, `@onKeyPressed`, `@grabbable`, ...).
13
+ - **Game objects**: `GameObject` base, tick/render hooks, child hierarchy, movement via `speed`, and scene/message helpers.
14
+ - **Walker**: waypoint movement with optional obstacle-avoidance pathfinding.
15
+ - **Physics + collisions**: gravity, restitution, friction, immovable bodies, and circle/rotated-square hitboxes.
16
+ - **Scripted events**: composable async sequences (`sequenceOf`, `parallel`, `waitUntil`, `waitTicks`, `waitForKeyPress`, ...).
17
+ - **Saves**: localStorage-backed saves with load hooks.
18
+ - **Audio**: `SoundManager` with preload, volume, looping, playback-rate, and timing controls.
19
+ - **Reusable widgets**: `Button`, `Text`, `TextBox`, `ScrollView`, `FloatingView`, `Group`, and shape helpers.
20
+ - **Mixins**: method decorators for before/after/replace composition.
21
+
22
+ ## Running locally
23
+
24
+ 1. Install deps: `bun install`
25
+ 2. Typecheck: `bun run typecheck`
26
+ 3. Build: `bun run build`
27
+ 4. Debug sandbox (Parcel): `bun run debug:start` (served from `src/DebugGame/`)
28
+
29
+ ## Documentation (Docusaurus)
30
+
31
+ You can check the documentation on repo or on https://sliver-engine.gramont.digital
32
+
33
+ ## Notes
34
+
35
+ - Browser-only (DOM + Canvas + Web Audio).
36
+ - Tooling uses Bun (TypeScript 5).
37
+ - If you use the decorator helpers, enable `experimentalDecorators: true` in your TS config.
@@ -0,0 +1,12 @@
1
+ import type { ShapeRendererFn } from ".";
2
+ import type { Vector } from "../../Lib/Vector";
3
+ export declare const renderArrow: (context: CanvasRenderingContext2D, position: Vector, size: Vector) => void;
4
+ export declare const renderChevron: (context: CanvasRenderingContext2D, position: Vector, size: Vector) => void;
5
+ export type ShapeRenderOptions = {
6
+ strokeWidth?: number;
7
+ color?: string;
8
+ lineCap?: CanvasLineCap;
9
+ lineJoin?: CanvasLineJoin;
10
+ };
11
+ export declare const shapeWithParams: (shape: ShapeRendererFn, options?: ShapeRenderOptions) => ShapeRendererFn;
12
+ //# sourceMappingURL=Arrow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Arrow.d.ts","sourceRoot":"","sources":["../../../src/Assets/Shapes/Arrow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,GAAG,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,eAAO,MAAM,WAAW,GACtB,SAAS,wBAAwB,EACjC,UAAU,MAAM,EAChB,MAAM,MAAM,SAab,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,SAAS,wBAAwB,EACjC,UAAU,MAAM,EAChB,MAAM,MAAM,SAWb,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,eAAe,GACzB,OAAO,eAAe,EAAE,UAAS,kBAAuB,KAAG,eAS3D,CAAC"}
@@ -0,0 +1,32 @@
1
+ export const renderArrow = (context, position, size) => {
2
+ const centerX = position.x + size.x / 2;
3
+ const centerY = position.y + size.y / 2;
4
+ context.beginPath();
5
+ context.moveTo(centerX - size.x / 2, centerY);
6
+ context.lineTo(centerX + size.x / 2, centerY);
7
+ context.lineTo(centerX + size.x / 2 - size.x * 0.1, centerY - size.y * 0.1);
8
+ context.moveTo(centerX + size.x / 2, centerY);
9
+ context.lineTo(centerX + size.x / 2 - size.x * 0.1, centerY + size.y * 0.1);
10
+ context.stroke();
11
+ context.closePath();
12
+ };
13
+ export const renderChevron = (context, position, size) => {
14
+ const centerX = position.x + size.x / 2;
15
+ const centerY = position.y + size.y / 2;
16
+ context.beginPath();
17
+ context.moveTo(centerX - size.x / 2, centerY - size.y / 2);
18
+ context.lineTo(centerX, centerY);
19
+ context.lineTo(centerX - size.x / 2, centerY + size.y / 2);
20
+ context.stroke();
21
+ context.closePath();
22
+ };
23
+ export const shapeWithParams = (shape, options = {}) => (context, position, size) => {
24
+ context.save();
25
+ context.lineWidth = options.strokeWidth || 2;
26
+ context.strokeStyle = options.color || "black";
27
+ context.lineCap = options.lineCap || "round";
28
+ context.lineJoin = options.lineJoin || "round";
29
+ shape(context, position, size);
30
+ context.restore();
31
+ };
32
+ //# sourceMappingURL=Arrow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Arrow.js","sourceRoot":"","sources":["../../../src/Assets/Shapes/Arrow.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,OAAiC,EACjC,QAAgB,EAChB,IAAY,EACZ,EAAE;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,CAAC,SAAS,EAAE,CAAC;IACpB,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5E,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5E,OAAO,CAAC,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,SAAS,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAiC,EACjC,QAAgB,EAChB,IAAY,EACZ,EAAE;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,CAAC,SAAS,EAAE,CAAC;IACpB,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,SAAS,EAAE,CAAC;AACtB,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,eAAe,GAC1B,CAAC,KAAsB,EAAE,UAA8B,EAAE,EAAmB,EAAE,CAC9E,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAC1B,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IAC/C,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;IAC7C,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;IAC/C,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,OAAO,EAAE,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Vector } from "../../Lib/Vector";
2
+ export type ShapeRendererFn = (context: CanvasRenderingContext2D, position: Vector, size: Vector) => void;
3
+ export * from "./Arrow";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Assets/Shapes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,KACT,IAAI,CAAC;AAEV,cAAc,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./Arrow";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Assets/Shapes/index.ts"],"names":[],"mappings":"AAQA,cAAc,SAAS,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { Vector } from "../Lib/Vector";
2
+ type SpriteDefinition = {
3
+ kind: "rect";
4
+ sheetName: string;
5
+ topLeft: Vector;
6
+ bottomRight: Vector;
7
+ } | {
8
+ kind: "indexes";
9
+ sheetName: string;
10
+ indexes: (number | null)[][];
11
+ };
12
+ declare class SpriteLibrary {
13
+ private sprites;
14
+ private spriteSheets;
15
+ private spriteDefinitions;
16
+ private spriteDefinitionBitmaps;
17
+ loadSprite(name: string, url: URL): Promise<void>;
18
+ loadSvgSprite(name: string, url: string): Promise<void>;
19
+ /**
20
+ * Load a fixed size sprite sheet
21
+ */
22
+ loadSpriteSheet(name: string, url: URL, frameWidth: number, frameHeight: number): Promise<void>;
23
+ getSprite(name: string): HTMLImageElement | undefined;
24
+ loadSpriteDefinitionsFromJson(url: URL): Promise<void>;
25
+ loadSpriteDefinitions(payload: unknown): void;
26
+ defineSpriteFromSheet(name: string, sheetName: string, topLeft: Vector, bottomRight: Vector): void;
27
+ defineSpriteFromSheetIndexes(name: string, sheetName: string, indexes: (number | null)[][]): void;
28
+ getSpriteDefinition(name: string): SpriteDefinition | null;
29
+ getSpriteSheetFrameSize(sheetName: string): {
30
+ frameWidth: number;
31
+ frameHeight: number;
32
+ } | null;
33
+ /**
34
+ * Render a named sprite defined from a sprite sheet selection.
35
+ */
36
+ drawSpriteDefinition(ctx: CanvasRenderingContext2D, spriteName: string, position: Vector, scale?: number, mirrorHorizontal?: boolean, mirrorVertical?: boolean): void;
37
+ private ensureSpriteNameAvailable;
38
+ private bakeSpriteDefinitionBitmap;
39
+ private validateSpriteManifest;
40
+ private loadSpriteManifestEntry;
41
+ private requireSpriteSheet;
42
+ private parseGridPoint;
43
+ private parseTileId;
44
+ private parseTileIdOrNull;
45
+ private tileIdToGrid;
46
+ private gridToTileId;
47
+ /**
48
+ * Render the sprite frame by its index in the sheet
49
+ * Indexes grow from left to right, top to bottom
50
+ */
51
+ drawSpriteFrame(ctx: CanvasRenderingContext2D, sheetName: string, index: number, position: Vector, scale?: number, mirrorHorizontal?: boolean, mirrorVertical?: boolean): void;
52
+ /**
53
+ * Render a specific cell from the sprite sheet grid
54
+ */
55
+ drawSpriteGrid(ctx: CanvasRenderingContext2D, sheetName: string, col: number, row: number, position: Vector, scale?: number): void;
56
+ }
57
+ export { SpriteLibrary };
58
+ //# sourceMappingURL=SpriteLibrary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpriteLibrary.d.ts","sourceRoot":"","sources":["../../src/CanvasController/SpriteLibrary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,KAAK,gBAAgB,GACjB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC;AA6BN,cAAM,aAAa;IACjB,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,YAAY,CAQN;IACd,OAAO,CAAC,iBAAiB,CAA4C;IACrE,OAAO,CAAC,uBAAuB,CAA6C;IAEtE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB7D;;OAEG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAoBhB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI/C,6BAA6B,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQ7C,qBAAqB,CACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,IAAI;IAUP,4BAA4B,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,GAC3B,IAAI;IAsBP,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAkB1D,uBAAuB,CACrB,SAAS,EAAE,MAAM,GAChB;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMrD;;OAEG;IACH,oBAAoB,CAClB,GAAG,EAAE,wBAAwB,EAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAI,EACT,gBAAgB,UAAQ,EACxB,cAAc,UAAQ,GACrB,IAAI;IAwIP,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,0BAA0B;IA2ElC,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,uBAAuB;IA4F/B,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,eAAe,CACb,GAAG,EAAE,wBAAwB,EAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAI,EACT,gBAAgB,UAAQ,EACxB,cAAc,UAAQ,GACrB,IAAI;IAoDP;;OAEG;IACH,cAAc,CACZ,GAAG,EAAE,wBAAwB,EAC7B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAI,GACR,IAAI;CAuBR;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,412 @@
1
+ import { Vector } from "../Lib/Vector";
2
+ const isDrawable2DContext = (context) => !!context && "drawImage" in context;
3
+ class SpriteLibrary {
4
+ sprites = new Map();
5
+ spriteSheets = new Map();
6
+ spriteDefinitions = new Map();
7
+ spriteDefinitionBitmaps = new Map();
8
+ async loadSprite(name, url) {
9
+ return new Promise((resolve, reject) => {
10
+ const img = new Image();
11
+ img.onload = () => {
12
+ this.sprites.set(name, img);
13
+ resolve();
14
+ };
15
+ img.onerror = reject;
16
+ img.src = url.toString();
17
+ });
18
+ }
19
+ async loadSvgSprite(name, url) {
20
+ return new Promise((resolve, reject) => {
21
+ const img = new Image();
22
+ img.onload = () => {
23
+ this.sprites.set(name, img);
24
+ resolve();
25
+ };
26
+ img.onerror = reject;
27
+ fetch(url)
28
+ .then((response) => response.text())
29
+ .then((svgText) => {
30
+ const svgBlob = new Blob([svgText], { type: "image/svg+xml" });
31
+ const url = URL.createObjectURL(svgBlob);
32
+ img.src = url;
33
+ })
34
+ .catch(reject);
35
+ });
36
+ }
37
+ /**
38
+ * Load a fixed size sprite sheet
39
+ */
40
+ async loadSpriteSheet(name, url, frameWidth, frameHeight) {
41
+ return new Promise((resolve, reject) => {
42
+ const img = new Image();
43
+ img.onload = () => {
44
+ const columns = Math.floor(img.width / frameWidth);
45
+ this.spriteSheets.set(name, {
46
+ image: img,
47
+ frameWidth,
48
+ frameHeight,
49
+ columns,
50
+ });
51
+ resolve();
52
+ };
53
+ img.onerror = reject;
54
+ img.src = url.toString();
55
+ });
56
+ }
57
+ getSprite(name) {
58
+ return this.sprites.get(name);
59
+ }
60
+ async loadSpriteDefinitionsFromJson(url) {
61
+ const response = await fetch(url.toString());
62
+ if (!response.ok) {
63
+ throw new Error(`Failed to load sprite manifest "${url.toString()}": ${response.status} ${response.statusText}`);
64
+ }
65
+ const payload = (await response.json());
66
+ this.loadSpriteDefinitions(payload);
67
+ }
68
+ loadSpriteDefinitions(payload) {
69
+ const manifest = this.validateSpriteManifest(payload);
70
+ Object.entries(manifest.sprites).forEach(([name, entry]) => {
71
+ this.loadSpriteManifestEntry(name, entry);
72
+ });
73
+ }
74
+ defineSpriteFromSheet(name, sheetName, topLeft, bottomRight) {
75
+ this.ensureSpriteNameAvailable(name);
76
+ this.spriteDefinitions.set(name, {
77
+ kind: "rect",
78
+ sheetName,
79
+ topLeft: topLeft.clone(),
80
+ bottomRight: bottomRight.clone(),
81
+ });
82
+ }
83
+ defineSpriteFromSheetIndexes(name, sheetName, indexes) {
84
+ this.ensureSpriteNameAvailable(name);
85
+ const clonedIndexes = indexes.map((row) => row.slice());
86
+ this.spriteDefinitions.set(name, {
87
+ kind: "indexes",
88
+ sheetName,
89
+ indexes: clonedIndexes,
90
+ });
91
+ const sheet = this.spriteSheets.get(sheetName);
92
+ if (sheet) {
93
+ this.bakeSpriteDefinitionBitmap(name, {
94
+ kind: "indexes",
95
+ sheetName,
96
+ indexes: clonedIndexes,
97
+ }, sheet);
98
+ }
99
+ }
100
+ getSpriteDefinition(name) {
101
+ const definition = this.spriteDefinitions.get(name);
102
+ if (!definition)
103
+ return null;
104
+ if (definition.kind === "rect") {
105
+ return {
106
+ kind: "rect",
107
+ sheetName: definition.sheetName,
108
+ topLeft: definition.topLeft.clone(),
109
+ bottomRight: definition.bottomRight.clone(),
110
+ };
111
+ }
112
+ return {
113
+ kind: "indexes",
114
+ sheetName: definition.sheetName,
115
+ indexes: definition.indexes.map((row) => row.slice()),
116
+ };
117
+ }
118
+ getSpriteSheetFrameSize(sheetName) {
119
+ const sheet = this.spriteSheets.get(sheetName);
120
+ if (!sheet)
121
+ return null;
122
+ return { frameWidth: sheet.frameWidth, frameHeight: sheet.frameHeight };
123
+ }
124
+ /**
125
+ * Render a named sprite defined from a sprite sheet selection.
126
+ */
127
+ drawSpriteDefinition(ctx, spriteName, position, scale = 1, mirrorHorizontal = false, mirrorVertical = false) {
128
+ const definition = this.spriteDefinitions.get(spriteName);
129
+ if (!definition)
130
+ return;
131
+ const sheet = this.spriteSheets.get(definition.sheetName);
132
+ if (!sheet)
133
+ return;
134
+ const { image, frameWidth, frameHeight } = sheet;
135
+ if (definition.kind === "rect") {
136
+ const startCol = Math.min(definition.topLeft.x, definition.bottomRight.x);
137
+ const startRow = Math.min(definition.topLeft.y, definition.bottomRight.y);
138
+ const endCol = Math.max(definition.topLeft.x, definition.bottomRight.x);
139
+ const endRow = Math.max(definition.topLeft.y, definition.bottomRight.y);
140
+ const spriteWidth = (endCol - startCol + 1) * frameWidth;
141
+ const spriteHeight = (endRow - startRow + 1) * frameHeight;
142
+ const sx = startCol * frameWidth;
143
+ const sy = startRow * frameHeight;
144
+ ctx.imageSmoothingEnabled = false;
145
+ ctx.save();
146
+ if (mirrorHorizontal || mirrorVertical) {
147
+ const centerX = position.x + (spriteWidth * scale) / 2;
148
+ const centerY = position.y + (spriteHeight * scale) / 2;
149
+ ctx.translate(centerX, centerY);
150
+ if (mirrorHorizontal) {
151
+ ctx.scale(-1, 1);
152
+ }
153
+ if (mirrorVertical) {
154
+ ctx.scale(1, -1);
155
+ }
156
+ ctx.translate(-centerX, -centerY);
157
+ }
158
+ ctx.drawImage(image, sx, sy, spriteWidth, spriteHeight, position.x, position.y, spriteWidth * scale, spriteHeight * scale);
159
+ ctx.restore();
160
+ return;
161
+ }
162
+ const rowCount = definition.indexes.length;
163
+ const columnCount = Math.max(0, ...definition.indexes.map((row) => row.length));
164
+ const spriteWidth = columnCount * frameWidth;
165
+ const spriteHeight = rowCount * frameHeight;
166
+ ctx.imageSmoothingEnabled = false;
167
+ ctx.save();
168
+ if (mirrorHorizontal || mirrorVertical) {
169
+ const centerX = position.x + (spriteWidth * scale) / 2;
170
+ const centerY = position.y + (spriteHeight * scale) / 2;
171
+ ctx.translate(centerX, centerY);
172
+ if (mirrorHorizontal) {
173
+ ctx.scale(-1, 1);
174
+ }
175
+ if (mirrorVertical) {
176
+ ctx.scale(1, -1);
177
+ }
178
+ ctx.translate(-centerX, -centerY);
179
+ }
180
+ const baked = this.spriteDefinitionBitmaps.get(spriteName);
181
+ if (baked) {
182
+ ctx.drawImage(baked.bitmap, position.x, position.y, baked.size.x * scale, baked.size.y * scale);
183
+ ctx.restore();
184
+ return;
185
+ }
186
+ this.bakeSpriteDefinitionBitmap(spriteName, definition, sheet);
187
+ const bakedAfter = this.spriteDefinitionBitmaps.get(spriteName);
188
+ if (bakedAfter) {
189
+ ctx.drawImage(bakedAfter.bitmap, position.x, position.y, bakedAfter.size.x * scale, bakedAfter.size.y * scale);
190
+ ctx.restore();
191
+ return;
192
+ }
193
+ definition.indexes.forEach((row, rowIndex) => {
194
+ row.forEach((index, colIndex) => {
195
+ if (index === null || index < 0)
196
+ return;
197
+ const sx = (index % sheet.columns) * frameWidth;
198
+ const sy = Math.floor(index / sheet.columns) * frameHeight;
199
+ ctx.drawImage(image, sx, sy, frameWidth, frameHeight, position.x + colIndex * frameWidth * scale, position.y + rowIndex * frameHeight * scale, frameWidth * scale, frameHeight * scale);
200
+ });
201
+ });
202
+ ctx.restore();
203
+ }
204
+ ensureSpriteNameAvailable(name) {
205
+ if (this.sprites.has(name) || this.spriteDefinitions.has(name)) {
206
+ throw new Error(`Sprite name "${name}" is already in use.`);
207
+ }
208
+ }
209
+ bakeSpriteDefinitionBitmap(name, definition, sheet) {
210
+ if (this.spriteDefinitionBitmaps.has(name))
211
+ return;
212
+ const rowCount = definition.indexes.length;
213
+ const columnCount = Math.max(0, ...definition.indexes.map((row) => row.length));
214
+ if (rowCount <= 1 && columnCount <= 1)
215
+ return;
216
+ const width = columnCount * sheet.frameWidth;
217
+ const height = rowCount * sheet.frameHeight;
218
+ const canvas = typeof OffscreenCanvas !== "undefined"
219
+ ? new OffscreenCanvas(width, height)
220
+ : document.createElement("canvas");
221
+ if (!(canvas instanceof OffscreenCanvas)) {
222
+ canvas.width = width;
223
+ canvas.height = height;
224
+ }
225
+ const context = canvas.getContext("2d");
226
+ if (!isDrawable2DContext(context))
227
+ return;
228
+ context.imageSmoothingEnabled = false;
229
+ definition.indexes.forEach((row, rowIndex) => {
230
+ row.forEach((index, colIndex) => {
231
+ if (index === null || index < 0)
232
+ return;
233
+ const sx = (index % sheet.columns) * sheet.frameWidth;
234
+ const sy = Math.floor(index / sheet.columns) * sheet.frameHeight;
235
+ context.drawImage(sheet.image, sx, sy, sheet.frameWidth, sheet.frameHeight, colIndex * sheet.frameWidth, rowIndex * sheet.frameHeight, sheet.frameWidth, sheet.frameHeight);
236
+ });
237
+ });
238
+ if (canvas instanceof OffscreenCanvas &&
239
+ "transferToImageBitmap" in canvas) {
240
+ const bitmap = canvas.transferToImageBitmap();
241
+ this.spriteDefinitionBitmaps.set(name, {
242
+ bitmap,
243
+ size: new Vector(width, height),
244
+ });
245
+ return;
246
+ }
247
+ this.spriteDefinitionBitmaps.set(name, {
248
+ bitmap: canvas,
249
+ size: new Vector(width, height),
250
+ });
251
+ }
252
+ validateSpriteManifest(payload) {
253
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
254
+ throw new Error("Sprite manifest must be an object.");
255
+ }
256
+ const sprites = payload.sprites;
257
+ if (!sprites || typeof sprites !== "object" || Array.isArray(sprites)) {
258
+ throw new Error("Sprite manifest must include a 'sprites' object.");
259
+ }
260
+ return { sprites };
261
+ }
262
+ loadSpriteManifestEntry(name, entry) {
263
+ if (!entry || typeof entry !== "object") {
264
+ throw new Error(`Sprite "${name}" must be an object.`);
265
+ }
266
+ if (!entry.sheet || typeof entry.sheet !== "string") {
267
+ throw new Error(`Sprite "${name}" must define a sheet name.`);
268
+ }
269
+ const hasRect = !!entry.rect;
270
+ const hasGrid = !!entry.grid;
271
+ if (hasRect === hasGrid) {
272
+ throw new Error(`Sprite "${name}" must define exactly one of rect or grid.`);
273
+ }
274
+ if (entry.rect) {
275
+ const mode = entry.rect.mode ?? "grid";
276
+ if (mode !== "grid" && mode !== "id") {
277
+ throw new Error(`Sprite "${name}" rect mode must be "grid" or "id".`);
278
+ }
279
+ if (mode === "grid") {
280
+ const from = this.parseGridPoint(entry.rect.from, name, "rect.from");
281
+ const to = this.parseGridPoint(entry.rect.to, name, "rect.to");
282
+ this.defineSpriteFromSheet(name, entry.sheet, new Vector(from[0], from[1]), new Vector(to[0], to[1]));
283
+ return;
284
+ }
285
+ const fromId = this.parseTileId(entry.rect.from, name, "rect.from");
286
+ const toId = this.parseTileId(entry.rect.to, name, "rect.to");
287
+ const sheet = this.requireSpriteSheet(entry.sheet, name);
288
+ const from = this.tileIdToGrid(sheet.columns, fromId);
289
+ const to = this.tileIdToGrid(sheet.columns, toId);
290
+ this.defineSpriteFromSheet(name, entry.sheet, new Vector(from[0], from[1]), new Vector(to[0], to[1]));
291
+ return;
292
+ }
293
+ if (!entry.grid)
294
+ return;
295
+ const mode = entry.grid.mode ?? "id";
296
+ if (mode !== "grid" && mode !== "id") {
297
+ throw new Error(`Sprite "${name}" grid mode must be "grid" or "id".`);
298
+ }
299
+ if (!Array.isArray(entry.grid.tiles)) {
300
+ throw new Error(`Sprite "${name}" grid tiles must be a 2D array.`);
301
+ }
302
+ if (mode === "id") {
303
+ const tiles = entry.grid.tiles.map((row, rowIndex) => {
304
+ if (!Array.isArray(row)) {
305
+ throw new Error(`Sprite "${name}" grid row ${rowIndex} must be an array.`);
306
+ }
307
+ return row.map((tile, colIndex) => this.parseTileIdOrNull(tile, name, `grid.tiles[${rowIndex}][${colIndex}]`));
308
+ });
309
+ this.defineSpriteFromSheetIndexes(name, entry.sheet, tiles);
310
+ return;
311
+ }
312
+ const sheet = this.requireSpriteSheet(entry.sheet, name);
313
+ const tiles = entry.grid.tiles.map((row, rowIndex) => {
314
+ if (!Array.isArray(row)) {
315
+ throw new Error(`Sprite "${name}" grid row ${rowIndex} must be an array.`);
316
+ }
317
+ return row.map((tile, colIndex) => {
318
+ if (tile === null)
319
+ return null;
320
+ const point = this.parseGridPoint(tile, name, `grid.tiles[${rowIndex}][${colIndex}]`);
321
+ return this.gridToTileId(sheet.columns, point[0], point[1]);
322
+ });
323
+ });
324
+ this.defineSpriteFromSheetIndexes(name, entry.sheet, tiles);
325
+ }
326
+ requireSpriteSheet(sheetName, spriteName) {
327
+ const sheet = this.spriteSheets.get(sheetName);
328
+ if (!sheet) {
329
+ throw new Error(`Sprite "${spriteName}" references missing spritesheet "${sheetName}".`);
330
+ }
331
+ return sheet;
332
+ }
333
+ parseGridPoint(value, spriteName, fieldName) {
334
+ if (Array.isArray(value) &&
335
+ value.length === 2 &&
336
+ typeof value[0] === "number" &&
337
+ typeof value[1] === "number") {
338
+ return [value[0], value[1]];
339
+ }
340
+ throw new Error(`Sprite "${spriteName}" ${fieldName} must be [col, row].`);
341
+ }
342
+ parseTileId(value, spriteName, fieldName) {
343
+ if (typeof value === "number") {
344
+ return value;
345
+ }
346
+ throw new Error(`Sprite "${spriteName}" ${fieldName} must be a tile id.`);
347
+ }
348
+ parseTileIdOrNull(value, spriteName, fieldName) {
349
+ if (value === null)
350
+ return null;
351
+ if (typeof value === "number")
352
+ return value;
353
+ throw new Error(`Sprite "${spriteName}" ${fieldName} must be a tile id.`);
354
+ }
355
+ tileIdToGrid(columns, id) {
356
+ return [id % columns, Math.floor(id / columns)];
357
+ }
358
+ gridToTileId(columns, col, row) {
359
+ return row * columns + col;
360
+ }
361
+ /**
362
+ * Render the sprite frame by its index in the sheet
363
+ * Indexes grow from left to right, top to bottom
364
+ */
365
+ drawSpriteFrame(ctx, sheetName, index, position, scale = 1, mirrorHorizontal = false, mirrorVertical = false) {
366
+ const sheet = this.spriteSheets.get(sheetName);
367
+ if (!sheet)
368
+ return;
369
+ const { image, frameWidth, frameHeight, columns } = sheet;
370
+ const sx = (index % columns) * frameWidth;
371
+ const sy = Math.floor(index / columns) * frameHeight;
372
+ ctx.imageSmoothingEnabled = false; // nearest neighbor
373
+ // Save the current context state
374
+ ctx.save();
375
+ // Apply transformations if needed
376
+ if (mirrorHorizontal || mirrorVertical) {
377
+ // Calculate the center of the sprite
378
+ const centerX = position.x + (frameWidth * scale) / 2;
379
+ const centerY = position.y + (frameHeight * scale) / 2;
380
+ // Translate to the center of the sprite
381
+ ctx.translate(centerX, centerY);
382
+ // Apply mirroring
383
+ if (mirrorHorizontal) {
384
+ ctx.scale(-1, 1);
385
+ }
386
+ if (mirrorVertical) {
387
+ ctx.scale(1, -1);
388
+ }
389
+ // Translate back to the original position
390
+ ctx.translate(-centerX, -centerY);
391
+ }
392
+ // Draw the image with the applied transformations
393
+ ctx.drawImage(image, sx, sy, frameWidth, frameHeight, position.x, position.y, frameWidth * scale, frameHeight * scale);
394
+ // Restore the context state
395
+ ctx.restore();
396
+ }
397
+ /**
398
+ * Render a specific cell from the sprite sheet grid
399
+ */
400
+ drawSpriteGrid(ctx, sheetName, col, row, position, scale = 1) {
401
+ const sheet = this.spriteSheets.get(sheetName);
402
+ if (!sheet)
403
+ return;
404
+ const { image, frameWidth, frameHeight } = sheet;
405
+ const sx = col * frameWidth;
406
+ const sy = row * frameHeight;
407
+ ctx.imageSmoothingEnabled = false;
408
+ ctx.drawImage(image, sx, sy, frameWidth, frameHeight, position.x, position.y, frameWidth * scale, frameHeight * scale);
409
+ }
410
+ }
411
+ export { SpriteLibrary };
412
+ //# sourceMappingURL=SpriteLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpriteLibrary.js","sourceRoot":"","sources":["../../src/CanvasController/SpriteLibrary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ShapeRendererFn } from "../Assets/Shapes";
2
+ import type { Vector } from "../Lib/Vector";
3
+ export declare const withRotation: (angle: number, shape: ShapeRendererFn) => ShapeRendererFn;
4
+ export declare const withTranslation: (translationVector: Vector, shape: ShapeRendererFn) => ShapeRendererFn;
5
+ //# sourceMappingURL=Transformations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transformations.d.ts","sourceRoot":"","sources":["../../src/CanvasController/Transformations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,YAAY,GACvB,OAAO,MAAM,EACb,OAAO,eAAe,KACrB,eASF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,mBAAmB,MAAM,EACzB,OAAO,eAAe,KACrB,eAOF,CAAC"}
@@ -0,0 +1,19 @@
1
+ export const withRotation = (angle, shape) => {
2
+ return (ctx, position, size) => {
3
+ ctx.save();
4
+ ctx.translate(position.x + size.x / 2, position.y + size.y / 2);
5
+ ctx.rotate(angle);
6
+ ctx.translate(-(position.x + size.x / 2), -(position.y + size.y / 2));
7
+ shape(ctx, position, size);
8
+ ctx.restore();
9
+ };
10
+ };
11
+ export const withTranslation = (translationVector, shape) => {
12
+ return (ctx, position, size) => {
13
+ ctx.save();
14
+ ctx.translate(translationVector.x, translationVector.y);
15
+ shape(ctx, position, size);
16
+ ctx.restore();
17
+ };
18
+ };
19
+ //# sourceMappingURL=Transformations.js.map